#!/usr/local/bin/perl use integer; sub convert($){ my($a,$b,$c,$d,$e,$x,$input,$pl,$sl,$p,$s,$t,@s,@W); $input = join '', @_; my @f = ( sub{(($_[0]&($_[1]^$_[2]))^$_[2])}, sub{($_[0]^$_[1]^$_[2])}, sub{((($_[0]|$_[1])&$_[2])|($_[0]&$_[1]))}, sub{($_[0]^$_[1]^$_[2])} ); my @k=(0x5A827999,0x6ED9EBA1,0x8F1BBCDC,0xCA62C1D6); @s=($a,$b,$c,$d,$e)=(0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476,0xC3D2E1F0); do{ ($s,$input)=unpack("a64a*",$input); $pl +=($sl=length $s); $sl++,$s.="\x80" if $sl<64 && !$p++; @W = unpack("N16",$s."\0"x(63-$sl)); $W[15] = $pl*8 if $sl<57; for(16..79){ $x = $W[$_-3] ^ $W[$_-8] ^ $W[$_-14] ^ $W[$_-16]; push @W,($x<<1)|(($x>>31) & 1); } for($i=0;$i<4;$i++){ ($e,$d,$c,$b,$a) = ($d,$c,(($b<<30)|(($b>>2)&0x3FFFFFFF)),$a,(&{$f[$i]}($b,$c,$d)+$e+$W[($i*20)+$_]+$k[$i]+(($a<<5)|(($a>>27)&31))&0xFFFFFFFF)) for 0..19; } $i=0; @s=($a,$b,$c,$d,$e)=map{($s[$i++]+$_)&0xFFFFFFFF}($a,$b,$c,$d,$e); } while $sl>56; pack 'N5',@s; } $digest = unpack "H*",convert(""); print $digest,"\n"; exit;