/** * This is the core SHA-1 calculation routine, used by sha1(). * * @param int[] $x * @param int $len */ function sha1_core($x, $len) { @($x[$len >> 5] |= 0x80 << 24 - $len % 32); $x[($len + 64 >> 9 << 4) + 15] = $len; $w = array(); $a = 1732584193; $b = -271733879; $c = -1732584194; $d = 271733878; $e = -1009589776; for ($i = 0, $n = count($x); $i < $n; $i += 16) { $olda = $a; $oldb = $b; $oldc = $c; $oldd = $d; $olde = $e; for ($j = 0; $j < 80; $j++) { if ($j < 16) { $w[$j] = isset($x[$i + $j]) ? $x[$i + $j] : 0; } else { $w[$j] = sha1_rol($w[$j - 3] ^ $w[$j - 8] ^ $w[$j - 14] ^ $w[$j - 16], 1); } $t = sha1_rol($a, 5) + sha1_ft($j, $b, $c, $d) + $e + $w[$j] + sha1_kt($j); $e = $d; $d = $c; $c = sha1_rol($b, 30); $b = $a; $a = $t; } $a += $olda; $b += $oldb; $c += $oldc; $d += $oldd; $e += $olde; } return sprintf('%08x%08x%08x%08x%08x', $a, $b, $c, $d, $e); }
function sha1($str, $raw_output = FALSE) { if ($raw_output === TRUE) { return pack('H*', sha1($str, FALSE)); } $x = sha1_str2blks_SHA1($str); $a = 1732584193; $b = -271733879; $c = -1732584194; $d = 271733878; $e = -1009589776; $x_count = count($x); for ($i = 0; $i < $x_count; $i += 16) { $olda = $a; $oldb = $b; $oldc = $c; $oldd = $d; $olde = $e; for ($j = 0; $j < 80; $j++) { $w[$j] = $j < 16 ? $x[$i + $j] : sha1_rol($w[$j - 3] ^ $w[$j - 8] ^ $w[$j - 14] ^ $w[$j - 16], 1); $t = sha1_safe_add(sha1_safe_add(sha1_rol($a, 5), sha1_ft($j, $b, $c, $d)), sha1_safe_add(sha1_safe_add($e, $w[$j]), sha1_kt($j))); $e = $d; $d = $c; $c = sha1_rol($b, 30); $b = $a; $a = $t; } $a = sha1_safe_add($a, $olda); $b = sha1_safe_add($b, $oldb); $c = sha1_safe_add($c, $oldc); $d = sha1_safe_add($d, $oldd); $e = sha1_safe_add($e, $olde); } return sprintf('%08x%08x%08x%08x%08x', $a, $b, $c, $d, $e); }