2 * This library is free software; you can redistribute it and/or
3 * modify it under the same terms as Perl itself.
5 * Copyright 1998-2000 Gisle Aas.
6 * Copyright 1995-1996 Neil Winton.
7 * Copyright 1991-1992 RSA Data Security, Inc.
9 * This code is derived from Neil Winton's MD5-1.7 Perl module, which in
10 * turn is derived from the reference implementation in RFC 1231 which
11 * comes with this message:
13 * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
16 * License to copy and use this software is granted provided that it
17 * is identified as the "RSA Data Security, Inc. MD5 Message-Digest
18 * Algorithm" in all material mentioning or referencing this software
21 * License is also granted to make and use derivative works provided
22 * that such works are identified as "derived from the RSA Data
23 * Security, Inc. MD5 Message-Digest Algorithm" in all material
24 * mentioning or referencing the derived work.
26 * RSA Data Security, Inc. makes no representations concerning either
27 * the merchantability of this software or the suitability of this
28 * software for any particular purpose. It is provided "as is"
29 * without express or implied warranty of any kind.
31 * These notices must be retained in any copies of any part of this
32 * documentation and/or software.
45 /* Define this to turn on verbose debugging prints */
48 /* Perl does not guarantee that U32 is exactly 32 bits. Some system
49 * has no integral type with exactly 32 bits. For instance, A Cray has
50 * short, int and long all at 64 bits so we need to apply this macro
51 * to reduce U32 values to 32 bits at appropriate places. If U32
52 * really does have 32 bits then this is a no-op.
54 #if BYTEORDER > 0x4321 || defined(TRUNCATE_U32)
55 #define TO32(x) ((x) & 0xFFFFffff)
56 #define TRUNC32(x) ((x) &= 0xFFFFffff)
59 #define TRUNC32(x) /*nothing*/
62 /* The MD5 algorithm is defined in terms of little endian 32-bit
63 * values. The following macros (and functions) allow us to convert
64 * between native integers and such values.
67 #ifndef U32_ALIGNMENT_REQUIRED
68 #if BYTEORDER == 0x1234 /* 32-bit little endian */
69 #define BYTESWAP(x) (x) /* no-op */
71 #elif BYTEORDER == 0x4321 /* 32-bit big endian */
72 #define BYTESWAP(x) ((((x)&0xFF)<<24) \
74 |(((x)&0x0000FF00)<<8) \
75 |(((x)&0x00FF0000)>>8) )
80 static void u2s(U32 u, U8* s)
83 *s++ = (u >> 8) & 0xFF;
84 *s++ = (u >> 16) & 0xFF;
85 *s = (u >> 24) & 0xFF;
88 #define s2u(s,u) ((u) = (U32)(*s) | \
89 ((U32)(*(s+1)) << 8) | \
90 ((U32)(*(s+2)) << 16) | \
91 ((U32)(*(s+3)) << 24))
94 #define MD5_CTX_SIGNATURE 200003165
96 /* This stucture keeps the current state of algorithm.
99 U32 signature; /* safer cast in get_md5_ctx() */
100 U32 A, B, C, D; /* current digest */
101 U32 bytes_low; /* counts bytes in message */
102 U32 bytes_high; /* turn it into a 64-bit counter */
103 U8 buffer[128]; /* collect complete 64 byte blocks */
107 /* Padding is added at the end of the message in order to fill a
108 * complete 64 byte block (- 8 bytes for the message length). The
109 * padding is also the reason the buffer in MD5_CTX have to be
112 static unsigned char PADDING[64] = {
113 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
114 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
115 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
118 /* Constants for MD5Transform routine.
137 /* F, G, H and I are basic MD5 functions.
139 #define F(x, y, z) ((((x) & ((y) ^ (z))) ^ (z)))
140 #define G(x, y, z) F(z, x, y)
141 #define H(x, y, z) ((x) ^ (y) ^ (z))
142 #define I(x, y, z) ((y) ^ ((x) | (~z)))
144 /* ROTATE_LEFT rotates x left n bits.
146 #define ROTATE_LEFT(x, n) (((x) << (n) | ((x) >> (32-(n)))))
148 /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
149 * Rotation is separate from addition to prevent recomputation.
151 #define FF(a, b, c, d, s, ac) \
152 (a) += F ((b), (c), (d)) + (NEXTx) + (U32)(ac); \
154 (a) = ROTATE_LEFT ((a), (s)); \
158 #define GG(a, b, c, d, x, s, ac) \
159 (a) += G ((b), (c), (d)) + X[x] + (U32)(ac); \
161 (a) = ROTATE_LEFT ((a), (s)); \
165 #define HH(a, b, c, d, x, s, ac) \
166 (a) += H ((b), (c), (d)) + X[x] + (U32)(ac); \
168 (a) = ROTATE_LEFT ((a), (s)); \
172 #define II(a, b, c, d, x, s, ac) \
173 (a) += I ((b), (c), (d)) + X[x] + (U32)(ac); \
175 (a) = ROTATE_LEFT ((a), (s)); \
181 MD5Init(MD5_CTX *ctx)
190 ctx->bytes_low = ctx->bytes_high = 0;
195 MD5Transform(MD5_CTX* ctx, const U8* buf, STRLEN blocks)
198 static int tcount = 0;
206 #ifndef U32_ALIGNMENT_REQUIRED
207 const U32 *x = (U32*)buf; /* really just type casting */
216 #if BYTEORDER == 0x1234 && !defined(U32_ALIGNMENT_REQUIRED)
220 U32 X[16]; /* converted values, used in round 2-4 */
224 #define NEXTx (tmp=*x++, *uptr++ = BYTESWAP(tmp))
226 #define NEXTx (s2u(buf,tmp), buf += 4, *uptr++ = tmp)
231 if (buf == ctx->buffer)
232 fprintf(stderr,"%5d: Transform ctx->buffer", ++tcount);
234 fprintf(stderr,"%5d: Transform %p (%d)", ++tcount, buf, blocks);
239 for (i = 0; i < 16; i++) {
240 fprintf(stderr,"%x,", x[i]);
242 fprintf(stderr,"]\n");
247 FF (a, b, c, d, S11, 0xd76aa478); /* 1 */
248 FF (d, a, b, c, S12, 0xe8c7b756); /* 2 */
249 FF (c, d, a, b, S13, 0x242070db); /* 3 */
250 FF (b, c, d, a, S14, 0xc1bdceee); /* 4 */
251 FF (a, b, c, d, S11, 0xf57c0faf); /* 5 */
252 FF (d, a, b, c, S12, 0x4787c62a); /* 6 */
253 FF (c, d, a, b, S13, 0xa8304613); /* 7 */
254 FF (b, c, d, a, S14, 0xfd469501); /* 8 */
255 FF (a, b, c, d, S11, 0x698098d8); /* 9 */
256 FF (d, a, b, c, S12, 0x8b44f7af); /* 10 */
257 FF (c, d, a, b, S13, 0xffff5bb1); /* 11 */
258 FF (b, c, d, a, S14, 0x895cd7be); /* 12 */
259 FF (a, b, c, d, S11, 0x6b901122); /* 13 */
260 FF (d, a, b, c, S12, 0xfd987193); /* 14 */
261 FF (c, d, a, b, S13, 0xa679438e); /* 15 */
262 FF (b, c, d, a, S14, 0x49b40821); /* 16 */
265 GG (a, b, c, d, 1, S21, 0xf61e2562); /* 17 */
266 GG (d, a, b, c, 6, S22, 0xc040b340); /* 18 */
267 GG (c, d, a, b, 11, S23, 0x265e5a51); /* 19 */
268 GG (b, c, d, a, 0, S24, 0xe9b6c7aa); /* 20 */
269 GG (a, b, c, d, 5, S21, 0xd62f105d); /* 21 */
270 GG (d, a, b, c, 10, S22, 0x2441453); /* 22 */
271 GG (c, d, a, b, 15, S23, 0xd8a1e681); /* 23 */
272 GG (b, c, d, a, 4, S24, 0xe7d3fbc8); /* 24 */
273 GG (a, b, c, d, 9, S21, 0x21e1cde6); /* 25 */
274 GG (d, a, b, c, 14, S22, 0xc33707d6); /* 26 */
275 GG (c, d, a, b, 3, S23, 0xf4d50d87); /* 27 */
276 GG (b, c, d, a, 8, S24, 0x455a14ed); /* 28 */
277 GG (a, b, c, d, 13, S21, 0xa9e3e905); /* 29 */
278 GG (d, a, b, c, 2, S22, 0xfcefa3f8); /* 30 */
279 GG (c, d, a, b, 7, S23, 0x676f02d9); /* 31 */
280 GG (b, c, d, a, 12, S24, 0x8d2a4c8a); /* 32 */
283 HH (a, b, c, d, 5, S31, 0xfffa3942); /* 33 */
284 HH (d, a, b, c, 8, S32, 0x8771f681); /* 34 */
285 HH (c, d, a, b, 11, S33, 0x6d9d6122); /* 35 */
286 HH (b, c, d, a, 14, S34, 0xfde5380c); /* 36 */
287 HH (a, b, c, d, 1, S31, 0xa4beea44); /* 37 */
288 HH (d, a, b, c, 4, S32, 0x4bdecfa9); /* 38 */
289 HH (c, d, a, b, 7, S33, 0xf6bb4b60); /* 39 */
290 HH (b, c, d, a, 10, S34, 0xbebfbc70); /* 40 */
291 HH (a, b, c, d, 13, S31, 0x289b7ec6); /* 41 */
292 HH (d, a, b, c, 0, S32, 0xeaa127fa); /* 42 */
293 HH (c, d, a, b, 3, S33, 0xd4ef3085); /* 43 */
294 HH (b, c, d, a, 6, S34, 0x4881d05); /* 44 */
295 HH (a, b, c, d, 9, S31, 0xd9d4d039); /* 45 */
296 HH (d, a, b, c, 12, S32, 0xe6db99e5); /* 46 */
297 HH (c, d, a, b, 15, S33, 0x1fa27cf8); /* 47 */
298 HH (b, c, d, a, 2, S34, 0xc4ac5665); /* 48 */
301 II (a, b, c, d, 0, S41, 0xf4292244); /* 49 */
302 II (d, a, b, c, 7, S42, 0x432aff97); /* 50 */
303 II (c, d, a, b, 14, S43, 0xab9423a7); /* 51 */
304 II (b, c, d, a, 5, S44, 0xfc93a039); /* 52 */
305 II (a, b, c, d, 12, S41, 0x655b59c3); /* 53 */
306 II (d, a, b, c, 3, S42, 0x8f0ccc92); /* 54 */
307 II (c, d, a, b, 10, S43, 0xffeff47d); /* 55 */
308 II (b, c, d, a, 1, S44, 0x85845dd1); /* 56 */
309 II (a, b, c, d, 8, S41, 0x6fa87e4f); /* 57 */
310 II (d, a, b, c, 15, S42, 0xfe2ce6e0); /* 58 */
311 II (c, d, a, b, 6, S43, 0xa3014314); /* 59 */
312 II (b, c, d, a, 13, S44, 0x4e0811a1); /* 60 */
313 II (a, b, c, d, 4, S41, 0xf7537e82); /* 61 */
314 II (d, a, b, c, 11, S42, 0xbd3af235); /* 62 */
315 II (c, d, a, b, 2, S43, 0x2ad7d2bb); /* 63 */
316 II (b, c, d, a, 9, S44, 0xeb86d391); /* 64 */
333 ctx_dump(MD5_CTX* ctx)
335 static char buf[1024];
336 sprintf(buf, "{A=%x,B=%x,C=%x,D=%x,%d,%d(%d)}",
337 ctx->A, ctx->B, ctx->C, ctx->D,
338 ctx->bytes_low, ctx->bytes_high, (ctx->bytes_low&0x3F));
345 MD5Update(MD5_CTX* ctx, const U8* buf, STRLEN len)
348 STRLEN fill = ctx->bytes_low & 0x3F;
351 static int ucount = 0;
352 fprintf(stderr,"%5i: Update(%s, %p, %d)\n", ++ucount, ctx_dump(ctx),
356 ctx->bytes_low += len;
357 if (ctx->bytes_low < len) /* wrap around */
361 STRLEN missing = 64 - fill;
363 Copy(buf, ctx->buffer + fill, len, U8);
366 Copy(buf, ctx->buffer + fill, missing, U8);
367 MD5Transform(ctx, ctx->buffer, 1);
374 MD5Transform(ctx, buf, blocks);
375 if ( (len &= 0x3F)) {
376 Copy(buf + (blocks << 6), ctx->buffer, len, U8);
382 MD5Final(U8* digest, MD5_CTX *ctx)
384 STRLEN fill = ctx->bytes_low & 0x3F;
385 STRLEN padlen = (fill < 56 ? 56 : 120) - fill;
386 U32 bits_low, bits_high;
388 fprintf(stderr," Final: %s\n", ctx_dump(ctx));
390 Copy(PADDING, ctx->buffer + fill, padlen, U8);
393 bits_low = ctx->bytes_low << 3;
394 bits_high = (ctx->bytes_high << 3) | (ctx->bytes_low >> 29);
396 *(U32*)(ctx->buffer + fill) = BYTESWAP(bits_low); fill += 4;
397 *(U32*)(ctx->buffer + fill) = BYTESWAP(bits_high); fill += 4;
399 u2s(bits_low, ctx->buffer + fill); fill += 4;
400 u2s(bits_high, ctx->buffer + fill); fill += 4;
403 MD5Transform(ctx, ctx->buffer, fill >> 6);
405 fprintf(stderr," Result: %s\n", ctx_dump(ctx));
409 *(U32*)digest = BYTESWAP(ctx->A); digest += 4;
410 *(U32*)digest = BYTESWAP(ctx->B); digest += 4;
411 *(U32*)digest = BYTESWAP(ctx->C); digest += 4;
412 *(U32*)digest = BYTESWAP(ctx->D);
415 u2s(ctx->B, digest+4);
416 u2s(ctx->C, digest+8);
417 u2s(ctx->D, digest+12);
422 #define INT2PTR(any,d) (any)(d)
425 static MD5_CTX* get_md5_ctx(SV* sv)
430 MD5_CTX* ctx = INT2PTR(MD5_CTX*, SvIV(sv));
431 if (ctx && ctx->signature == MD5_CTX_SIGNATURE) {
436 croak("Not a reference to a Digest::MD5 object");
437 return (MD5_CTX*)0; /* some compilers insist on a return value */
441 static char* hex_16(const unsigned char* from, char* to)
443 static char *hexdigits = "0123456789abcdef";
444 const unsigned char *end = from + 16;
448 *d++ = hexdigits[(*from >> 4)];
449 *d++ = hexdigits[(*from & 0x0F)];
456 static char* base64_16(const unsigned char* from, char* to)
458 static char* base64 =
459 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
460 const unsigned char *end = from + 16;
461 unsigned char c1, c2, c3;
466 *d++ = base64[c1>>2];
468 *d++ = base64[(c1 & 0x3) << 4];
473 *d++ = base64[((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4)];
474 *d++ = base64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)];
475 *d++ = base64[c3 & 0x3F];
486 static SV* make_mortal_sv(const unsigned char *src, int type)
498 ret = hex_16(src, result);
502 ret = base64_16(src, result);
506 croak("Bad convertion type (%d)", type);
509 return sv_2mortal(newSVpv(ret,len));
513 /********************************************************************/
515 typedef PerlIO* InputStream;
517 MODULE = Digest::MD5 PACKAGE = Digest::MD5
527 if (!SvROK(xclass)) {
529 char *sclass = SvPV(xclass, my_na);
530 New(55, context, 1, MD5_CTX);
531 context->signature = MD5_CTX_SIGNATURE;
532 ST(0) = sv_newmortal();
533 sv_setref_pv(ST(0), sclass, (void*)context);
534 SvREADONLY_on(SvRV(ST(0)));
536 context = get_md5_ctx(xclass);
551 MD5_CTX* context = get_md5_ctx(self);
556 for (i = 1; i < items; i++) {
557 data = (unsigned char *)(SvPVbyte(ST(i), len));
558 MD5Update(context, data, len);
560 XSRETURN(1); /* self */
567 MD5_CTX* context = get_md5_ctx(self);
568 STRLEN fill = context->bytes_low & 0x3F;
569 unsigned char buffer[4096];
574 /* The MD5Update() function is faster if it can work with
575 * complete blocks. This will fill up any buffered block
578 STRLEN missing = 64 - fill;
579 if ( (n = PerlIO_read(fh, buffer, missing)))
580 MD5Update(context, buffer, n);
582 XSRETURN(1); /* self */
585 /* Process blocks until EOF */
586 while ( (n = PerlIO_read(fh, buffer, sizeof(buffer)))) {
587 MD5Update(context, buffer, n);
590 XSRETURN(1); /* self */
596 Digest::MD5::digest = F_BIN
597 Digest::MD5::hexdigest = F_HEX
598 Digest::MD5::b64digest = F_B64
600 unsigned char digeststr[16];
602 MD5Final(digeststr, context);
603 MD5Init(context); /* In case it is reused */
604 ST(0) = make_mortal_sv(digeststr, ix);
610 Digest::MD5::md5 = F_BIN
611 Digest::MD5::md5_hex = F_HEX
612 Digest::MD5::md5_base64 = F_B64
618 unsigned char digeststr[16];
621 for (i = 0; i < items; i++) {
622 data = (unsigned char *)(SvPVbyte(ST(i), len));
623 MD5Update(&ctx, data, len);
625 MD5Final(digeststr, &ctx);
626 ST(0) = make_mortal_sv(digeststr, ix);