Macros | Functions | Variables
md5.c File Reference
#include <string.h>
#include <sys/types.h>
#include "md5.h"

Go to the source code of this file.

Macros

#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))
 
#define MD5STEP(f, w, x, y, z, in, s)   (w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x)
 
#define HEX_STRING   "0123456789abcdef" /* to convert to hex */
 

Functions

void MD5Transform (UWORD32 buf[4], UWORD32 const in[16])
 
static void detectEndianess ()
 
static void byteSwap (UWORD32 *buf, unsigned words)
 
void MD5Init (struct MD5Context *ctx)
 
void MD5Update (struct MD5Context *ctx, md5byte const *buf, unsigned len)
 
void MD5Final (md5byte digest[16], struct MD5Context *ctx)
 
void MD5Buffer (const unsigned char *buf, unsigned int len, unsigned char sig[16])
 
void MD5SigToString (unsigned char signature[16], char *str, int len)
 

Variables

int g_bigEndian = 0
 
int g_endianessDetected = 0
 

Macro Definition Documentation

#define F1 (   x,
  y,
 
)    (z ^ (x & (y ^ z)))

Definition at line 175 of file md5.c.

#define F2 (   x,
  y,
 
)    F1(z, x, y)

Definition at line 176 of file md5.c.

#define F3 (   x,
  y,
 
)    (x ^ y ^ z)

Definition at line 177 of file md5.c.

#define F4 (   x,
  y,
 
)    (y ^ (x | ~z))

Definition at line 178 of file md5.c.

#define HEX_STRING   "0123456789abcdef" /* to convert to hex */

Definition at line 283 of file md5.c.

#define MD5STEP (   f,
  w,
  x,
  y,
  z,
  in,
  s 
)    (w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x)

Definition at line 181 of file md5.c.

Function Documentation

static void byteSwap ( UWORD32 buf,
unsigned  words 
)
static

Definition at line 61 of file md5.c.

62 {
63  md5byte *p;
64 
65  if (!g_bigEndian) return;
66 
67  p = (md5byte *)buf;
68 
69  do {
70  *buf++ = (UWORD32)((unsigned)p[3] << 8 | p[2]) << 16 |
71  ((unsigned)p[1] << 8 | p[0]);
72  p += 4;
73  } while (--words);
74 }
p
Definition: test.py:223
int g_bigEndian
Definition: md5.c:31
#define md5byte
Definition: md5.h:32
#define UWORD32
Definition: md5_loc.h:4
static void detectEndianess ( )
static

Definition at line 35 of file md5.c.

36 {
37  int nl = 0x12345678;
38  short ns = 0x1234;
39 
40  unsigned char *p = (unsigned char *)(&nl);
41  unsigned char *sp = (unsigned char *)(&ns);
42 
43  if (g_endianessDetected) return;
44  if ( p[0] == 0x12 && p[1] == 0x34 && p[2] == 0x56 && p[3] == 0x78 )
45  {
46  g_bigEndian = 1;
47  }
48  else if ( p[0] == 0x78 && p[1] == 0x56 && p[2] == 0x34 && p[3] == 0x12 )
49  {
50  g_bigEndian = 0;
51  }
52  else
53  {
54  g_bigEndian = *sp != 0x12;
55  }
56 
58 }
p
Definition: test.py:223
int g_bigEndian
Definition: md5.c:31
int g_endianessDetected
Definition: md5.c:32
QAsciiDict< Entry > ns
std::string nl(std::size_t i=1)
void MD5Buffer ( const unsigned char *  buf,
unsigned int  len,
unsigned char  sig[16] 
)

Definition at line 275 of file md5.c.

276 {
277  struct MD5Context md5;
278  MD5Init(&md5);
279  MD5Update(&md5,buf,len);
280  MD5Final(sig,&md5);
281 }
void MD5Update(struct MD5Context *ctx, md5byte const *buf, unsigned len)
Definition: md5.c:99
void MD5Init(struct MD5Context *ctx)
Definition: md5.c:81
Definition: md5.h:41
void MD5Final(md5byte digest[16], struct MD5Context *ctx)
Definition: md5.c:139
UWORD32 buf[4]
Definition: md5.h:42
void MD5Final ( md5byte  digest[16],
struct MD5Context ctx 
)

Definition at line 139 of file md5.c.

140 {
141  int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */
142  md5byte *p = (md5byte *)ctx->in + count;
143 
144  /* Set the first char of padding to 0x80. There is always room. */
145  *p++ = 0x80;
146 
147  /* Bytes of padding needed to make 56 bytes (-8..55) */
148  count = 56 - 1 - count;
149 
150  if (count < 0) { /* Padding forces an extra block */
151  memset(p, 0, count + 8);
152  byteSwap(ctx->in, 16);
153  MD5Transform(ctx->buf, ctx->in);
154  p = (md5byte *)ctx->in;
155  count = 56;
156  }
157  memset(p, 0, count);
158  byteSwap(ctx->in, 14);
159 
160  /* Append length in bits and transform */
161  ctx->in[14] = ctx->bytes[0] << 3;
162  ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29;
163  MD5Transform(ctx->buf, ctx->in);
164 
165  byteSwap(ctx->buf, 4);
166  memcpy(digest, ctx->buf, 16);
167  memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */
168 }
void MD5Transform(UWORD32 buf[4], UWORD32 const in[16])
Definition: md5.c:190
UWORD32 in[16]
Definition: md5.h:44
static void byteSwap(UWORD32 *buf, unsigned words)
Definition: md5.c:61
p
Definition: test.py:223
UWORD32 bytes[2]
Definition: md5.h:43
UWORD32 buf[4]
Definition: md5.h:42
if(!yymsg) yymsg
#define md5byte
Definition: md5.h:32
void MD5Init ( struct MD5Context ctx)

Definition at line 81 of file md5.c.

82 {
84 
85  ctx->buf[0] = 0x67452301;
86  ctx->buf[1] = 0xefcdab89;
87  ctx->buf[2] = 0x98badcfe;
88  ctx->buf[3] = 0x10325476;
89 
90  ctx->bytes[0] = 0;
91  ctx->bytes[1] = 0;
92 }
static void detectEndianess()
Definition: md5.c:35
UWORD32 bytes[2]
Definition: md5.h:43
UWORD32 buf[4]
Definition: md5.h:42
void MD5SigToString ( unsigned char  signature[16],
char *  str,
int  len 
)

Definition at line 285 of file md5.c.

286 {
287  unsigned char *sig_p;
288  char *str_p, *max_p;
289  unsigned int high, low;
290 
291  str_p = str;
292  max_p = str + len;
293 
294  for (sig_p = (unsigned char *)signature;
295  sig_p < (unsigned char *)signature + 16;
296  sig_p++)
297  {
298  high = *sig_p / 16;
299  low = *sig_p % 16;
300  /* account for 2 chars */
301  if (str_p + 1 >= max_p) {
302  break;
303  }
304  *str_p++ = HEX_STRING[high];
305  *str_p++ = HEX_STRING[low];
306  }
307  /* account for 2 chars */
308  if (str_p < max_p) {
309  *str_p++ = '\0';
310  }
311 }
static QCString str
#define HEX_STRING
Definition: md5.c:283
void MD5Transform ( UWORD32  buf[4],
UWORD32 const  in[16] 
)

Definition at line 190 of file md5.c.

191 {
192  register UWORD32 a, b, c, d;
193 
194  a = buf[0];
195  b = buf[1];
196  c = buf[2];
197  d = buf[3];
198 
199  MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
200  MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
201  MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
202  MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
203  MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
204  MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
205  MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
206  MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
207  MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
208  MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
209  MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
210  MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
211  MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
212  MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
213  MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
214  MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
215 
216  MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
217  MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
218  MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
219  MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
220  MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
221  MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
222  MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
223  MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
224  MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
225  MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
226  MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
227  MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
228  MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
229  MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
230  MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
231  MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
232 
233  MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
234  MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
235  MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
236  MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
237  MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
238  MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
239  MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
240  MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
241  MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
242  MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
243  MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
244  MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
245  MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
246  MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
247  MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
248  MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
249 
250  MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
251  MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
252  MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
253  MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
254  MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
255  MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
256  MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
257  MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
258  MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
259  MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
260  MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
261  MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
262  MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
263  MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
264  MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
265  MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
266 
267  buf[0] += a;
268  buf[1] += b;
269  buf[2] += c;
270  buf[3] += d;
271 }
#define F2(x, y, z)
Definition: md5.c:176
#define F1(x, y, z)
Definition: md5.c:175
UWORD32 in[16]
Definition: md5.h:44
#define F3(x, y, z)
Definition: md5.c:177
const double a
#define F4(x, y, z)
Definition: md5.c:178
static bool * b
Definition: config.cpp:1043
UWORD32 buf[4]
Definition: md5.h:42
#define UWORD32
Definition: md5_loc.h:4
#define MD5STEP(f, w, x, y, z, in, s)
Definition: md5.c:181
void MD5Update ( struct MD5Context ctx,
md5byte const *  buf,
unsigned  len 
)

Definition at line 99 of file md5.c.

100 {
101  UWORD32 t;
102 
103  /* Update byte count */
104 
105  t = ctx->bytes[0];
106  if ((ctx->bytes[0] = t + len) < t)
107  ctx->bytes[1]++; /* Carry from low to high */
108 
109  t = 64 - (t & 0x3f); /* Space available in ctx->in (at least 1) */
110  if (t > len) {
111  memcpy((md5byte *)ctx->in + 64 - t, buf, len);
112  return;
113  }
114  /* First chunk is an odd size */
115  memcpy((md5byte *)ctx->in + 64 - t, buf, t);
116  byteSwap(ctx->in, 16);
117  MD5Transform(ctx->buf, ctx->in);
118  buf += t;
119  len -= t;
120 
121  /* Process data in 64-byte chunks */
122  while (len >= 64) {
123  memcpy(ctx->in, buf, 64);
124  byteSwap(ctx->in, 16);
125  MD5Transform(ctx->buf, ctx->in);
126  buf += 64;
127  len -= 64;
128  }
129 
130  /* Handle any remaining bytes of data. */
131  memcpy(ctx->in, buf, len);
132 }
void MD5Transform(UWORD32 buf[4], UWORD32 const in[16])
Definition: md5.c:190
UWORD32 in[16]
Definition: md5.h:44
static void byteSwap(UWORD32 *buf, unsigned words)
Definition: md5.c:61
UWORD32 bytes[2]
Definition: md5.h:43
UWORD32 buf[4]
Definition: md5.h:42
#define md5byte
Definition: md5.h:32
#define UWORD32
Definition: md5_loc.h:4

Variable Documentation

int g_bigEndian = 0

Definition at line 31 of file md5.c.

int g_endianessDetected = 0

Definition at line 32 of file md5.c.