1#!perl -w 2 3use Test qw(plan ok); 4plan tests => 12; 5 6{ 7 package LenDigest; 8 require Digest::base; 9 use vars qw(@ISA); 10 @ISA = qw(Digest::base); 11 12 sub new { 13 my $class = shift; 14 my $str = ""; 15 bless \$str, $class; 16 } 17 18 sub add { 19 my $self = shift; 20 $$self .= join("", @_); 21 return $self; 22 } 23 24 sub digest { 25 my $self = shift; 26 my $len = length($$self); 27 my $first = ($len > 0) ? substr($$self, 0, 1) : "X"; 28 $$self = ""; 29 return sprintf "$first%04d", $len; 30 } 31} 32 33my $ctx = LenDigest->new; 34ok($ctx->digest, "X0000"); 35 36my $EBCDIC = ord('A') == 193; 37 38if ($EBCDIC) { 39 ok($ctx->hexdigest, "e7f0f0f0f0"); 40 ok($ctx->b64digest, "5/Dw8PA"); 41} else { 42 ok($ctx->hexdigest, "5830303030"); 43 ok($ctx->b64digest, "WDAwMDA"); 44} 45 46$ctx->add("foo"); 47ok($ctx->digest, "f0003"); 48 49$ctx->add("foo"); 50ok($ctx->hexdigest, $EBCDIC ? "86f0f0f0f3" : "6630303033"); 51 52$ctx->add("foo"); 53ok($ctx->b64digest, $EBCDIC ? "hvDw8PM" : "ZjAwMDM"); 54 55open(F, ">xxtest$$") || die; 56binmode(F); 57print F "abc" x 100, "\n"; 58close(F) || die; 59 60open(F, "xxtest$$") || die; 61$ctx->addfile(*F); 62close(F); 63unlink("xxtest$$") || warn; 64 65ok($ctx->digest, "a0301"); 66 67eval { 68 $ctx->add_bits("1010"); 69}; 70ok($@ =~ /^Number of bits must be multiple of 8/); 71 72$ctx->add_bits($EBCDIC ? "11100100" : "01010101"); 73ok($ctx->digest, "U0001"); 74 75eval { 76 $ctx->add_bits("abc", 12); 77}; 78ok($@ =~ /^Number of bits must be multiple of 8/); 79 80$ctx->add_bits("abc", 16); 81ok($ctx->digest, "a0002"); 82 83$ctx->add_bits("abc", 32); 84ok($ctx->digest, "a0003"); 85