MD5/Implementation: Difference between revisions
Content deleted Content added
m →{{header|Perl 6}}: Some tweaks for readability. |
m →{{header|Perl 6}}: several tweaks, bring naming closer to RFC 1321, return digest as Buf. |
||
Line 1,715:
<lang perl6>use Test;
sub
sub
sub infix:«<
constant k = ( $_ for ^16),
((5*$_ + 1) % 16 for ^16),
((3*$_ + 5) % 16 for ^16),
((7*$_ ) % 16 for ^16);
sub little-endian($w, $n, *@v) { (@v X+> ($w X* ^$n)) X% (2 ** $w) }
sub md5-pad(Buf $msg)
Line 1,736 ⟶ 1,742:
my \bits = 8 * $msg.elems;
my @padded = $msg.list, 0x80, 0x00 xx (-(bits div 8 + 1 + 8) % 64);
@padded.map({ :256[$^d,$^c,$^b,$^a] }), little-endian(
}
sub md5-block(@H is rw, @
{
my ($A, $B, $C, $D) = @H;
for
my \f = FGHI[i div 16]($
($A, $B, $C, $D)
}
@H «⊞=» ($A, $B, $C, $D);
}
sub md5
{
my @M = md5-pad($msg);
my @H = 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476;
md5-block(@H, @M[$_ .. $_+15]) for 0, 16 ...^ +@M;
Buf.new: little-endian(8, 4, @H);
}
for 'd41d8cd98f00b204e9800998ecf8427e',
'0cc175b9c0f1b6a831c399e269772661',
'900150983cd24fb0d6963f7d28e17f72',
'f96b697d7cb7938d525a2f31aaf161d0',
'c3fcd3d76192e4007dfb496cca67e13b',
'd174ab98d277d9f5a5611c2c9f419d9f',
'57edf4a22be3c955ac49da2e2107b67a',
-> $expected, $msg {
my $digest = md5
is($digest, $expected, "$digest is MD5 digest of '$msg'");
}</lang>
|