Change 20020 by [EMAIL PROTECTED] on 2003/07/05 19:12:21
Upgrade to Digest::MD5 2.25.
Affected files ...
... //depot/perl/MANIFEST#1037 edit
... //depot/perl/ext/Digest/MD5/Changes#10 edit
... //depot/perl/ext/Digest/MD5/MD5.pm#12 edit
... //depot/perl/ext/Digest/MD5/MD5.xs#14 edit
... //depot/perl/ext/Digest/MD5/t/badfile.t#3 edit
... //depot/perl/ext/Digest/MD5/t/clone.t#1 add
... //depot/perl/ext/Digest/MD5/t/files.t#29 edit
Differences ...
==== //depot/perl/MANIFEST#1037 (text) ====
Index: perl/MANIFEST
--- perl/MANIFEST#1036~20000~ Fri Jul 4 13:58:05 2003
+++ perl/MANIFEST Sat Jul 5 12:12:21 2003
@@ -186,6 +186,7 @@
ext/Digest/MD5/README Digest::MD5 extension Readme
ext/Digest/MD5/t/align.t See if Digest::MD5 extension works
ext/Digest/MD5/t/badfile.t See if Digest::MD5 extension works
+ext/Digest/MD5/t/clone.t See if Digest::MD5 extension works
ext/Digest/MD5/t/files.t See if Digest::MD5 extension works
ext/Digest/MD5/t/md5-aaa.t See if Digest::MD5 extension works
ext/Digest/MD5/t/utf8.t See if Digest::MD5 extension works
==== //depot/perl/ext/Digest/MD5/Changes#10 (text) ====
Index: perl/ext/Digest/MD5/Changes
--- perl/ext/Digest/MD5/Changes#9~19986~ Fri Jul 4 05:59:45 2003
+++ perl/ext/Digest/MD5/Changes Sat Jul 5 12:12:21 2003
@@ -1,3 +1,19 @@
+2003-07-04 Gisle Aas <[EMAIL PROTECTED]>
+
+ Release 2.25
+
+ The $md5->addfile method now croaks if it discovers
+ errors on the handle after reading from it. This should
+ make it more difficult to end up with the wrong digest
+ just because you are to lazy to check the error status
+ on your file handles after reading from them.
+
+ Improved documentation.
+
+ Sync up with bleadperl; even safer patchlevel include.
+
+
+
2003-03-09 Gisle Aas <[EMAIL PROTECTED]>
Release 2.24
==== //depot/perl/ext/Digest/MD5/MD5.pm#12 (text) ====
Index: perl/ext/Digest/MD5/MD5.pm
--- perl/ext/Digest/MD5/MD5.pm#11~19986~ Fri Jul 4 05:59:45 2003
+++ perl/ext/Digest/MD5/MD5.pm Sat Jul 5 12:12:21 2003
@@ -3,7 +3,7 @@
use strict;
use vars qw($VERSION @ISA @EXPORT_OK);
-$VERSION = '2.24'; # $Date: 2003/03/09 15:23:10 $
+$VERSION = '2.25'; # $Date: 2003/07/05 05:25:37 $
require Exporter;
*import = \&Exporter::import;
@@ -43,7 +43,7 @@
=head1 SYNOPSIS
# Functional style
- use Digest::MD5 qw(md5 md5_hex md5_base64);
+ use Digest::MD5 qw(md5 md5_hex md5_base64);
$digest = md5($data);
$digest = md5_hex($data);
@@ -72,80 +72,111 @@
use, as well as an object oriented interface that can handle messages
of arbitrary length and which can read files directly.
-A binary digest will be 16 bytes long. A hex digest will be 32
-characters long. A base64 digest will be 22 characters long.
-
=head1 FUNCTIONS
-The following functions can be exported from the C<Digest::MD5>
-module. No functions are exported by default.
+The following functions are provided by the C<Digest::MD5> module.
+None of these functions are exported by default.
=over 4
=item md5($data,...)
This function will concatenate all arguments, calculate the MD5 digest
-of this "message", and return it in binary form.
+of this "message", and return it in binary form. The returned string
+will be 16 bytes long.
+
+The result of md5("a", "b", "c") will be exactly the same as the
+result of md5("abc").
=item md5_hex($data,...)
-Same as md5(), but will return the digest in hexadecimal form.
+Same as md5(), but will return the digest in hexadecimal form. The
+length of the returned string will be 32 and it will only contain
+characters from this set: '0'..'9' and 'a'..'f'.
=item md5_base64($data,...)
Same as md5(), but will return the digest as a base64 encoded string.
-
-The base64 encoded string returned is not padded to be a multiple of 4
-bytes long. If you want interoperability with other base64 encoded
-md5 digests you might want to append the string "==" to the result.
+The length of the returned string will be 22 and it will only contain
+characters from this set: 'A'..'Z', 'a'..'z', '0'..'9', '+' and
+'/'.
+
+Note that the base64 encoded string returned is not padded to be a
+multiple of 4 bytes long. If you want interoperability with other
+base64 encoded md5 digests you might want to append the redundant
+string redundant "==" to the result.
=back
=head1 METHODS
-The following methods are available:
+The object oriented interface to C<Digest::MD5> is described in this
+section. After a C<Digest::MD5> object has been created, you will add
+data to it and finally ask for the digest in a suitable format. A
+single object can be used to calculate multiple digests.
+
+The following methods are provided:
=over 4
=item $md5 = Digest::MD5->new
The constructor returns a new C<Digest::MD5> object which encapsulate
-the state of the MD5 message-digest algorithm. You can add data to
-the object and finally ask for the digest.
+the state of the MD5 message-digest algorithm.
If called as an instance method (i.e. $md5->new) it will just reset the
state the object to the state of a newly created object. No new
object is created in this case.
-=item $md5->clone
-
-This is a copy constructor returning a clone of the $md5 object. It is
-useful when you do not want to destroy the digests state, but need an
-intermediate value of the digest, e.g. when calculating digests
-iteratively on a continuous data stream in order to obtain a copy which
-may be destroyed.
-
=item $md5->reset
This is just an alias for $md5->new.
+=item $md5->clone
+
+This a copy of the $md5 object. It is useful when you do not want to
+destroy the digests state, but need an intermediate value of the
+digest, e.g. when calculating digests iteratively on a continuous data
+stream. Example:
+
+ my $md5 = Digest::MD5->new;
+ while (<>) {
+ $md5->add($_);
+ print "Line $.: ", $md5->clone->hexdigest, "\n";
+ }
+
=item $md5->add($data,...)
The $data provided as argument are appended to the message we
calculate the digest for. The return value is the $md5 object itself.
+All these lines will have the same effect on the state of the $md5
+object:
+
+ $md5->add("a"); $md5->add("b"); $md5->add("c");
+ $md5->add("a")->add("b")->add("c");
+ $md5->add("a", "b", "c");
+ $md5->add("abc");
+
=item $md5->addfile($io_handle)
-The $io_handle is read until EOF and the content is appended to the
+The $io_handle will be read until EOF and its content appended to the
message we calculate the digest for. The return value is the $md5
object itself.
-In most cases you want to make sure that the $io_handle is set up to
-be in binmode().
+The addfile() method will croak() if it fails reading data for some
+reason. If it croaks it is unpredictable what the state of the $md5
+object will be in. The addfile() method might have been able to read
+the file partially before it failed. It is probably wise to discard
+or reset the $md5 object if this occurs.
+
+In most cases you want to make sure that the $io_handle is in
+C<binmode> before you pass it as argument to the addfile() method.
=item $md5->digest
-Return the binary digest for the message.
+Return the binary digest for the message. The returned string will be
+16 bytes long.
Note that the C<digest> operation is effectively a destructive,
read-once operation. Once it has been performed, the C<Digest::MD5>
@@ -155,12 +186,17 @@
=item $md5->hexdigest
-Same as $md5->digest, but will return the digest in hexadecimal form.
+Same as $md5->digest, but will return the digest in hexadecimal
+form. The length of the returned string will be 32 and it will only
+contain characters from this set: '0'..'9' and 'a'..'f'.
=item $md5->b64digest
Same as $md5->digest, but will return the digest as a base64 encoded
-string.
+string. The length of the returned string will be 22 and it will only
+contain characters from this set: 'A'..'Z', 'a'..'z', '0'..'9', '+'
+and '/'.
+
The base64 encoded string returned is not padded to be a multiple of 4
bytes long. If you want interoperability with other base64 encoded
@@ -177,12 +213,11 @@
use Digest::MD5 qw(md5_hex);
print "Digest is ", md5_hex("foobarbaz"), "\n";
-The above example would print out the message
+The above example would print out the message:
Digest is 6df23dc03f9b54cc38a0fc1483df6e21
-provided that the implementation is working correctly. The same
-checksum can also be calculated in OO style:
+The same checksum can also be calculated in OO style:
use Digest::MD5;
@@ -266,9 +301,9 @@
Copyright 1995-1996 Neil Winton.
Copyright 1991-1992 RSA Data Security, Inc.
-The MD5 algorithm is defined in RFC 1321. The basic C code
-implementing the algorithm is derived from that in the RFC and is
-covered by the following copyright:
+The MD5 algorithm is defined in RFC 1321. This implementation is
+derived from the reference C code in RFC 1321 which is covered by
+the following copyright statement:
=over 4
@@ -303,9 +338,9 @@
=head1 AUTHORS
-The original MD5 interface was written by Neil Winton
+The original C<MD5> interface was written by Neil Winton
(C<[EMAIL PROTECTED]>).
-This release was made by Gisle Aas <[EMAIL PROTECTED]>
+The C<Digest::MD5> module is written by Gisle Aas <[EMAIL PROTECTED]>.
=cut
==== //depot/perl/ext/Digest/MD5/MD5.xs#14 (text) ====
Index: perl/ext/Digest/MD5/MD5.xs
--- perl/ext/Digest/MD5/MD5.xs#13~19993~ Fri Jul 4 07:34:40 2003
+++ perl/ext/Digest/MD5/MD5.xs Sat Jul 5 12:12:21 2003
@@ -1,4 +1,4 @@
-/* $Id: MD5.xs,v 1.37 2003/03/09 15:20:43 gisle Exp $ */
+/* $Id: MD5.xs,v 1.39 2003/07/05 05:25:37 gisle Exp $ */
/*
* This library is free software; you can redistribute it and/or
@@ -636,10 +636,17 @@
XSRETURN(1); /* self */
}
- /* Process blocks until EOF */
+ /* Process blocks until EOF or error */
while ( (n = PerlIO_read(fh, buffer, sizeof(buffer)))) {
MD5Update(context, buffer, n);
}
+
+ if (PerlIO_error(fh)) {
+ croak("Reading from filehandle failed");
+ }
+ }
+ else {
+ croak("No filehandle passed");
}
XSRETURN(1); /* self */
==== //depot/perl/ext/Digest/MD5/t/badfile.t#3 (text) ====
Index: perl/ext/Digest/MD5/t/badfile.t
--- perl/ext/Digest/MD5/t/badfile.t#2~16321~ Wed May 1 16:11:54 2002
+++ perl/ext/Digest/MD5/t/badfile.t Sat Jul 5 12:12:21 2003
@@ -1,7 +1,7 @@
# Digest::MD5 2.07 and older used to trigger a core dump when
# passed an illegal file handle that failed to open.
-print "1..2\n";
+print "1..3\n";
use Digest::MD5 ();
@@ -11,11 +11,22 @@
use vars qw(*FOO);
$md5->addfile(*FOO);
};
-print "not " unless $@ =~ /^Bad filehandle: FOO/;
+print "not " unless $@ =~ /^Bad filehandle: FOO at/;
print "ok 1\n";
-open(BAR, "none-existing-file.$$");
-$md5->addfile(*BAR);
-
-print "not " unless $md5->hexdigest eq "d41d8cd98f00b204e9800998ecf8427e";
+open(BAR, "no-existing-file.$$");
+eval {
+ $md5->addfile(*BAR);
+};
+print "not " unless $@ =~ /^No filehandle passed at/;
print "ok 2\n";
+
+open(BAR, ">no-existing-file.$$") || die;
+eval {
+ $md5->addfile(*BAR);
+};
+print "not " unless $@ =~ /^Reading from filehandle failed at/;
+print "ok 3\n";
+
+close(BAR);
+unlink("no-existing-file.$$");
==== //depot/perl/ext/Digest/MD5/t/clone.t#1 (text) ====
Index: perl/ext/Digest/MD5/t/clone.t
--- /dev/null Tue May 5 13:32:27 1998
+++ perl/ext/Digest/MD5/t/clone.t Sat Jul 5 12:12:21 2003
@@ -0,0 +1,41 @@
+#!perl -w
+
+print "1..6\n";
+
+use strict;
+use Digest::MD5 qw(md5_hex);
+
+my $a = Digest::MD5->new;
+$a->add("a");
+my $b = $a->clone;
+
+print "not " unless $b->clone->hexdigest eq md5_hex("a");
+print "ok 1\n";
+
+$a->add("a");
+print "not " unless $a->hexdigest eq md5_hex("aa");
+print "ok 2\n";
+
+print "not " unless $a->hexdigest eq md5_hex("");
+print "ok 3\n";
+
+$b->add("b");
+print "not " unless $b->clone->hexdigest eq md5_hex("ab");
+print "ok 4\n";
+
+$b->add("c");
+print "not " unless $b->clone->hexdigest eq md5_hex("abc");
+print "ok 5\n";
+
+# Test that cloning picks up the correct class for subclasses.
+{
+ package MD5;
+ @MD5::ISA = qw(Digest::MD5);
+}
+
+$a = MD5->new;
+$a->add("a");
+$b = $a->clone;
+
+print "not " unless ref($b) eq "MD5" && $b->add("b")->hexdigest eq md5_hex("ab");
+print "ok 6\n";
==== //depot/perl/ext/Digest/MD5/t/files.t#29 (text) ====
Index: perl/ext/Digest/MD5/t/files.t
--- perl/ext/Digest/MD5/t/files.t#28~19993~ Fri Jul 4 07:34:40 2003
+++ perl/ext/Digest/MD5/t/files.t Sat Jul 5 12:12:21 2003
@@ -20,27 +20,27 @@
my $EXPECT;
if (ord "A" == 193) { # EBCDIC
$EXPECT = <<EOT;
-4ee4091bda2bb74fb2416c2fdb0c4d4a Changes
+fcc48d6bb88ca8065bf9ddfcb9e7483e Changes
0565ec21b15c0f23f4c51fb327c8926d README
-b00637894d2bd395ffda2fa84adefdfd MD5.pm
-69a111069b0948dc9344f73e6524317a MD5.xs
+1965beb0e48253b694220fbb5d6230f5 MD5.pm
+5b3c24da3f70f3c0938cc7c205a28ab7 MD5.xs
276da0aa4e9a08b7fe09430c9c5690aa rfc1321.txt
EOT
} elsif ("\n" eq "\015") { # MacOS
$EXPECT = <<EOT;
-0b95218ddeca76d2ccd6362b8e7c05a4 Changes
+f161f474603c54a0093ad2f6f93be33b Changes
6c950a0211a5a28f023bb482037698cd README
-f854bd4984ad0e73c483a49a28893c74 MD5.pm
-810dbca708183e3402f3354e5bbf8401 MD5.xs
+18178c90bc13d6824f6c96973b6e9433 MD5.pm
+2c7fdb2ffa3840dc4f8dcdcf13241015 MD5.xs
754b9db19f79dbc4992f7166eb0f37ce rfc1321.txt
EOT
} else {
# This is the output of: 'md5sum Changes README MD5.pm MD5.xs rfc1321.txt'
$EXPECT = <<EOT;
-d7b1bf11283114d1b765f433a5d7b447 Changes
+029fa5059ba0b2175cee09ab5d9b7b73 Changes
6c950a0211a5a28f023bb482037698cd README
-f854bd4984ad0e73c483a49a28893c74 MD5.pm
-810dbca708183e3402f3354e5bbf8401 MD5.xs
+18178c90bc13d6824f6c96973b6e9433 MD5.pm
+2c7fdb2ffa3840dc4f8dcdcf13241015 MD5.xs
754b9db19f79dbc4992f7166eb0f37ce rfc1321.txt
EOT
}
End of Patch.