MD4: Difference between revisions
Content added Content deleted
(→{{header|Raku}}: use native types) |
|||
Line 1,982: | Line 1,982: | ||
(formerly Perl 6) |
(formerly Perl 6) |
||
<syntaxhighlight lang="raku" line>sub md4($str) { |
<syntaxhighlight lang="raku" line>sub md4($str) { |
||
my |
my @buf = $str.ords; |
||
my |
my $buflen = @buf.elems; |
||
⚫ | |||
⚫ | |||
⚫ | |||
# for some reason we have to type v here |
|||
⚫ | |||
my \mask = (1 +< 32) - 1; |
|||
sub pack-le (@a) { @a.rotor(4).map: {:256[.reverse]} } |
|||
my &f = -> $x, $y, $z { ($x +& $y) +| ($x +^ mask) +& $z } |
|||
⚫ | |||
⚫ | |||
⚫ | |||
sub pack-le (@a) { |
|||
gather for @a -> $a,$b,$c,$d { take $d +< 24 + $c +< 16 + $b +< 8 + $a } |
|||
⚫ | |||
my |
my ($a, $b, $c, $d) = 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476; |
||
my $term = False; |
my $term = False; |
||
my $last = False; |
my $last = False; |
||
my $off = 0; |
|||
repeat until $last { |
|||
my @block = @$ |
my @block = @buf[$off..$off+63]:v; $off += 64; |
||
my |
my @x; |
||
given +@block { |
given +@block { |
||
when 64 { |
|||
@x = pack-le @block; |
|||
⚫ | |||
$term = True; |
|||
when 56..63 { |
|||
@block.push(0x80); |
|||
$term = True; |
|||
@block.push(0x80); |
|||
@block.push(slip 0 xx 63 - $_); |
|||
@x = pack-le @block; |
|||
⚫ | |||
@block.push($term ?? 0 !! 0x80); |
|||
when 0..55 { |
|||
@block.push(slip 0 xx 55 - $_); |
|||
@block.push($term ?? 0 !! 0x80); |
|||
@block.push(slip 0 xx 55 - $_); |
|||
@x = pack-le @block; |
|||
@x.push: $bit_len, $bit_len +> 32; |
|||
my $bit_len = $buflen +< 3; |
|||
@x.push: $bit_len +& mask, $bit_len +> 32; |
|||
$last = True; |
|||
} |
|||
default { |
|||
die "oops"; |
|||
} |
|||
} |
|||
my ($aa, $bb, $cc, $dd) = $a, $b, $c, $d; |
|||
for 0, 4, 8, 12 -> \i { |
|||
$a = r($a + f($b, $c, $d) + @x[ i+0 ], 3); |
|||
$d = r($d + f($a, $b, $c) + @x[ i+1 ], 7); |
|||
$c = r($c + f($d, $a, $b) + @x[ i+2 ], 11); |
|||
$b = r($b + f($c, $d, $a) + @x[ i+3 ], 19); |
|||
} |
|||
⚫ | |||
for 0, 1, 2, 3 -> \i { |
|||
$a = r($a + g($b, $c, $d) + @x[ i+0 ] + 0x5a827999, 3); |
|||
$d = r($d + g($a, $b, $c) + @x[ i+4 ] + 0x5a827999, 5); |
|||
$c = r($c + g($d, $a, $b) + @x[ i+8 ] + 0x5a827999, 9); |
|||
$b = r($b + g($c, $d, $a) + @x[ i+12] + 0x5a827999, 13); |
|||
} |
|||
⚫ | |||
for 0, 2, 1, 3 -> \i { |
|||
$a = r($a + h($b, $c, $d) + @x[ i+0 ] + 0x6ed9eba1, 3); |
|||
$d = r($d + h($a, $b, $c) + @x[ i+8 ] + 0x6ed9eba1, 9); |
|||
$c = r($c + h($d, $a, $b) + @x[ i+4 ] + 0x6ed9eba1, 11); |
|||
$b = r($b + h($c, $d, $a) + @x[ i+12] + 0x6ed9eba1, 15); |
|||
} |
|||
⚫ | |||
$a = ($a + $aa) +& mask; |
|||
$b = ($b + $bb) +& mask; |
|||
$c = ($c + $cc) +& mask; |
|||
$d = ($d + $dd) +& mask; |
|||
} |
} |
||
sub b2l($n is copy) { |
|||
my $x = 0; |
|||
for $a, $b, $c, $d { $abcd.write-uint32: 4*$++, $_, LittleEndian } |
|||
for ^4 { |
|||
:256[@$abcd]; |
|||
$x +<= 8; |
|||
⚫ | |||
$n +>= 8; |
|||
} |
|||
$x; |
|||
} |
|||
b2l($a) +< 96 + |
|||
b2l($b) +< 64 + |
|||
b2l($c) +< 32 + |
|||
b2l($d); |
|||
} |
} |
||