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 1321 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.
38 #define PERL_NO_GET_CONTEXT /* we want efficiency */
46 #ifndef PERL_UNUSED_VAR
47 # define PERL_UNUSED_VAR(x) ((void)x)
50 #ifndef PERL_MAGIC_ext
51 # define PERL_MAGIC_ext '~'
55 # define Newxz(v,n,t) Newz(0,v,n,t)
59 # define SvMAGIC_set(sv, mg) (SvMAGIC(sv) = (mg))
63 # define sv_magicext(sv, obj, type, vtbl, name, namlen) \
64 THX_sv_magicext(aTHX_ sv, obj, type, vtbl, name, namlen)
65 static MAGIC *THX_sv_magicext(pTHX_ SV *sv, SV *obj, int type,
66 MGVTBL const *vtbl, char const *name, I32 namlen)
70 /* exceeded intended usage of this reserve implementation */
73 mg->mg_virtual = (MGVTBL*)vtbl;
75 mg->mg_ptr = (char *)name;
77 (void) SvUPGRADE(sv, SVt_PVMG);
78 mg->mg_moremagic = SvMAGIC(sv);
88 # define SvPVbyte(sv, lp) (sv_utf8_downgrade((sv), 0), SvPV((sv), (lp)))
91 /* Perl does not guarantee that U32 is exactly 32 bits. Some system
92 * has no integral type with exactly 32 bits. For instance, A Cray has
93 * short, int and long all at 64 bits so we need to apply this macro
94 * to reduce U32 values to 32 bits at appropriate places. If U32
95 * really does have 32 bits then this is a no-op.
97 #if BYTEORDER > 0x4321 || defined(TRUNCATE_U32)
98 #define TO32(x) ((x) & 0xFFFFffff)
99 #define TRUNC32(x) ((x) &= 0xFFFFffff)
102 #define TRUNC32(x) /*nothing*/
105 /* The MD5 algorithm is defined in terms of little endian 32-bit
106 * values. The following macros (and functions) allow us to convert
107 * between native integers and such values.
110 #ifndef U32_ALIGNMENT_REQUIRED
111 #if BYTEORDER == 0x1234 /* 32-bit little endian */
112 #define BYTESWAP(x) (x) /* no-op */
114 #elif BYTEORDER == 0x4321 /* 32-bit big endian */
115 #define BYTESWAP(x) ((((x)&0xFF)<<24) \
117 |(((x)&0x0000FF00)<<8) \
118 |(((x)&0x00FF0000)>>8) )
123 static void u2s(U32 u, U8* s)
125 *s++ = (U8)(u & 0xFF);
126 *s++ = (U8)((u >> 8) & 0xFF);
127 *s++ = (U8)((u >> 16) & 0xFF);
128 *s = (U8)((u >> 24) & 0xFF);
131 #define s2u(s,u) ((u) = (U32)(*s) | \
132 ((U32)(*(s+1)) << 8) | \
133 ((U32)(*(s+2)) << 16) | \
134 ((U32)(*(s+3)) << 24))
137 /* This structure keeps the current state of algorithm.
140 U32 A, B, C, D; /* current digest */
141 U32 bytes_low; /* counts bytes in message */
142 U32 bytes_high; /* turn it into a 64-bit counter */
143 U8 buffer[128]; /* collect complete 64 byte blocks */
146 #if defined(USE_ITHREADS) && defined(MGf_DUP)
147 STATIC int dup_md5_ctx(pTHX_ MAGIC *mg, CLONE_PARAMS *params)
150 PERL_UNUSED_VAR(params);
151 New(55, new_ctx, 1, MD5_CTX);
152 memcpy(new_ctx, mg->mg_ptr, sizeof(MD5_CTX));
153 mg->mg_ptr = (char *)new_ctx;
158 #if defined(MGf_DUP) && defined(USE_ITHREADS)
159 STATIC const MGVTBL vtbl_md5 = {
166 dup_md5_ctx, /* dup */
170 /* declare as 5 member, not normal 8 to save image space*/
171 STATIC const struct {
172 int (*svt_get)(SV* sv, MAGIC* mg);
173 int (*svt_set)(SV* sv, MAGIC* mg);
174 U32 (*svt_len)(SV* sv, MAGIC* mg);
175 int (*svt_clear)(SV* sv, MAGIC* mg);
176 int (*svt_free)(SV* sv, MAGIC* mg);
178 NULL, NULL, NULL, NULL, NULL
183 /* Padding is added at the end of the message in order to fill a
184 * complete 64 byte block (- 8 bytes for the message length). The
185 * padding is also the reason the buffer in MD5_CTX have to be
188 static const unsigned char PADDING[64] = {
189 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
190 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
191 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
194 /* Constants for MD5Transform routine.
213 /* F, G, H and I are basic MD5 functions.
215 #define F(x, y, z) ((((x) & ((y) ^ (z))) ^ (z)))
216 #define G(x, y, z) F(z, x, y)
217 #define H(x, y, z) ((x) ^ (y) ^ (z))
218 #define I(x, y, z) ((y) ^ ((x) | (~z)))
220 /* ROTATE_LEFT rotates x left n bits.
222 #define ROTATE_LEFT(x, n) (((x) << (n) | ((x) >> (32-(n)))))
224 /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
225 * Rotation is separate from addition to prevent recomputation.
227 #define FF(a, b, c, d, s, ac) \
228 (a) += F ((b), (c), (d)) + (NEXTx) + (U32)(ac); \
230 (a) = ROTATE_LEFT ((a), (s)); \
234 #define GG(a, b, c, d, x, s, ac) \
235 (a) += G ((b), (c), (d)) + X[x] + (U32)(ac); \
237 (a) = ROTATE_LEFT ((a), (s)); \
241 #define HH(a, b, c, d, x, s, ac) \
242 (a) += H ((b), (c), (d)) + X[x] + (U32)(ac); \
244 (a) = ROTATE_LEFT ((a), (s)); \
248 #define II(a, b, c, d, x, s, ac) \
249 (a) += I ((b), (c), (d)) + X[x] + (U32)(ac); \
251 (a) = ROTATE_LEFT ((a), (s)); \
257 MD5Init(MD5_CTX *ctx)
266 ctx->bytes_low = ctx->bytes_high = 0;
271 MD5Transform(MD5_CTX* ctx, const U8* buf, STRLEN blocks)
274 static int tcount = 0;
282 #ifndef U32_ALIGNMENT_REQUIRED
283 const U32 *x = (U32*)buf; /* really just type casting */
292 #if BYTEORDER == 0x1234 && !defined(U32_ALIGNMENT_REQUIRED)
296 U32 X[16]; /* converted values, used in round 2-4 */
300 #define NEXTx (tmp=*x++, *uptr++ = BYTESWAP(tmp))
302 #define NEXTx (s2u(buf,tmp), buf += 4, *uptr++ = tmp)
307 if (buf == ctx->buffer)
308 fprintf(stderr,"%5d: Transform ctx->buffer", ++tcount);
310 fprintf(stderr,"%5d: Transform %p (%d)", ++tcount, buf, blocks);
315 for (i = 0; i < 16; i++) {
316 fprintf(stderr,"%x,", x[i]);
318 fprintf(stderr,"]\n");
323 FF (a, b, c, d, S11, 0xd76aa478); /* 1 */
324 FF (d, a, b, c, S12, 0xe8c7b756); /* 2 */
325 FF (c, d, a, b, S13, 0x242070db); /* 3 */
326 FF (b, c, d, a, S14, 0xc1bdceee); /* 4 */
327 FF (a, b, c, d, S11, 0xf57c0faf); /* 5 */
328 FF (d, a, b, c, S12, 0x4787c62a); /* 6 */
329 FF (c, d, a, b, S13, 0xa8304613); /* 7 */
330 FF (b, c, d, a, S14, 0xfd469501); /* 8 */
331 FF (a, b, c, d, S11, 0x698098d8); /* 9 */
332 FF (d, a, b, c, S12, 0x8b44f7af); /* 10 */
333 FF (c, d, a, b, S13, 0xffff5bb1); /* 11 */
334 FF (b, c, d, a, S14, 0x895cd7be); /* 12 */
335 FF (a, b, c, d, S11, 0x6b901122); /* 13 */
336 FF (d, a, b, c, S12, 0xfd987193); /* 14 */
337 FF (c, d, a, b, S13, 0xa679438e); /* 15 */
338 FF (b, c, d, a, S14, 0x49b40821); /* 16 */
341 GG (a, b, c, d, 1, S21, 0xf61e2562); /* 17 */
342 GG (d, a, b, c, 6, S22, 0xc040b340); /* 18 */
343 GG (c, d, a, b, 11, S23, 0x265e5a51); /* 19 */
344 GG (b, c, d, a, 0, S24, 0xe9b6c7aa); /* 20 */
345 GG (a, b, c, d, 5, S21, 0xd62f105d); /* 21 */
346 GG (d, a, b, c, 10, S22, 0x2441453); /* 22 */
347 GG (c, d, a, b, 15, S23, 0xd8a1e681); /* 23 */
348 GG (b, c, d, a, 4, S24, 0xe7d3fbc8); /* 24 */
349 GG (a, b, c, d, 9, S21, 0x21e1cde6); /* 25 */
350 GG (d, a, b, c, 14, S22, 0xc33707d6); /* 26 */
351 GG (c, d, a, b, 3, S23, 0xf4d50d87); /* 27 */
352 GG (b, c, d, a, 8, S24, 0x455a14ed); /* 28 */
353 GG (a, b, c, d, 13, S21, 0xa9e3e905); /* 29 */
354 GG (d, a, b, c, 2, S22, 0xfcefa3f8); /* 30 */
355 GG (c, d, a, b, 7, S23, 0x676f02d9); /* 31 */
356 GG (b, c, d, a, 12, S24, 0x8d2a4c8a); /* 32 */
359 HH (a, b, c, d, 5, S31, 0xfffa3942); /* 33 */
360 HH (d, a, b, c, 8, S32, 0x8771f681); /* 34 */
361 HH (c, d, a, b, 11, S33, 0x6d9d6122); /* 35 */
362 HH (b, c, d, a, 14, S34, 0xfde5380c); /* 36 */
363 HH (a, b, c, d, 1, S31, 0xa4beea44); /* 37 */
364 HH (d, a, b, c, 4, S32, 0x4bdecfa9); /* 38 */
365 HH (c, d, a, b, 7, S33, 0xf6bb4b60); /* 39 */
366 HH (b, c, d, a, 10, S34, 0xbebfbc70); /* 40 */
367 HH (a, b, c, d, 13, S31, 0x289b7ec6); /* 41 */
368 HH (d, a, b, c, 0, S32, 0xeaa127fa); /* 42 */
369 HH (c, d, a, b, 3, S33, 0xd4ef3085); /* 43 */
370 HH (b, c, d, a, 6, S34, 0x4881d05); /* 44 */
371 HH (a, b, c, d, 9, S31, 0xd9d4d039); /* 45 */
372 HH (d, a, b, c, 12, S32, 0xe6db99e5); /* 46 */
373 HH (c, d, a, b, 15, S33, 0x1fa27cf8); /* 47 */
374 HH (b, c, d, a, 2, S34, 0xc4ac5665); /* 48 */
377 II (a, b, c, d, 0, S41, 0xf4292244); /* 49 */
378 II (d, a, b, c, 7, S42, 0x432aff97); /* 50 */
379 II (c, d, a, b, 14, S43, 0xab9423a7); /* 51 */
380 II (b, c, d, a, 5, S44, 0xfc93a039); /* 52 */
381 II (a, b, c, d, 12, S41, 0x655b59c3); /* 53 */
382 II (d, a, b, c, 3, S42, 0x8f0ccc92); /* 54 */
383 II (c, d, a, b, 10, S43, 0xffeff47d); /* 55 */
384 II (b, c, d, a, 1, S44, 0x85845dd1); /* 56 */
385 II (a, b, c, d, 8, S41, 0x6fa87e4f); /* 57 */
386 II (d, a, b, c, 15, S42, 0xfe2ce6e0); /* 58 */
387 II (c, d, a, b, 6, S43, 0xa3014314); /* 59 */
388 II (b, c, d, a, 13, S44, 0x4e0811a1); /* 60 */
389 II (a, b, c, d, 4, S41, 0xf7537e82); /* 61 */
390 II (d, a, b, c, 11, S42, 0xbd3af235); /* 62 */
391 II (c, d, a, b, 2, S43, 0x2ad7d2bb); /* 63 */
392 II (b, c, d, a, 9, S44, 0xeb86d391); /* 64 */
409 ctx_dump(MD5_CTX* ctx)
411 static char buf[1024];
412 sprintf(buf, "{A=%x,B=%x,C=%x,D=%x,%d,%d(%d)}",
413 ctx->A, ctx->B, ctx->C, ctx->D,
414 ctx->bytes_low, ctx->bytes_high, (ctx->bytes_low&0x3F));
421 MD5Update(MD5_CTX* ctx, const U8* buf, STRLEN len)
424 STRLEN fill = ctx->bytes_low & 0x3F;
427 static int ucount = 0;
428 fprintf(stderr,"%5i: Update(%s, %p, %d)\n", ++ucount, ctx_dump(ctx),
432 ctx->bytes_low += len;
433 if (ctx->bytes_low < len) /* wrap around */
437 STRLEN missing = 64 - fill;
439 Copy(buf, ctx->buffer + fill, len, U8);
442 Copy(buf, ctx->buffer + fill, missing, U8);
443 MD5Transform(ctx, ctx->buffer, 1);
450 MD5Transform(ctx, buf, blocks);
451 if ( (len &= 0x3F)) {
452 Copy(buf + (blocks << 6), ctx->buffer, len, U8);
458 MD5Final(U8* digest, MD5_CTX *ctx)
460 STRLEN fill = ctx->bytes_low & 0x3F;
461 STRLEN padlen = (fill < 56 ? 56 : 120) - fill;
462 U32 bits_low, bits_high;
464 fprintf(stderr," Final: %s\n", ctx_dump(ctx));
466 Copy(PADDING, ctx->buffer + fill, padlen, U8);
469 bits_low = ctx->bytes_low << 3;
470 bits_high = (ctx->bytes_high << 3) | (ctx->bytes_low >> 29);
472 *(U32*)(ctx->buffer + fill) = BYTESWAP(bits_low); fill += 4;
473 *(U32*)(ctx->buffer + fill) = BYTESWAP(bits_high); fill += 4;
475 u2s(bits_low, ctx->buffer + fill); fill += 4;
476 u2s(bits_high, ctx->buffer + fill); fill += 4;
479 MD5Transform(ctx, ctx->buffer, fill >> 6);
481 fprintf(stderr," Result: %s\n", ctx_dump(ctx));
485 *(U32*)digest = BYTESWAP(ctx->A); digest += 4;
486 *(U32*)digest = BYTESWAP(ctx->B); digest += 4;
487 *(U32*)digest = BYTESWAP(ctx->C); digest += 4;
488 *(U32*)digest = BYTESWAP(ctx->D);
491 u2s(ctx->B, digest+4);
492 u2s(ctx->C, digest+8);
493 u2s(ctx->D, digest+12);
498 #define INT2PTR(any,d) (any)(d)
501 static MD5_CTX* get_md5_ctx(pTHX_ SV* sv)
505 if (!sv_derived_from(sv, "Digest::MD5"))
506 croak("Not a reference to a Digest::MD5 object");
508 for (mg = SvMAGIC(SvRV(sv)); mg; mg = mg->mg_moremagic) {
509 if (mg->mg_type == PERL_MAGIC_ext
510 && mg->mg_virtual == (const MGVTBL * const)&vtbl_md5) {
511 return (MD5_CTX *)mg->mg_ptr;
515 croak("Failed to get MD5_CTX pointer");
516 return (MD5_CTX*)0; /* some compilers insist on a return value */
519 static SV * new_md5_ctx(pTHX_ MD5_CTX *context, const char *klass)
522 SV *obj = newRV_noinc(sv);
527 sv_bless(obj, gv_stashpv(klass, 0));
532 sv_magicext(sv, NULL, PERL_MAGIC_ext, (const MGVTBL * const)&vtbl_md5, (const char *)context, 0);
534 #if defined(USE_ITHREADS) && defined(MGf_DUP)
535 mg->mg_flags |= MGf_DUP;
542 static char* hex_16(const unsigned char* from, char* to)
544 static const char hexdigits[] = "0123456789abcdef";
545 const unsigned char *end = from + 16;
549 *d++ = hexdigits[(*from >> 4)];
550 *d++ = hexdigits[(*from & 0x0F)];
557 static char* base64_16(const unsigned char* from, char* to)
559 static const char base64[] =
560 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
561 const unsigned char *end = from + 16;
562 unsigned char c1, c2, c3;
567 *d++ = base64[c1>>2];
569 *d++ = base64[(c1 & 0x3) << 4];
574 *d++ = base64[((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4)];
575 *d++ = base64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)];
576 *d++ = base64[c3 & 0x3F];
587 static SV* make_mortal_sv(pTHX_ const unsigned char *src, int type)
599 ret = hex_16(src, result);
603 ret = base64_16(src, result);
607 croak("Bad conversion type (%d)", type);
610 return sv_2mortal(newSVpv(ret,len));
614 /********************************************************************/
616 typedef PerlIO* InputStream;
618 MODULE = Digest::MD5 PACKAGE = Digest::MD5
628 if (!SvROK(xclass)) {
630 const char *sclass = SvPV(xclass, my_na);
631 New(55, context, 1, MD5_CTX);
632 ST(0) = sv_2mortal(new_md5_ctx(aTHX_ context, sclass));
634 context = get_md5_ctx(aTHX_ xclass);
643 MD5_CTX* cont = get_md5_ctx(aTHX_ self);
644 const char *myname = sv_reftype(SvRV(self),TRUE);
647 New(55, context, 1, MD5_CTX);
648 ST(0) = sv_2mortal(new_md5_ctx(aTHX_ context, myname));
649 memcpy(context,cont,sizeof(MD5_CTX));
662 MD5_CTX* context = get_md5_ctx(aTHX_ self);
667 for (i = 1; i < items; i++) {
668 U32 had_utf8 = SvUTF8(ST(i));
669 data = (unsigned char *)(SvPVbyte(ST(i), len));
670 MD5Update(context, data, len);
671 if (had_utf8) sv_utf8_upgrade(ST(i));
673 XSRETURN(1); /* self */
680 MD5_CTX* context = get_md5_ctx(aTHX_ self);
681 STRLEN fill = context->bytes_low & 0x3F;
682 #ifdef USE_HEAP_INSTEAD_OF_STACK
683 unsigned char* buffer;
685 unsigned char buffer[4096];
690 #ifdef USE_HEAP_INSTEAD_OF_STACK
691 New(0, buffer, 4096, unsigned char);
695 /* The MD5Update() function is faster if it can work with
696 * complete blocks. This will fill up any buffered block
699 STRLEN missing = 64 - fill;
700 if ( (n = PerlIO_read(fh, buffer, missing)) > 0)
701 MD5Update(context, buffer, n);
703 XSRETURN(1); /* self */
706 /* Process blocks until EOF or error */
707 while ( (n = PerlIO_read(fh, buffer, sizeof(buffer))) > 0) {
708 MD5Update(context, buffer, n);
710 #ifdef USE_HEAP_INSTEAD_OF_STACK
713 if (PerlIO_error(fh)) {
714 croak("Reading from filehandle failed");
718 croak("No filehandle passed");
720 XSRETURN(1); /* self */
726 Digest::MD5::digest = F_BIN
727 Digest::MD5::hexdigest = F_HEX
728 Digest::MD5::b64digest = F_B64
730 unsigned char digeststr[16];
732 MD5Final(digeststr, context);
733 MD5Init(context); /* In case it is reused */
734 ST(0) = make_mortal_sv(aTHX_ digeststr, ix);
746 unsigned long blocks = SvUV(ST(1));
747 unsigned char *buf = (unsigned char *)(SvPV(ST(2), len));
748 ctx->A = buf[ 0] | (buf[ 1]<<8) | (buf[ 2]<<16) | (buf[ 3]<<24);
749 ctx->B = buf[ 4] | (buf[ 5]<<8) | (buf[ 6]<<16) | (buf[ 7]<<24);
750 ctx->C = buf[ 8] | (buf[ 9]<<8) | (buf[10]<<16) | (buf[11]<<24);
751 ctx->D = buf[12] | (buf[13]<<8) | (buf[14]<<16) | (buf[15]<<24);
752 ctx->bytes_low = blocks << 6;
753 ctx->bytes_high = blocks >> 26;
755 buf = (unsigned char *)(SvPV(ST(3), len));
756 MD5Update(ctx, buf, len);
758 XSRETURN(1); /* ctx */
759 } else if (items != 1) {
763 w=ctx->A; out[ 0]=w; out[ 1]=(w>>8); out[ 2]=(w>>16); out[ 3]=(w>>24);
764 w=ctx->B; out[ 4]=w; out[ 5]=(w>>8); out[ 6]=(w>>16); out[ 7]=(w>>24);
765 w=ctx->C; out[ 8]=w; out[ 9]=(w>>8); out[10]=(w>>16); out[11]=(w>>24);
766 w=ctx->D; out[12]=w; out[13]=(w>>8); out[14]=(w>>16); out[15]=(w>>24);
769 ST(0) = sv_2mortal(newSVuv(ctx->bytes_high << 26 |
770 ctx->bytes_low >> 6));
771 ST(1) = sv_2mortal(newSVpv(out, 16));
772 ST(2) = sv_2mortal(newSVpv((char *)ctx->buffer,
773 ctx->bytes_low & 0x3F));
779 Digest::MD5::md5 = F_BIN
780 Digest::MD5::md5_hex = F_HEX
781 Digest::MD5::md5_base64 = F_B64
787 unsigned char digeststr[16];
791 if ((PL_dowarn & G_WARN_ON) || ckWARN(WARN_SYNTAX)) {
795 SV* sv = SvRV(ST(0));
797 if (SvOBJECT(sv) && (name = HvNAME(SvSTASH(sv)))
798 && strEQ(name, "Digest::MD5"))
799 msg = "probably called as method";
801 msg = "called with reference argument";
804 else if (items > 1) {
805 data = (unsigned char *)SvPV(ST(0), len);
806 if (len == 11 && memEQ("Digest::MD5", data, 11)) {
807 msg = "probably called as class method";
809 else if (SvROK(ST(0))) {
810 SV* sv = SvRV(ST(0));
812 if (SvOBJECT(sv) && (name = HvNAME(SvSTASH(sv)))
813 && strEQ(name, "Digest::MD5"))
814 msg = "probably called as method";
818 const char *f = (ix == F_BIN) ? "md5" :
819 (ix == F_HEX) ? "md5_hex" : "md5_base64";
820 warn("&Digest::MD5::%s function %s", f, msg);
824 for (i = 0; i < items; i++) {
825 U32 had_utf8 = SvUTF8(ST(i));
826 data = (unsigned char *)(SvPVbyte(ST(i), len));
827 MD5Update(&ctx, data, len);
828 if (had_utf8) sv_utf8_upgrade(ST(i));
830 MD5Final(digeststr, &ctx);
831 ST(0) = make_mortal_sv(aTHX_ digeststr, ix);