annotate src/md5-util.c @ 9:d907d608745f

Sync to GQview 1.5.9 release. ######## DO NOT BASE ENHANCEMENTS OR TRANSLATION UPDATES ON CODE IN THIS CVS! This CVS is never up to date with current development and is provided solely for reference purposes, please use the latest official release package when making any changes or translation updates. ########
author gqview
date Sat, 26 Feb 2005 00:13:35 +0000
parents
children 04ff0df3ad2f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
2 * This code implements the MD5 message-digest algorithm.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
3 * The algorithm is due to Ron Rivest. This code was
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
4 * written by Colin Plumb in 1993, no copyright is claimed.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
5 * This code is in the public domain; do with it what you wish.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
6 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
7 * Equivalent code is available from RSA Data Security, Inc.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
8 * This code has been tested against that, and is equivalent,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
9 * except that you don't need to include two pages of legalese
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
10 * with every copy.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
11 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
12 * To compute the message digest of a chunk of bytes, declare an
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
13 * MD5Context structure, pass it to md5_init, call md5_update as
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
14 * needed on buffers full of bytes, and then call md5_Final, which
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
15 * will fill a supplied 16-byte array with the digest.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
16 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
17
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
18 /* parts of this file are :
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
19 * Written March 1993 by Branko Lankester
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
20 * Modified June 1993 by Colin Plumb for altered md5.c.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
21 * Modified October 1995 by Erik Troan for RPM
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
22 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
23
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
24 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
25 * Pulled from evolution for use in GQview, their version is nicely glib'ed
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
26 * GNOME CVS HEAD evolution/e-util/md5-utils.[ch] September 8, 2004
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
27 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
28
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
29
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
30 #include <stdio.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
31 #include <string.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
32 #include "md5-util.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
33
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
34 #include "ui_fileops.h" /* for utf-8 filename conversion */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
35
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
36
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
37 static void md5_transform (guint32 buf[4], const guint32 in[16]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
38
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
39 static gint _ie = 0x44332211;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
40 static union _endian { gint i; gchar b[4]; } *_endian = (union _endian *)&_ie;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
41 #define IS_BIG_ENDIAN() (_endian->b[0] == '\x44')
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
42 #define IS_LITTLE_ENDIAN() (_endian->b[0] == '\x11')
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
43
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
44
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
45 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
46 * Note: this code is harmless on little-endian machines.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
47 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
48 static void
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
49 _byte_reverse (guchar *buf, guint32 longs)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
50 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
51 guint32 t;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
52 do {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
53 t = (guint32) ((guint32) buf[3] << 8 | buf[2]) << 16 |
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
54 ((guint32) buf[1] << 8 | buf[0]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
55 *(guint32 *) buf = t;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
56 buf += 4;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
57 } while (--longs);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
58 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
59
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
60 /**
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
61 * md5_init: Initialise an md5 context object
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
62 * @ctx: md5 context
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
63 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
64 * Initialise an md5 buffer.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
65 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
66 **/
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
67 void
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
68 md5_init (MD5Context *ctx)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
69 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
70 ctx->buf[0] = 0x67452301;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
71 ctx->buf[1] = 0xefcdab89;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
72 ctx->buf[2] = 0x98badcfe;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
73 ctx->buf[3] = 0x10325476;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
74
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
75 ctx->bits[0] = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
76 ctx->bits[1] = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
77
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
78 if (IS_BIG_ENDIAN())
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
79 ctx->doByteReverse = 1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
80 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
81 ctx->doByteReverse = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
82 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
83
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
84
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
85
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
86 /**
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
87 * md5_update: add a buffer to md5 hash computation
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
88 * @ctx: conetxt object used for md5 computaion
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
89 * @buf: buffer to add
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
90 * @len: buffer length
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
91 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
92 * Update context to reflect the concatenation of another buffer full
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
93 * of bytes. Use this to progressively construct an md5 hash.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
94 **/
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
95 void
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
96 md5_update (MD5Context *ctx, const guchar *buf, guint32 len)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
97 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
98 guint32 t;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
99
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
100 /* Update bitcount */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
101
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
102 t = ctx->bits[0];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
103 if ((ctx->bits[0] = t + ((guint32) len << 3)) < t)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
104 ctx->bits[1]++; /* Carry from low to high */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
105 ctx->bits[1] += len >> 29;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
106
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
107 t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
108
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
109 /* Handle any leading odd-sized chunks */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
110
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
111 if (t) {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
112 guchar *p = (guchar *) ctx->in + t;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
113
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
114 t = 64 - t;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
115 if (len < t) {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
116 memcpy (p, buf, len);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
117 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
118 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
119 memcpy (p, buf, t);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
120 if (ctx->doByteReverse)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
121 _byte_reverse (ctx->in, 16);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
122 md5_transform (ctx->buf, (guint32 *) ctx->in);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
123 buf += t;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
124 len -= t;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
125 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
126 /* Process data in 64-byte chunks */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
127
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
128 while (len >= 64) {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
129 memcpy (ctx->in, buf, 64);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
130 if (ctx->doByteReverse)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
131 _byte_reverse (ctx->in, 16);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
132 md5_transform (ctx->buf, (guint32 *) ctx->in);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
133 buf += 64;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
134 len -= 64;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
135 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
136
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
137 /* Handle any remaining bytes of data. */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
138
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
139 memcpy (ctx->in, buf, len);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
140 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
141
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
142
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
143
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
144
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
145
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
146 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
147 * Final wrapup - pad to 64-byte boundary with the bit pattern
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
148 * 1 0* (64-bit count of bits processed, MSB-first)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
149 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
150 /**
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
151 * md5_final: copy the final md5 hash to a bufer
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
152 * @digest: 16 bytes buffer
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
153 * @ctx: context containing the calculated md5
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
154 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
155 * copy the final md5 hash to a bufer
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
156 **/
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
157 void
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
158 md5_final (MD5Context *ctx, guchar digest[16])
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
159 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
160 guint32 count;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
161 guchar *p;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
162
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
163 /* Compute number of bytes mod 64 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
164 count = (ctx->bits[0] >> 3) & 0x3F;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
165
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
166 /* Set the first char of padding to 0x80. This is safe since there is
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
167 always at least one byte free */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
168 p = ctx->in + count;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
169 *p++ = 0x80;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
170
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
171 /* Bytes of padding needed to make 64 bytes */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
172 count = 64 - 1 - count;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
173
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
174 /* Pad out to 56 mod 64 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
175 if (count < 8) {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
176 /* Two lots of padding: Pad the first block to 64 bytes */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
177 memset (p, 0, count);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
178 if (ctx->doByteReverse)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
179 _byte_reverse (ctx->in, 16);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
180 md5_transform (ctx->buf, (guint32 *) ctx->in);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
181
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
182 /* Now fill the next block with 56 bytes */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
183 memset (ctx->in, 0, 56);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
184 } else {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
185 /* Pad block to 56 bytes */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
186 memset (p, 0, count - 8);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
187 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
188 if (ctx->doByteReverse)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
189 _byte_reverse (ctx->in, 14);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
190
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
191 /* Append length in bits and transform */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
192 ((guint32 *) ctx->in)[14] = ctx->bits[0];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
193 ((guint32 *) ctx->in)[15] = ctx->bits[1];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
194
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
195 md5_transform (ctx->buf, (guint32 *) ctx->in);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
196 if (ctx->doByteReverse)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
197 _byte_reverse ((guchar *) ctx->buf, 4);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
198 memcpy (digest, ctx->buf, 16);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
199 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
200
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
201
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
202
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
203
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
204 /* The four core functions - F1 is optimized somewhat */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
205
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
206 /* #define F1(x, y, z) (x & y | ~x & z) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
207 #define F1(x, y, z) (z ^ (x & (y ^ z)))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
208 #define F2(x, y, z) F1(z, x, y)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
209 #define F3(x, y, z) (x ^ y ^ z)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
210 #define F4(x, y, z) (y ^ (x | ~z))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
211
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
212 /* This is the central step in the MD5 algorithm. */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
213 #define MD5STEP(f, w, x, y, z, data, s) \
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
214 ( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
215
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
216 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
217 * The core of the MD5 algorithm, this alters an existing MD5 hash to
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
218 * reflect the addition of 16 longwords of new data. md5_Update blocks
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
219 * the data and converts bytes into longwords for this routine.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
220 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
221 static void
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
222 md5_transform (guint32 buf[4], const guint32 in[16])
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
223 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
224 register guint32 a, b, c, d;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
225
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
226 a = buf[0];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
227 b = buf[1];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
228 c = buf[2];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
229 d = buf[3];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
230
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
231 MD5STEP (F1, a, b, c, d, in[0] + 0xd76aa478, 7);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
232 MD5STEP (F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
233 MD5STEP (F1, c, d, a, b, in[2] + 0x242070db, 17);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
234 MD5STEP (F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
235 MD5STEP (F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
236 MD5STEP (F1, d, a, b, c, in[5] + 0x4787c62a, 12);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
237 MD5STEP (F1, c, d, a, b, in[6] + 0xa8304613, 17);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
238 MD5STEP (F1, b, c, d, a, in[7] + 0xfd469501, 22);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
239 MD5STEP (F1, a, b, c, d, in[8] + 0x698098d8, 7);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
240 MD5STEP (F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
241 MD5STEP (F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
242 MD5STEP (F1, b, c, d, a, in[11] + 0x895cd7be, 22);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
243 MD5STEP (F1, a, b, c, d, in[12] + 0x6b901122, 7);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
244 MD5STEP (F1, d, a, b, c, in[13] + 0xfd987193, 12);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
245 MD5STEP (F1, c, d, a, b, in[14] + 0xa679438e, 17);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
246 MD5STEP (F1, b, c, d, a, in[15] + 0x49b40821, 22);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
247
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
248 MD5STEP (F2, a, b, c, d, in[1] + 0xf61e2562, 5);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
249 MD5STEP (F2, d, a, b, c, in[6] + 0xc040b340, 9);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
250 MD5STEP (F2, c, d, a, b, in[11] + 0x265e5a51, 14);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
251 MD5STEP (F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
252 MD5STEP (F2, a, b, c, d, in[5] + 0xd62f105d, 5);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
253 MD5STEP (F2, d, a, b, c, in[10] + 0x02441453, 9);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
254 MD5STEP (F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
255 MD5STEP (F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
256 MD5STEP (F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
257 MD5STEP (F2, d, a, b, c, in[14] + 0xc33707d6, 9);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
258 MD5STEP (F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
259 MD5STEP (F2, b, c, d, a, in[8] + 0x455a14ed, 20);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
260 MD5STEP (F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
261 MD5STEP (F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
262 MD5STEP (F2, c, d, a, b, in[7] + 0x676f02d9, 14);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
263 MD5STEP (F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
264
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
265 MD5STEP (F3, a, b, c, d, in[5] + 0xfffa3942, 4);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
266 MD5STEP (F3, d, a, b, c, in[8] + 0x8771f681, 11);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
267 MD5STEP (F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
268 MD5STEP (F3, b, c, d, a, in[14] + 0xfde5380c, 23);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
269 MD5STEP (F3, a, b, c, d, in[1] + 0xa4beea44, 4);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
270 MD5STEP (F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
271 MD5STEP (F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
272 MD5STEP (F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
273 MD5STEP (F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
274 MD5STEP (F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
275 MD5STEP (F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
276 MD5STEP (F3, b, c, d, a, in[6] + 0x04881d05, 23);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
277 MD5STEP (F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
278 MD5STEP (F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
279 MD5STEP (F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
280 MD5STEP (F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
281
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
282 MD5STEP (F4, a, b, c, d, in[0] + 0xf4292244, 6);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
283 MD5STEP (F4, d, a, b, c, in[7] + 0x432aff97, 10);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
284 MD5STEP (F4, c, d, a, b, in[14] + 0xab9423a7, 15);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
285 MD5STEP (F4, b, c, d, a, in[5] + 0xfc93a039, 21);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
286 MD5STEP (F4, a, b, c, d, in[12] + 0x655b59c3, 6);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
287 MD5STEP (F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
288 MD5STEP (F4, c, d, a, b, in[10] + 0xffeff47d, 15);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
289 MD5STEP (F4, b, c, d, a, in[1] + 0x85845dd1, 21);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
290 MD5STEP (F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
291 MD5STEP (F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
292 MD5STEP (F4, c, d, a, b, in[6] + 0xa3014314, 15);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
293 MD5STEP (F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
294 MD5STEP (F4, a, b, c, d, in[4] + 0xf7537e82, 6);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
295 MD5STEP (F4, d, a, b, c, in[11] + 0xbd3af235, 10);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
296 MD5STEP (F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
297 MD5STEP (F4, b, c, d, a, in[9] + 0xeb86d391, 21);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
298
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
299 buf[0] += a;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
300 buf[1] += b;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
301 buf[2] += c;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
302 buf[3] += d;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
303 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
304
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
305
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
306
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
307
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
308 /**
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
309 * md5_get_digest: get the md5 hash of a buffer
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
310 * @buffer: byte buffer
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
311 * @buffer_size: buffer size (in bytes)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
312 * @digest: 16 bytes buffer receiving the hash code.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
313 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
314 * Get the md5 hash of a buffer. The result is put in
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
315 * the 16 bytes buffer @digest .
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
316 **/
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
317 void
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
318 md5_get_digest (const gchar *buffer, gint buffer_size, guchar digest[16])
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
319 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
320 MD5Context ctx;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
321
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
322 md5_init (&ctx);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
323 md5_update (&ctx, buffer, buffer_size);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
324 md5_final (&ctx, digest);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
325
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
326 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
327
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
328 /* modified for GQView, starting here */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
329
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
330 /**
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
331 * md5_get_digest_from_file: get the md5 hash of a file
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
332 * @filename: file name
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
333 * @digest: 16 bytes buffer receiving the hash code.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
334 * @return: TRUE on success
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
335 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
336 * Get the md5 hash of a file. The result is put in
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
337 * the 16 bytes buffer @digest .
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
338 **/
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
339 gboolean md5_get_digest_from_file(const gchar *path, guchar digest[16])
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
340 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
341 MD5Context ctx;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
342 guchar tmp_buf[1024];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
343 gint nb_bytes_read;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
344 FILE *fp;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
345 gint success;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
346
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
347 fp = fopen(path, "r");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
348 if (!fp) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
349
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
350 md5_init(&ctx);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
351
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
352 while ((nb_bytes_read = fread (tmp_buf, sizeof (guchar), 1024, fp)) > 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
353 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
354 md5_update (&ctx, tmp_buf, nb_bytes_read);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
355 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
356
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
357 success = (ferror(fp) == 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
358 fclose(fp);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
359 if (!success) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
360
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
361 md5_final (&ctx, digest);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
362 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
363 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
364
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
365 /* does filename utf8 to filesystem encoding first */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
366 gboolean md5_get_digest_from_file_utf8(const gchar *path, guchar digest[16])
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
367 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
368 gboolean success;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
369 gchar *pathl;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
370
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
371 pathl = path_from_utf8(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
372 success = md5_get_digest_from_file(pathl, digest);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
373 g_free(pathl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
374
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
375 return success;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
376 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
377
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
378 /* these to and from text string converters were borrowed from
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
379 * the libgnomeui library, where they are name thumb_digest_to/from_ascii
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
380 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
381 * this version of the from text util does buffer length checking,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
382 * and assumes a NULL terminated string.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
383 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
384
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
385 gchar *md5_digest_to_text(guchar digest[16])
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
386 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
387 static gchar hex_digits[] = "0123456789abcdef";
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
388 gchar *result;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
389 gint i;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
390
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
391 result = g_malloc(33);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
392 for (i = 0; i < 16; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
393 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
394 result[2*i] = hex_digits[digest[i] >> 4];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
395 result[2*i+1] = hex_digits[digest[i] & 0xf];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
396 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
397 result[32] = '\0';
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
398
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
399 return result;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
400 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
401
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
402 gboolean md5_digest_from_text(const gchar *text, guchar digest[16])
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
403 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
404 gint i;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
405
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
406 for (i = 0; i < 16; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
407 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
408 if (text[2*i] == '\0' || text[2*i+1] == '\0') return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
409 digest[i] = g_ascii_xdigit_value (text[2*i]) << 4 |
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
410 g_ascii_xdigit_value (text[2*i + 1]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
411 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
412
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
413 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
414 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
415
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
416 gchar *md5_text_from_file_utf8(const gchar *path, const gchar *error_text)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
417 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
418 guchar digest[16];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
419
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
420 if (!md5_get_digest_from_file_utf8(path, digest)) return g_strdup(error_text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
421
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
422 return md5_digest_to_text(digest);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
423 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
424