summaryrefslogtreecommitdiff
path: root/ext/hash/tests
diff options
context:
space:
mode:
Diffstat (limited to 'ext/hash/tests')
-rw-r--r--ext/hash/tests/adler32.phpt22
-rw-r--r--ext/hash/tests/bug52240.phpt19
-rw-r--r--ext/hash/tests/crc32.phpt36
-rw-r--r--ext/hash/tests/fnv132.phpt202
-rw-r--r--ext/hash/tests/fnv164.phpt202
-rw-r--r--ext/hash/tests/gost.phpt20
-rw-r--r--ext/hash/tests/hash_algos.phpt109
-rw-r--r--ext/hash/tests/hash_copy_001.phpt292
-rw-r--r--ext/hash/tests/hash_copy_002.phpt22
-rw-r--r--ext/hash/tests/hash_error.phpt48
-rw-r--r--ext/hash/tests/hash_file_basic.phpt44
-rw-r--r--ext/hash/tests/hash_file_basic1.phpt85
-rw-r--r--ext/hash/tests/hash_file_error.phpt67
-rw-r--r--ext/hash/tests/hash_hmac_basic.phpt66
-rw-r--r--ext/hash/tests/hash_hmac_error.phpt54
-rw-r--r--ext/hash/tests/hash_hmac_file_basic.phpt101
-rw-r--r--ext/hash/tests/hash_hmac_file_error.phpt54
-rw-r--r--ext/hash/tests/haval.phpt76
-rw-r--r--ext/hash/tests/hmac-md5.phpt20
-rw-r--r--ext/hash/tests/joaat.phpt34
-rw-r--r--ext/hash/tests/md2.phpt21
-rw-r--r--ext/hash/tests/md4.phpt24
-rw-r--r--ext/hash/tests/md5.phpt16
-rw-r--r--ext/hash/tests/mhash_001.phpt71
-rw-r--r--ext/hash/tests/mhash_002.phpt64
-rw-r--r--ext/hash/tests/mhash_003.phpt71
-rw-r--r--ext/hash/tests/mhash_004.phpt19
-rw-r--r--ext/hash/tests/ripemd128.phpt25
-rw-r--r--ext/hash/tests/ripemd160.phpt25
-rw-r--r--ext/hash/tests/ripemd256.phpt25
-rw-r--r--ext/hash/tests/ripemd320.phpt25
-rw-r--r--ext/hash/tests/sha1.phpt21
-rw-r--r--ext/hash/tests/sha224.phpt22
-rw-r--r--ext/hash/tests/sha256.phpt22
-rw-r--r--ext/hash/tests/sha384.phpt21
-rw-r--r--ext/hash/tests/sha512.phpt21
-rw-r--r--ext/hash/tests/skip_mhash.inc5
-rw-r--r--ext/hash/tests/snefru.phpt18
-rw-r--r--ext/hash/tests/tiger.phpt19
-rw-r--r--ext/hash/tests/whirlpool.phpt14
40 files changed, 2122 insertions, 0 deletions
diff --git a/ext/hash/tests/adler32.phpt b/ext/hash/tests/adler32.phpt
new file mode 100644
index 0000000..eab2a3f
--- /dev/null
+++ b/ext/hash/tests/adler32.phpt
@@ -0,0 +1,22 @@
+--TEST--
+ADLER32
+--SKIPIF--
+<?php extension_loaded('hash') or die('skip'); ?>
+--FILE--
+<?php
+echo hash('adler32', ''), "\n";
+echo hash('adler32', 'a'), "\n";
+echo hash('adler32', 'abc'), "\n";
+echo hash('adler32', 'message digest'), "\n";
+echo hash('adler32', 'abcdefghijklmnopqrstuvwxyz'), "\n";
+echo hash('adler32', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'), "\n";
+echo hash('adler32', '12345678901234567890123456789012345678901234567890123456789012345678901234567890'), "\n";
+?>
+--EXPECT--
+00000001
+00620062
+024d0127
+29750586
+90860b20
+8adb150c
+97b61069
diff --git a/ext/hash/tests/bug52240.phpt b/ext/hash/tests/bug52240.phpt
new file mode 100644
index 0000000..1f8472c
--- /dev/null
+++ b/ext/hash/tests/bug52240.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Bug #52240 (hash_copy() does not copy the HMAC key, causes wrong results and PHP crashes)
+--SKIPIF--
+<?php extension_loaded('hash') or die('skip'); ?>
+--FILE--
+<?php
+
+$h = hash_init('crc32b', HASH_HMAC, '123456' );
+$h2 = hash_copy($h);
+var_dump(hash_final($h));
+$h3 = hash_copy($h2);
+var_dump(hash_final($h2));
+var_dump(hash_final($h3));
+
+?>
+--EXPECT--
+string(8) "278af264"
+string(8) "278af264"
+string(8) "278af264"
diff --git a/ext/hash/tests/crc32.phpt b/ext/hash/tests/crc32.phpt
new file mode 100644
index 0000000..3862fb1
--- /dev/null
+++ b/ext/hash/tests/crc32.phpt
@@ -0,0 +1,36 @@
+--TEST--
+CRC32
+--SKIPIF--
+<?php extension_loaded('hash') or die('skip'); ?>
+--FILE--
+<?php
+echo hash('crc32', ''), "\n";
+echo hash('crc32', 'a'), "\n";
+echo hash('crc32', 'abc'), "\n";
+echo hash('crc32', 'message digest'), "\n";
+echo hash('crc32', 'abcdefghijklmnopqrstuvwxyz'), "\n";
+echo hash('crc32', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'), "\n";
+echo hash('crc32', '12345678901234567890123456789012345678901234567890123456789012345678901234567890'), "\n";
+echo hash('crc32b', ''), "\n";
+echo hash('crc32b', 'a'), "\n";
+echo hash('crc32b', 'abc'), "\n";
+echo hash('crc32b', 'message digest'), "\n";
+echo hash('crc32b', 'abcdefghijklmnopqrstuvwxyz'), "\n";
+echo hash('crc32b', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'), "\n";
+echo hash('crc32b', '12345678901234567890123456789012345678901234567890123456789012345678901234567890'), "\n";
+?>
+--EXPECT--
+00000000
+6b9b9319
+73bb8c64
+5703c9bf
+9693bf77
+882174a0
+96790816
+00000000
+e8b7be43
+352441c2
+20159d7f
+4c2750bd
+1fc2e6d2
+7ca94a72
diff --git a/ext/hash/tests/fnv132.phpt b/ext/hash/tests/fnv132.phpt
new file mode 100644
index 0000000..051386a
--- /dev/null
+++ b/ext/hash/tests/fnv132.phpt
@@ -0,0 +1,202 @@
+--TEST--
+FNV
+--SKIPIF--
+<?php extension_loaded('hash') or die ('Skip - hash extension not available'); ?>
+--FILE--
+<?php
+
+function R10($t) {
+ return str_repeat($t, 10);
+}
+
+function R500($t) {
+ return str_repeat($t, 500);
+}
+
+$tests = array(
+ array( "", "811c9dc5" ),
+ array( "a", "050c5d7e" ),
+ array( "b", "050c5d7d" ),
+ array( "c", "050c5d7c" ),
+ array( "d", "050c5d7b" ),
+ array( "e", "050c5d7a" ),
+ array( "f", "050c5d79" ),
+ array( "fo", "6b772514" ),
+ array( "foo", "408f5e13" ),
+ array( "foob", "b4b1178b" ),
+ array( "fooba", "fdc80fb0" ),
+ array( "foobar", "31f0b262" ),
+ array( "\0", "050c5d1f" ),
+ array( "a\0", "70772d5a" ),
+ array( "b\0", "6f772bc7" ),
+ array( "c\0", "6e772a34" ),
+ array( "d\0", "6d7728a1" ),
+ array( "e\0", "6c77270e" ),
+ array( "f\0", "6b77257b" ),
+ array( "fo\0", "408f5e7c" ),
+ array( "foo\0", "b4b117e9" ),
+ array( "foob\0", "fdc80fd1" ),
+ array( "fooba\0", "31f0b210" ),
+ array( "foobar\0", "ffe8d046" ),
+ array( "ch", "6e772a5c" ),
+ array( "cho", "4197aebb" ),
+ array( "chon", "fcc8100f" ),
+ array( "chong", "fdf147fa" ),
+ array( "chongo", "bcd44ee1" ),
+ array( "chongo ", "23382c13" ),
+ array( "chongo w", "846d619e" ),
+ array( "chongo wa", "1630abdb" ),
+ array( "chongo was", "c99e89b2" ),
+ array( "chongo was ", "1692c316" ),
+ array( "chongo was h", "9f091bca" ),
+ array( "chongo was he", "2556be9b" ),
+ array( "chongo was her", "628e0e73" ),
+ array( "chongo was here", "98a0bf6c" ),
+ array( "chongo was here!", "b10d5725" ),
+ array( "chongo was here!\n", "dd002f35" ),
+ array( "ch\0", "4197aed4" ),
+ array( "cho\0", "fcc81061" ),
+ array( "chon\0", "fdf1479d" ),
+ array( "chong\0", "bcd44e8e" ),
+ array( "chongo\0", "23382c33" ),
+ array( "chongo \0", "846d61e9" ),
+ array( "chongo w\0", "1630abba" ),
+ array( "chongo wa\0", "c99e89c1" ),
+ array( "chongo was\0", "1692c336" ),
+ array( "chongo was \0", "9f091ba2" ),
+ array( "chongo was h\0", "2556befe" ),
+ array( "chongo was he\0", "628e0e01" ),
+ array( "chongo was her\0", "98a0bf09" ),
+ array( "chongo was here\0", "b10d5704" ),
+ array( "chongo was here!\0", "dd002f3f" ),
+ array( "chongo was here!\n\0", "1c4a506f" ),
+ array( "cu", "6e772a41" ),
+ array( "cur", "26978421" ),
+ array( "curd", "e184ff97" ),
+ array( "curds", "9b5e5ac6" ),
+ array( "curds ", "5b88e592" ),
+ array( "curds a", "aa8164b7" ),
+ array( "curds an", "20b18c7b" ),
+ array( "curds and", "f28025c5" ),
+ array( "curds and ", "84bb753f" ),
+ array( "curds and w", "3219925a" ),
+ array( "curds and wh", "384163c6" ),
+ array( "curds and whe", "54f010d7" ),
+ array( "curds and whey", "8cea820c" ),
+ array( "curds and whey\n", "e12ab8ee" ),
+ array( "cu\0", "26978453" ),
+ array( "cur\0", "e184fff3" ),
+ array( "curd\0", "9b5e5ab5" ),
+ array( "curds\0", "5b88e5b2" ),
+ array( "curds \0", "aa8164d6" ),
+ array( "curds a\0", "20b18c15" ),
+ array( "curds an\0", "f28025a1" ),
+ array( "curds and\0", "84bb751f" ),
+ array( "curds and \0", "3219922d" ),
+ array( "curds and w\0", "384163ae" ),
+ array( "curds and wh\0", "54f010b2" ),
+ array( "curds and whe\0", "8cea8275" ),
+ array( "curds and whey\0", "e12ab8e4" ),
+ array( "curds and whey\n\0", "64411eaa" ),
+ array( "line 1\nline 2\nline 3", "31ae8f83" ),
+ array( "chongo <Landon Curt Noll> /\\../\\", "995fa9c4" ),
+ array( "chongo <Landon Curt Noll> /\\../\\\0", "35983f8c" ),
+ array( "chongo (Landon Curt Noll) /\\../\\", "5036a251" ),
+ array( "chongo (Landon Curt Noll) /\\../\\\0", "97018583" ),
+ array( "http://antwrp.gsfc.nasa.gov/apod/astropix.html", "b4448d60" ),
+ array( "http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash", "025dfe59" ),
+ array( "http://epod.usra.edu/", "c5eab3af" ),
+ array( "http://exoplanet.eu/", "7d21ba1e" ),
+ array( "http://hvo.wr.usgs.gov/cam3/", "7704cddb" ),
+ array( "http://hvo.wr.usgs.gov/cams/HMcam/", "d0071bfe" ),
+ array( "http://hvo.wr.usgs.gov/kilauea/update/deformation.html", "0ff3774c" ),
+ array( "http://hvo.wr.usgs.gov/kilauea/update/images.html", "b0fea0ea" ),
+ array( "http://hvo.wr.usgs.gov/kilauea/update/maps.html", "58177303" ),
+ array( "http://hvo.wr.usgs.gov/volcanowatch/current_issue.html", "4f599cda" ),
+ array( "http://neo.jpl.nasa.gov/risk/", "3e590a47" ),
+ array( "http://norvig.com/21-days.html", "965595f8" ),
+ array( "http://primes.utm.edu/curios/home.php", "c37f178d" ),
+ array( "http://slashdot.org/", "9711dd26" ),
+ array( "http://tux.wr.usgs.gov/Maps/155.25-19.5.html", "23c99b7f" ),
+ array( "http://volcano.wr.usgs.gov/kilaueastatus.php", "6e568b17" ),
+ array( "http://www.avo.alaska.edu/activity/Redoubt.php", "43f0245b" ),
+ array( "http://www.dilbert.com/fast/", "bcb7a001" ),
+ array( "http://www.fourmilab.ch/gravitation/orbits/", "12e6dffe" ),
+ array( "http://www.fpoa.net/", "0792f2d6" ),
+ array( "http://www.ioccc.org/index.html", "b966936b" ),
+ array( "http://www.isthe.com/cgi-bin/number.cgi", "46439ac5" ),
+ array( "http://www.isthe.com/chongo/bio.html", "728d49af" ),
+ array( "http://www.isthe.com/chongo/index.html", "d33745c9" ),
+ array( "http://www.isthe.com/chongo/src/calc/lucas-calc", "bc382a57" ),
+ array( "http://www.isthe.com/chongo/tech/astro/venus2004.html", "4bda1d31" ),
+ array( "http://www.isthe.com/chongo/tech/astro/vita.html", "ce35ccae" ),
+ array( "http://www.isthe.com/chongo/tech/comp/c/expert.html", "3b6eed94" ),
+ array( "http://www.isthe.com/chongo/tech/comp/calc/index.html", "445c9c58" ),
+ array( "http://www.isthe.com/chongo/tech/comp/fnv/index.html", "3db8bf9d" ),
+ array( "http://www.isthe.com/chongo/tech/math/number/howhigh.html", "2dee116d" ),
+ array( "http://www.isthe.com/chongo/tech/math/number/number.html", "c18738da" ),
+ array( "http://www.isthe.com/chongo/tech/math/prime/mersenne.html", "5b156176" ),
+ array( "http://www.isthe.com/chongo/tech/math/prime/mersenne.html#largest", "2aa7d593" ),
+ array( "http://www.lavarnd.org/cgi-bin/corpspeak.cgi", "b2409658" ),
+ array( "http://www.lavarnd.org/cgi-bin/haiku.cgi", "e1489528" ),
+ array( "http://www.lavarnd.org/cgi-bin/rand-none.cgi", "fe1ee07e" ),
+ array( "http://www.lavarnd.org/cgi-bin/randdist.cgi", "e8842315" ),
+ array( "http://www.lavarnd.org/index.html", "3a6a63a2" ),
+ array( "http://www.lavarnd.org/what/nist-test.html", "06d2c18c" ),
+ array( "http://www.macosxhints.com/", "f8ef7225" ),
+ array( "http://www.mellis.com/", "843d3300" ),
+ array( "http://www.nature.nps.gov/air/webcams/parks/havoso2alert/havoalert.cfm", "bb24f7ae" ),
+ array( "http://www.nature.nps.gov/air/webcams/parks/havoso2alert/timelines_24.cfm", "878c0ec9" ),
+ array( "http://www.paulnoll.com/", "b557810f" ),
+ array( "http://www.pepysdiary.com/", "57423246" ),
+ array( "http://www.sciencenews.org/index/home/activity/view", "87f7505e" ),
+ array( "http://www.skyandtelescope.com/", "bb809f20" ),
+ array( "http://www.sput.nl/~rob/sirius.html", "8932abb5" ),
+ array( "http://www.systemexperts.com/", "0a9b3aa0" ),
+ array( "http://www.tq-international.com/phpBB3/index.php", "b8682a24" ),
+ array( "http://www.travelquesttours.com/index.htm", "a7ac1c56" ),
+ array( "http://www.wunderground.com/global/stations/89606.html", "11409252" ),
+ array( R10("21701"), "a987f517" ),
+ array( R10("M21701"), "f309e7ed" ),
+ array( R10("2^21701-1"), "c9e8f417" ),
+ array( R10("\x54\xc5"), "7f447bdd" ),
+ array( R10("\xc5\x54"), "b929adc5" ),
+ array( R10("23209"), "57022879" ),
+ array( R10("M23209"), "dcfd2c49" ),
+ array( R10("2^23209-1"), "6edafff5" ),
+ array( R10("\x5a\xa9"), "f04fb1f1" ),
+ array( R10("\xa9\x5a"), "fb7de8b9" ),
+ array( R10("391581216093"), "c5f1d7e9" ),
+ array( R10("391581*2^216093-1"), "32c1f439" ),
+ array( R10("\x05\xf9\x9d\x03\x4c\x81"), "7fd3eb7d" ),
+ array( R10("FEDCBA9876543210"), "81597da5" ),
+ array( R10("\xfe\xdc\xba\x98\x76\x54\x32\x10"), "05eb7a25" ),
+ array( R10("EFCDAB8967452301"), "9c0fa1b5" ),
+ array( R10("\xef\xcd\xab\x89\x67\x45\x23\x01"), "53ccb1c5" ),
+ array( R10("0123456789ABCDEF"), "fabece15" ),
+ array( R10("\x01\x23\x45\x67\x89\xab\xcd\xef"), "4ad745a5" ),
+ array( R10("1032547698BADCFE"), "e5bdc495" ),
+ array( R10("\x10\x32\x54\x76\x98\xba\xdc\xfe"), "23b3c0a5" ),
+ array( R500("\x00"), "fa823dd5" ),
+ array( R500("\x07"), "0c6c58b9" ),
+ array( R500("~"), "e2dbccd5" ),
+ array( R500("\x7f"), "db7f50f9" ),
+);
+
+$i = 0;
+$pass = true;
+foreach($tests as $test) {
+ $result = hash('fnv132', $test[0]);
+ if ($result != $test[1]) {
+ echo "Iteration " . $i . " failed - expected '" . $test[1] . "', got '" . $result . "' for '" . $test[1] . "'\n";
+ $pass = false;
+ }
+ $i++;
+}
+
+if($pass) {
+ echo "PASS";
+}
+?>
+--EXPECT--
+PASS
diff --git a/ext/hash/tests/fnv164.phpt b/ext/hash/tests/fnv164.phpt
new file mode 100644
index 0000000..b5e6942
--- /dev/null
+++ b/ext/hash/tests/fnv164.phpt
@@ -0,0 +1,202 @@
+--TEST--
+FNV
+--SKIPIF--
+<?php extension_loaded('hash') or die ('Skip - hash extension not available'); ?>
+--FILE--
+<?php
+
+function R10($t) {
+ return str_repeat($t, 10);
+}
+
+function R500($t) {
+ return str_repeat($t, 500);
+}
+
+$tests = array(
+ array( "", "cbf29ce484222325" ),
+ array( "a", "af63bd4c8601b7be" ),
+ array( "b", "af63bd4c8601b7bd" ),
+ array( "c", "af63bd4c8601b7bc" ),
+ array( "d", "af63bd4c8601b7bb" ),
+ array( "e", "af63bd4c8601b7ba" ),
+ array( "f", "af63bd4c8601b7b9" ),
+ array( "fo", "08326207b4eb2f34" ),
+ array( "foo", "d8cbc7186ba13533" ),
+ array( "foob", "0378817ee2ed65cb" ),
+ array( "fooba", "d329d59b9963f790" ),
+ array( "foobar", "340d8765a4dda9c2" ),
+ array( "\0", "af63bd4c8601b7df" ),
+ array( "a\0", "08326707b4eb37da" ),
+ array( "b\0", "08326607b4eb3627" ),
+ array( "c\0", "08326507b4eb3474" ),
+ array( "d\0", "08326407b4eb32c1" ),
+ array( "e\0", "08326307b4eb310e" ),
+ array( "f\0", "08326207b4eb2f5b" ),
+ array( "fo\0", "d8cbc7186ba1355c" ),
+ array( "foo\0", "0378817ee2ed65a9" ),
+ array( "foob\0", "d329d59b9963f7f1" ),
+ array( "fooba\0", "340d8765a4dda9b0" ),
+ array( "foobar\0", "50a6d3b724a774a6" ),
+ array( "ch", "08326507b4eb341c" ),
+ array( "cho", "d8d5c8186ba98bfb" ),
+ array( "chon", "1ccefc7ef118dbef" ),
+ array( "chong", "0c92fab3ad3db77a" ),
+ array( "chongo", "9b77794f5fdec421" ),
+ array( "chongo ", "0ac742dfe7874433" ),
+ array( "chongo w", "d7dad5766ad8e2de" ),
+ array( "chongo wa", "a1bb96378e897f5b" ),
+ array( "chongo was", "5b3f9b6733a367d2" ),
+ array( "chongo was ", "b07ce25cbea969f6" ),
+ array( "chongo was h", "8d9e9997f9df0d6a" ),
+ array( "chongo was he", "838c673d9603cb7b" ),
+ array( "chongo was her", "8b5ee8a5e872c273" ),
+ array( "chongo was here", "4507c4e9fb00690c" ),
+ array( "chongo was here!", "4c9ca59581b27f45" ),
+ array( "chongo was here!\n", "e0aca20b624e4235" ),
+ array( "ch\0", "d8d5c8186ba98b94" ),
+ array( "cho\0", "1ccefc7ef118db81" ),
+ array( "chon\0", "0c92fab3ad3db71d" ),
+ array( "chong\0", "9b77794f5fdec44e" ),
+ array( "chongo\0", "0ac742dfe7874413" ),
+ array( "chongo \0", "d7dad5766ad8e2a9" ),
+ array( "chongo w\0", "a1bb96378e897f3a" ),
+ array( "chongo wa\0", "5b3f9b6733a367a1" ),
+ array( "chongo was\0", "b07ce25cbea969d6" ),
+ array( "chongo was \0", "8d9e9997f9df0d02" ),
+ array( "chongo was h\0", "838c673d9603cb1e" ),
+ array( "chongo was he\0", "8b5ee8a5e872c201" ),
+ array( "chongo was her\0", "4507c4e9fb006969" ),
+ array( "chongo was here\0", "4c9ca59581b27f64" ),
+ array( "chongo was here!\0", "e0aca20b624e423f" ),
+ array( "chongo was here!\n\0", "13998e580afa800f" ),
+ array( "cu", "08326507b4eb3401" ),
+ array( "cur", "d8d5ad186ba95dc1" ),
+ array( "curd", "1c72e17ef0ca4e97" ),
+ array( "curds", "2183c1b327c38ae6" ),
+ array( "curds ", "b66d096c914504f2" ),
+ array( "curds a", "404bf57ad8476757" ),
+ array( "curds an", "887976bd815498bb" ),
+ array( "curds and", "3afd7f02c2bf85a5" ),
+ array( "curds and ", "fc4476b0eb70177f" ),
+ array( "curds and w", "186d2da00f77ecba" ),
+ array( "curds and wh", "f97140fa48c74066" ),
+ array( "curds and whe", "a2b1cf49aa926d37" ),
+ array( "curds and whey", "0690712cd6cf940c" ),
+ array( "curds and whey\n", "f7045b3102b8906e" ),
+ array( "cu\0", "d8d5ad186ba95db3" ),
+ array( "cur\0", "1c72e17ef0ca4ef3" ),
+ array( "curd\0", "2183c1b327c38a95" ),
+ array( "curds\0", "b66d096c914504d2" ),
+ array( "curds \0", "404bf57ad8476736" ),
+ array( "curds a\0", "887976bd815498d5" ),
+ array( "curds an\0", "3afd7f02c2bf85c1" ),
+ array( "curds and\0", "fc4476b0eb70175f" ),
+ array( "curds and \0", "186d2da00f77eccd" ),
+ array( "curds and w\0", "f97140fa48c7400e" ),
+ array( "curds and wh\0", "a2b1cf49aa926d52" ),
+ array( "curds and whe\0", "0690712cd6cf9475" ),
+ array( "curds and whey\0", "f7045b3102b89064" ),
+ array( "curds and whey\n\0", "74f762479f9d6aea" ),
+ array( "line 1\nline 2\nline 3", "a64e5f36c9e2b0e3" ),
+ array( "chongo <Landon Curt Noll> /\\../\\", "8fd0680da3088a04" ),
+ array( "chongo <Landon Curt Noll> /\\../\\\0", "67aad32c078284cc" ),
+ array( "chongo (Landon Curt Noll) /\\../\\", "b37d55d81c57b331" ),
+ array( "chongo (Landon Curt Noll) /\\../\\\0", "55ac0f3829057c43" ),
+ array( "http://antwrp.gsfc.nasa.gov/apod/astropix.html", "cb27f4b8e1b6cc20" ),
+ array( "http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash", "26caf88bcbef2d19" ),
+ array( "http://epod.usra.edu/", "8e6e063b97e61b8f" ),
+ array( "http://exoplanet.eu/", "b42750f7f3b7c37e" ),
+ array( "http://hvo.wr.usgs.gov/cam3/", "f3c6ba64cf7ca99b" ),
+ array( "http://hvo.wr.usgs.gov/cams/HMcam/", "ebfb69b427ea80fe" ),
+ array( "http://hvo.wr.usgs.gov/kilauea/update/deformation.html", "39b50c3ed970f46c" ),
+ array( "http://hvo.wr.usgs.gov/kilauea/update/images.html", "5b9b177aa3eb3e8a" ),
+ array( "http://hvo.wr.usgs.gov/kilauea/update/maps.html", "6510063ecf4ec903" ),
+ array( "http://hvo.wr.usgs.gov/volcanowatch/current_issue.html", "2b3bbd2c00797c7a" ),
+ array( "http://neo.jpl.nasa.gov/risk/", "f1d6204ff5cb4aa7" ),
+ array( "http://norvig.com/21-days.html", "4836e27ccf099f38" ),
+ array( "http://primes.utm.edu/curios/home.php", "82efbb0dd073b44d" ),
+ array( "http://slashdot.org/", "4a80c282ffd7d4c6" ),
+ array( "http://tux.wr.usgs.gov/Maps/155.25-19.5.html", "305d1a9c9ee43bdf" ),
+ array( "http://volcano.wr.usgs.gov/kilaueastatus.php", "15c366948ffc6997" ),
+ array( "http://www.avo.alaska.edu/activity/Redoubt.php", "80153ae218916e7b" ),
+ array( "http://www.dilbert.com/fast/", "fa23e2bdf9e2a9e1" ),
+ array( "http://www.fourmilab.ch/gravitation/orbits/", "d47e8d8a2333c6de" ),
+ array( "http://www.fpoa.net/", "7e128095f688b056" ),
+ array( "http://www.ioccc.org/index.html", "2f5356890efcedab" ),
+ array( "http://www.isthe.com/cgi-bin/number.cgi", "95c2b383014f55c5" ),
+ array( "http://www.isthe.com/chongo/bio.html", "4727a5339ce6070f" ),
+ array( "http://www.isthe.com/chongo/index.html", "b0555ecd575108e9" ),
+ array( "http://www.isthe.com/chongo/src/calc/lucas-calc", "48d785770bb4af37" ),
+ array( "http://www.isthe.com/chongo/tech/astro/venus2004.html", "09d4701c12af02b1" ),
+ array( "http://www.isthe.com/chongo/tech/astro/vita.html", "79f031e78f3cf62e" ),
+ array( "http://www.isthe.com/chongo/tech/comp/c/expert.html", "52a1ee85db1b5a94" ),
+ array( "http://www.isthe.com/chongo/tech/comp/calc/index.html", "6bd95b2eb37fa6b8" ),
+ array( "http://www.isthe.com/chongo/tech/comp/fnv/index.html", "74971b7077aef85d" ),
+ array( "http://www.isthe.com/chongo/tech/math/number/howhigh.html", "b4e4fae2ffcc1aad" ),
+ array( "http://www.isthe.com/chongo/tech/math/number/number.html", "2bd48bd898b8f63a" ),
+ array( "http://www.isthe.com/chongo/tech/math/prime/mersenne.html", "e9966ac1556257f6" ),
+ array( "http://www.isthe.com/chongo/tech/math/prime/mersenne.html#largest", "92a3d1cd078ba293" ),
+ array( "http://www.lavarnd.org/cgi-bin/corpspeak.cgi", "f81175a482e20ab8" ),
+ array( "http://www.lavarnd.org/cgi-bin/haiku.cgi", "5bbb3de722e73048" ),
+ array( "http://www.lavarnd.org/cgi-bin/rand-none.cgi", "6b4f363492b9f2be" ),
+ array( "http://www.lavarnd.org/cgi-bin/randdist.cgi", "c2d559df73d59875" ),
+ array( "http://www.lavarnd.org/index.html", "f75f62284bc7a8c2" ),
+ array( "http://www.lavarnd.org/what/nist-test.html", "da8dd8e116a9f1cc" ),
+ array( "http://www.macosxhints.com/", "bdc1e6ab76057885" ),
+ array( "http://www.mellis.com/", "fec6a4238a1224a0" ),
+ array( "http://www.nature.nps.gov/air/webcams/parks/havoso2alert/havoalert.cfm", "c03f40f3223e290e" ),
+ array( "http://www.nature.nps.gov/air/webcams/parks/havoso2alert/timelines_24.cfm", "1ed21673466ffda9" ),
+ array( "http://www.paulnoll.com/", "df70f906bb0dd2af" ),
+ array( "http://www.pepysdiary.com/", "f3dcda369f2af666" ),
+ array( "http://www.sciencenews.org/index/home/activity/view", "9ebb11573cdcebde" ),
+ array( "http://www.skyandtelescope.com/", "81c72d9077fedca0" ),
+ array( "http://www.sput.nl/~rob/sirius.html", "0ec074a31be5fb15" ),
+ array( "http://www.systemexperts.com/", "2a8b3280b6c48f20" ),
+ array( "http://www.tq-international.com/phpBB3/index.php", "fd31777513309344" ),
+ array( "http://www.travelquesttours.com/index.htm", "194534a86ad006b6" ),
+ array( "http://www.wunderground.com/global/stations/89606.html", "3be6fdf46e0cfe12" ),
+ array( R10("21701"), "017cc137a07eb057" ),
+ array( R10("M21701"), "9428fc6e7d26b54d" ),
+ array( R10("2^21701-1"), "9aaa2e3603ef8ad7" ),
+ array( R10("\x54\xc5"), "82c6d3f3a0ccdf7d" ),
+ array( R10("\xc5\x54"), "c86eeea00cf09b65" ),
+ array( R10("23209"), "705f8189dbb58299" ),
+ array( R10("M23209"), "415a7f554391ca69" ),
+ array( R10("2^23209-1"), "cfe3d49fa2bdc555" ),
+ array( R10("\x5a\xa9"), "f0f9c56039b25191" ),
+ array( R10("\xa9\x5a"), "7075cb6abd1d32d9" ),
+ array( R10("391581216093"), "43c94e2c8b277509" ),
+ array( R10("391581*2^216093-1"), "3cbfd4e4ea670359" ),
+ array( R10("\x05\xf9\x9d\x03\x4c\x81"), "c05887810f4d019d" ),
+ array( R10("FEDCBA9876543210"), "14468ff93ac22dc5" ),
+ array( R10("\xfe\xdc\xba\x98\x76\x54\x32\x10"), "ebed699589d99c05" ),
+ array( R10("EFCDAB8967452301"), "6d99f6df321ca5d5" ),
+ array( R10("\xef\xcd\xab\x89\x67\x45\x23\x01"), "0cd410d08c36d625" ),
+ array( R10("0123456789ABCDEF"), "ef1b2a2c86831d35" ),
+ array( R10("\x01\x23\x45\x67\x89\xab\xcd\xef"), "3b349c4d69ee5f05" ),
+ array( R10("1032547698BADCFE"), "55248ce88f45f035" ),
+ array( R10("\x10\x32\x54\x76\x98\xba\xdc\xfe"), "aa69ca6a18a4c885" ),
+ array( R500("\x00"), "1fe3fce62bd816b5" ),
+ array( R500("\x07"), "0289a488a8df69d9" ),
+ array( R500("~"), "15e96e1613df98b5" ),
+ array( R500("\x7f"), "e6be57375ad89b99" ),
+);
+
+$i = 0;
+$pass = true;
+foreach($tests as $test) {
+ $result = hash('fnv164', $test[0]);
+ if ($result != $test[1]) {
+ echo "Iteration " . $i . " failed - expected '" . $test[1] . "', got '" . $result . "' for '" . $test[1] . "'\n";
+ $pass = false;
+ }
+ $i++;
+}
+
+if($pass) {
+ echo "PASS";
+}
+?>
+--EXPECT--
+PASS
diff --git a/ext/hash/tests/gost.phpt b/ext/hash/tests/gost.phpt
new file mode 100644
index 0000000..b800e11
--- /dev/null
+++ b/ext/hash/tests/gost.phpt
@@ -0,0 +1,20 @@
+--TEST--
+gost
+--SKIPIF--
+<?php extension_loaded('hash') or die('skip'); ?>
+--FILE--
+<?php
+echo hash('gost', ''), "\n";
+echo hash('gost', 'The quick brown fox jumps over the lazy dog'), "\n";
+echo hash('gost', 'The quick brown fox jumps over the lazy cog'), "\n";
+echo hash('gost', str_repeat('a', 31)), "\n";
+echo hash('gost', str_repeat('a', 32)), "\n";
+echo hash('gost', str_repeat('a', 33)), "\n";
+?>
+--EXPECT--
+ce85b99cc46752fffee35cab9a7b0278abb4c2d2055cff685af4912c49490f8d
+77b7fa410c9ac58a25f49bca7d0468c9296529315eaca76bd1a10f376d1f4294
+a3ebc4daaab78b0be131dab5737a7f67e602670d543521319150d2e14eeec445
+03840d6348763f11e28e7b1ecc4da0cdf7f898fa555b928ef684c6c5b8f46d9f
+fd1b746d9397e78edd311baef391450434271e02816caa37680d6d7381c79d4e
+715e59cdc8ebde9fdf0fe2a2e811b3bf7f48209a01505e467d2cd2aa2bbb5ecf
diff --git a/ext/hash/tests/hash_algos.phpt b/ext/hash/tests/hash_algos.phpt
new file mode 100644
index 0000000..55796ec
--- /dev/null
+++ b/ext/hash/tests/hash_algos.phpt
@@ -0,0 +1,109 @@
+--TEST--
+Test hash_algos() function : basic functionality
+--SKIPIF--
+<?php extension_loaded('hash') or die('skip: hash extension not loaded.'); ?>
+--FILE--
+<?php
+
+/* Prototype : array hash_algos (void)
+ * Description: Return a list of registered hashing algorithms
+ * Source code: ext/hash/hash.c
+ * Alias to functions:
+*/
+
+echo "*** Testing hash_algos() : basic functionality ***\n";
+var_dump(hash_algos());
+
+?>
+===Done===
+--EXPECTF--
+*** Testing hash_algos() : basic functionality ***
+array(43) {
+ [%d]=>
+ string(3) "md2"
+ [%d]=>
+ string(3) "md4"
+ [%d]=>
+ string(3) "md5"
+ [%d]=>
+ string(4) "sha1"
+ [%d]=>
+ string(6) "sha224"
+ [%d]=>
+ string(6) "sha256"
+ [%d]=>
+ string(6) "sha384"
+ [%d]=>
+ string(6) "sha512"
+ [%d]=>
+ string(9) "ripemd128"
+ [%d]=>
+ string(9) "ripemd160"
+ [%d]=>
+ string(9) "ripemd256"
+ [%d]=>
+ string(9) "ripemd320"
+ [%d]=>
+ string(9) "whirlpool"
+ [%d]=>
+ string(10) "tiger128,3"
+ [%d]=>
+ string(10) "tiger160,3"
+ [%d]=>
+ string(10) "tiger192,3"
+ [%d]=>
+ string(10) "tiger128,4"
+ [%d]=>
+ string(10) "tiger160,4"
+ [%d]=>
+ string(10) "tiger192,4"
+ [%d]=>
+ string(6) "snefru"
+ [%d]=>
+ string(9) "snefru256"
+ [%d]=>
+ string(4) "gost"
+ [%d]=>
+ string(7) "adler32"
+ [%d]=>
+ string(5) "crc32"
+ [%d]=>
+ string(6) "crc32b"
+ [%d]=>
+ string(6) "fnv132"
+ [%d]=>
+ string(6) "fnv164"
+ [%d]=>
+ string(5) "joaat"
+ [%d]=>
+ string(10) "haval128,3"
+ [%d]=>
+ string(10) "haval160,3"
+ [%d]=>
+ string(10) "haval192,3"
+ [%d]=>
+ string(10) "haval224,3"
+ [%d]=>
+ string(10) "haval256,3"
+ [%d]=>
+ string(10) "haval128,4"
+ [%d]=>
+ string(10) "haval160,4"
+ [%d]=>
+ string(10) "haval192,4"
+ [%d]=>
+ string(10) "haval224,4"
+ [%d]=>
+ string(10) "haval256,4"
+ [%d]=>
+ string(10) "haval128,5"
+ [%d]=>
+ string(10) "haval160,5"
+ [%d]=>
+ string(10) "haval192,5"
+ [%d]=>
+ string(10) "haval224,5"
+ [%d]=>
+ string(10) "haval256,5"
+}
+===Done=== \ No newline at end of file
diff --git a/ext/hash/tests/hash_copy_001.phpt b/ext/hash/tests/hash_copy_001.phpt
new file mode 100644
index 0000000..638b7f5
--- /dev/null
+++ b/ext/hash/tests/hash_copy_001.phpt
@@ -0,0 +1,292 @@
+--TEST--
+hash_copy() basic tests
+--SKIPIF--
+<?php extension_loaded('hash') or die('skip'); ?>
+--FILE--
+<?php
+
+$algos = hash_algos();
+
+foreach ($algos as $algo) {
+ var_dump($algo);
+ $orig = hash_init($algo);
+ hash_update($orig, b"I can't remember anything");
+ $copy = hash_copy($orig);
+ var_dump(hash_final($orig));
+
+ var_dump(hash_final($copy));
+}
+
+foreach ($algos as $algo) {
+ var_dump($algo);
+ $orig = hash_init($algo);
+ hash_update($orig, b"I can't remember anything");
+ $copy = hash_copy($orig);
+ var_dump(hash_final($orig));
+
+ hash_update($copy, b"Can’t tell if this is true or dream");
+ var_dump(hash_final($copy));
+}
+
+echo "Done\n";
+?>
+--EXPECTF--
+string(3) "md2"
+string(32) "d5ac4ffd08f6a57b9bd402b8068392ff"
+string(32) "d5ac4ffd08f6a57b9bd402b8068392ff"
+string(3) "md4"
+string(32) "302c45586b53a984bd3a1237cb81c15f"
+string(32) "302c45586b53a984bd3a1237cb81c15f"
+string(3) "md5"
+string(32) "e35759f6ea35db254e415b5332269435"
+string(32) "e35759f6ea35db254e415b5332269435"
+string(4) "sha1"
+string(40) "29f62a228f726cd728efa7a0ac6a2aba318baf15"
+string(40) "29f62a228f726cd728efa7a0ac6a2aba318baf15"
+string(6) "sha224"
+string(56) "51fd0aa76a00b4a86103895cad5c7c2651ec7da9f4fc1e50c43ede29"
+string(56) "51fd0aa76a00b4a86103895cad5c7c2651ec7da9f4fc1e50c43ede29"
+string(6) "sha256"
+string(64) "d3a13cf52af8e9390caed78b77b6b1e06e102204e3555d111dfd149bc5d54dba"
+string(64) "d3a13cf52af8e9390caed78b77b6b1e06e102204e3555d111dfd149bc5d54dba"
+string(6) "sha384"
+string(96) "6950d861ace4102b803ab8b3779d2f471968233010d2608974ab89804cef6f76162b4433d6e554e11e40a7cdcf510ea3"
+string(96) "6950d861ace4102b803ab8b3779d2f471968233010d2608974ab89804cef6f76162b4433d6e554e11e40a7cdcf510ea3"
+string(6) "sha512"
+string(128) "caced3db8e9e3a5543d5b933bcbe9e7834e6667545c3f5d4087b58ec8d78b4c8a4a5500c9b88f65f7368810ba9905e51f1cff3b25a5dccf76634108fb4e7ce13"
+string(128) "caced3db8e9e3a5543d5b933bcbe9e7834e6667545c3f5d4087b58ec8d78b4c8a4a5500c9b88f65f7368810ba9905e51f1cff3b25a5dccf76634108fb4e7ce13"
+string(9) "ripemd128"
+string(32) "5f1bc5f5aeaf747574dd34a6535cd94a"
+string(32) "5f1bc5f5aeaf747574dd34a6535cd94a"
+string(9) "ripemd160"
+string(40) "02a2a535ee10404c6b5cf9acb178a04fbed67269"
+string(40) "02a2a535ee10404c6b5cf9acb178a04fbed67269"
+string(9) "ripemd256"
+string(64) "547d2ed85ca0a0e3208b5ecf4fc6a7fc1e64db8ff13493e4beaf11e4d71648e2"
+string(64) "547d2ed85ca0a0e3208b5ecf4fc6a7fc1e64db8ff13493e4beaf11e4d71648e2"
+string(9) "ripemd320"
+string(80) "785a7df56858f550966cddfd59ce14b13bf4b18e7892c4c1ad91bf23bf67639bd2c96749ba29cfa6"
+string(80) "785a7df56858f550966cddfd59ce14b13bf4b18e7892c4c1ad91bf23bf67639bd2c96749ba29cfa6"
+string(9) "whirlpool"
+string(128) "6e60597340640e621e25f975cef2b000b0c4c09a7af7d240a52d193002b0a8426fa7da7acc5b37ed9608016d4f396db834a0ea2f2c35f900461c9ac7e5604082"
+string(128) "6e60597340640e621e25f975cef2b000b0c4c09a7af7d240a52d193002b0a8426fa7da7acc5b37ed9608016d4f396db834a0ea2f2c35f900461c9ac7e5604082"
+string(10) "tiger128,3"
+string(32) "8d68e78bc5e62ba925a67aa48595cfc6"
+string(32) "8d68e78bc5e62ba925a67aa48595cfc6"
+string(10) "tiger160,3"
+string(40) "8d68e78bc5e62ba925a67aa48595cfc62cd1e5e0"
+string(40) "8d68e78bc5e62ba925a67aa48595cfc62cd1e5e0"
+string(10) "tiger192,3"
+string(48) "8d68e78bc5e62ba925a67aa48595cfc62cd1e5e08224fc35"
+string(48) "8d68e78bc5e62ba925a67aa48595cfc62cd1e5e08224fc35"
+string(10) "tiger128,4"
+string(32) "a26ca3f58e74fb32ee44b099cb1b5122"
+string(32) "a26ca3f58e74fb32ee44b099cb1b5122"
+string(10) "tiger160,4"
+string(40) "a26ca3f58e74fb32ee44b099cb1b512203375900"
+string(40) "a26ca3f58e74fb32ee44b099cb1b512203375900"
+string(10) "tiger192,4"
+string(48) "a26ca3f58e74fb32ee44b099cb1b512203375900f30b741d"
+string(48) "a26ca3f58e74fb32ee44b099cb1b512203375900f30b741d"
+string(6) "snefru"
+string(64) "fbe88daa74c89b9e29468fa3cd3a657d31845e21bb58dd3f8d806f5179a85c26"
+string(64) "fbe88daa74c89b9e29468fa3cd3a657d31845e21bb58dd3f8d806f5179a85c26"
+string(9) "snefru256"
+string(64) "fbe88daa74c89b9e29468fa3cd3a657d31845e21bb58dd3f8d806f5179a85c26"
+string(64) "fbe88daa74c89b9e29468fa3cd3a657d31845e21bb58dd3f8d806f5179a85c26"
+string(4) "gost"
+string(64) "5820c7c4a0650587538b30ef4099f2b5993069758d5c847a552e6ef7360766a5"
+string(64) "5820c7c4a0650587538b30ef4099f2b5993069758d5c847a552e6ef7360766a5"
+string(7) "adler32"
+string(8) "6f7c0928"
+string(8) "6f7c0928"
+string(5) "crc32"
+string(8) "e5cfc160"
+string(8) "e5cfc160"
+string(6) "crc32b"
+string(8) "69147a4e"
+string(8) "69147a4e"
+string(6) "fnv132"
+string(8) "98139504"
+string(8) "98139504"
+string(6) "fnv164"
+string(16) "14522659f8138684"
+string(16) "14522659f8138684"
+string(5) "joaat"
+string(8) "aaebf370"
+string(8) "aaebf370"
+string(10) "haval128,3"
+string(32) "86362472c8895e68e223ef8b3711d8d9"
+string(32) "86362472c8895e68e223ef8b3711d8d9"
+string(10) "haval160,3"
+string(40) "fabdf6905f3ba18a3c93d6a16b91e31f7222a7a4"
+string(40) "fabdf6905f3ba18a3c93d6a16b91e31f7222a7a4"
+string(10) "haval192,3"
+string(48) "e05d0ff5723028bd5494f32c0c2494cd0b9ccf7540af7b47"
+string(48) "e05d0ff5723028bd5494f32c0c2494cd0b9ccf7540af7b47"
+string(10) "haval224,3"
+string(56) "56b196289d8de8a22296588cf90e5b09cb6fa1b01ce8e92bca40cae2"
+string(56) "56b196289d8de8a22296588cf90e5b09cb6fa1b01ce8e92bca40cae2"
+string(10) "haval256,3"
+string(64) "ff4d7ab0fac2ca437b945461f9b62fd16e71e9103524d5d140445a00e3d49239"
+string(64) "ff4d7ab0fac2ca437b945461f9b62fd16e71e9103524d5d140445a00e3d49239"
+string(10) "haval128,4"
+string(32) "ee44418e0195a0c4a35d112722919a9c"
+string(32) "ee44418e0195a0c4a35d112722919a9c"
+string(10) "haval160,4"
+string(40) "f320cce982d5201a1ccacc1c5ff835a258a97eb1"
+string(40) "f320cce982d5201a1ccacc1c5ff835a258a97eb1"
+string(10) "haval192,4"
+string(48) "a96600107463e8e97a7fe6f260d9bf4f4587a281caafa6db"
+string(48) "a96600107463e8e97a7fe6f260d9bf4f4587a281caafa6db"
+string(10) "haval224,4"
+string(56) "7147c9e1c1e67b942da3229f59a1ab18f121f5d7f5765ca88bc9f200"
+string(56) "7147c9e1c1e67b942da3229f59a1ab18f121f5d7f5765ca88bc9f200"
+string(10) "haval256,4"
+string(64) "82fec42679ed5a77a841962827b88a9cddf7d677736e50bc81f1a14b99f06061"
+string(64) "82fec42679ed5a77a841962827b88a9cddf7d677736e50bc81f1a14b99f06061"
+string(10) "haval128,5"
+string(32) "8d0b157828328ae7d34d60b4b60c1dab"
+string(32) "8d0b157828328ae7d34d60b4b60c1dab"
+string(10) "haval160,5"
+string(40) "54dab5e10dc41503f9b8aa32ffe3bab7cf1da8a3"
+string(40) "54dab5e10dc41503f9b8aa32ffe3bab7cf1da8a3"
+string(10) "haval192,5"
+string(48) "7d91265a1b27698279d8d95a5ee0a20014528070bf6415e7"
+string(48) "7d91265a1b27698279d8d95a5ee0a20014528070bf6415e7"
+string(10) "haval224,5"
+string(56) "7772b2e22f2a3bce917e08cf57ebece46bb33168619a776c6f2f7234"
+string(56) "7772b2e22f2a3bce917e08cf57ebece46bb33168619a776c6f2f7234"
+string(10) "haval256,5"
+string(64) "438a602cb1a761f7bd0a633b7bd8b3ccd0577b524d05174ca1ae1f559b9a2c2a"
+string(64) "438a602cb1a761f7bd0a633b7bd8b3ccd0577b524d05174ca1ae1f559b9a2c2a"
+string(3) "md2"
+string(32) "d5ac4ffd08f6a57b9bd402b8068392ff"
+string(32) "5c36f61062d091a8324991132c5e8dbd"
+string(3) "md4"
+string(32) "302c45586b53a984bd3a1237cb81c15f"
+string(32) "1d4196526aada3506efb4c7425651584"
+string(3) "md5"
+string(32) "e35759f6ea35db254e415b5332269435"
+string(32) "f255c114bd6ce94aad092b5141c00d46"
+string(4) "sha1"
+string(40) "29f62a228f726cd728efa7a0ac6a2aba318baf15"
+string(40) "a273396f056554dcd491b5dea1e7baa3b89b802b"
+string(6) "sha224"
+string(56) "51fd0aa76a00b4a86103895cad5c7c2651ec7da9f4fc1e50c43ede29"
+string(56) "1aee028400c56ceb5539625dc2f395abf491409336ca0f3e177a50e2"
+string(6) "sha256"
+string(64) "d3a13cf52af8e9390caed78b77b6b1e06e102204e3555d111dfd149bc5d54dba"
+string(64) "268e7f4cf88504a53fd77136c4c4748169f46ff7150b376569ada9c374836944"
+string(6) "sha384"
+string(96) "6950d861ace4102b803ab8b3779d2f471968233010d2608974ab89804cef6f76162b4433d6e554e11e40a7cdcf510ea3"
+string(96) "0d44981d04bb11b1ef75d5c2932bd0aa2785e7bc454daac954d77e2ca10047879b58997533fc99650b20049c6cb9a6cc"
+string(6) "sha512"
+string(128) "caced3db8e9e3a5543d5b933bcbe9e7834e6667545c3f5d4087b58ec8d78b4c8a4a5500c9b88f65f7368810ba9905e51f1cff3b25a5dccf76634108fb4e7ce13"
+string(128) "28d7c721433782a880f840af0c3f3ea2cad4ef55de2114dda9d504cedeb110e1cf2519c49e4b5da3da4484bb6ba4fd1621ceadc6408f4410b2ebe9d83a4202c2"
+string(9) "ripemd128"
+string(32) "5f1bc5f5aeaf747574dd34a6535cd94a"
+string(32) "f95f5e22b8875ee0c48219ae97f0674b"
+string(9) "ripemd160"
+string(40) "02a2a535ee10404c6b5cf9acb178a04fbed67269"
+string(40) "900d615c1abe714e340f4ecd6a3d65599fd30ff4"
+string(9) "ripemd256"
+string(64) "547d2ed85ca0a0e3208b5ecf4fc6a7fc1e64db8ff13493e4beaf11e4d71648e2"
+string(64) "b9799db40d1af5614118c329169cdcd2c718db6af03bf945ea7f7ba72b8e14f4"
+string(9) "ripemd320"
+string(80) "785a7df56858f550966cddfd59ce14b13bf4b18e7892c4c1ad91bf23bf67639bd2c96749ba29cfa6"
+string(80) "d6d12c1fca7a9c4a59c1be4f40188e92a746a035219e0a6ca1ee53b36a8282527187f7dffaa57ecc"
+string(9) "whirlpool"
+string(128) "6e60597340640e621e25f975cef2b000b0c4c09a7af7d240a52d193002b0a8426fa7da7acc5b37ed9608016d4f396db834a0ea2f2c35f900461c9ac7e5604082"
+string(128) "e8c6a921e7d8eac2fd21d4df6054bb27a02321b2beb5b01b6f88c40706164e64d67ec97519bf76c8af8df896745478b78d42a0159f1a0db16777771fd9d420dc"
+string(10) "tiger128,3"
+string(32) "8d68e78bc5e62ba925a67aa48595cfc6"
+string(32) "a99d2c0348d480dc0f3c35852926e0f1"
+string(10) "tiger160,3"
+string(40) "8d68e78bc5e62ba925a67aa48595cfc62cd1e5e0"
+string(40) "a99d2c0348d480dc0f3c35852926e0f1e1825c16"
+string(10) "tiger192,3"
+string(48) "8d68e78bc5e62ba925a67aa48595cfc62cd1e5e08224fc35"
+string(48) "a99d2c0348d480dc0f3c35852926e0f1e1825c1651957ee3"
+string(10) "tiger128,4"
+string(32) "a26ca3f58e74fb32ee44b099cb1b5122"
+string(32) "66e2c0322421c4e5a9208e6aeed481e5"
+string(10) "tiger160,4"
+string(40) "a26ca3f58e74fb32ee44b099cb1b512203375900"
+string(40) "66e2c0322421c4e5a9208e6aeed481e5c4b00448"
+string(10) "tiger192,4"
+string(48) "a26ca3f58e74fb32ee44b099cb1b512203375900f30b741d"
+string(48) "66e2c0322421c4e5a9208e6aeed481e5c4b00448e344d9d0"
+string(6) "snefru"
+string(64) "fbe88daa74c89b9e29468fa3cd3a657d31845e21bb58dd3f8d806f5179a85c26"
+string(64) "614ca924864fa0e8fa309aa0944e047d5edbfd4964a35858f4d8ec66a0fb88b0"
+string(9) "snefru256"
+string(64) "fbe88daa74c89b9e29468fa3cd3a657d31845e21bb58dd3f8d806f5179a85c26"
+string(64) "614ca924864fa0e8fa309aa0944e047d5edbfd4964a35858f4d8ec66a0fb88b0"
+string(4) "gost"
+string(64) "5820c7c4a0650587538b30ef4099f2b5993069758d5c847a552e6ef7360766a5"
+string(64) "a00961e371287c71c527a41c14564f13b6ed12ac7cd9d5f5dfb3542a25e28d3b"
+string(7) "adler32"
+string(8) "6f7c0928"
+string(8) "d9141747"
+string(5) "crc32"
+string(8) "e5cfc160"
+string(8) "59f8d3d2"
+string(6) "crc32b"
+string(8) "69147a4e"
+string(8) "3ee63999"
+string(6) "fnv132"
+string(8) "98139504"
+string(8) "59ad036f"
+string(6) "fnv164"
+string(16) "14522659f8138684"
+string(16) "5e8c64fba6a5ffcf"
+string(5) "joaat"
+string(8) "aaebf370"
+string(8) "513479b4"
+string(10) "haval128,3"
+string(32) "86362472c8895e68e223ef8b3711d8d9"
+string(32) "ebeeeb05c18af1e53d2d127b561d5e0d"
+string(10) "haval160,3"
+string(40) "fabdf6905f3ba18a3c93d6a16b91e31f7222a7a4"
+string(40) "f1a2c9604fb40899ad502abe0dfcec65115c8a9a"
+string(10) "haval192,3"
+string(48) "e05d0ff5723028bd5494f32c0c2494cd0b9ccf7540af7b47"
+string(48) "d3a7315773a326678208650ed02510ed96cd488d74cd5231"
+string(10) "haval224,3"
+string(56) "56b196289d8de8a22296588cf90e5b09cb6fa1b01ce8e92bca40cae2"
+string(56) "6d7132fabc83c9ab7913748b79ecf10e25409569d3ed144177f46731"
+string(10) "haval256,3"
+string(64) "ff4d7ab0fac2ca437b945461f9b62fd16e71e9103524d5d140445a00e3d49239"
+string(64) "7a469868ad4b92891a3a44524c58a2b8d0f3bebb92b4cf47d19bc6aba973eb95"
+string(10) "haval128,4"
+string(32) "ee44418e0195a0c4a35d112722919a9c"
+string(32) "6ecddb39615f43fd211839287ff38461"
+string(10) "haval160,4"
+string(40) "f320cce982d5201a1ccacc1c5ff835a258a97eb1"
+string(40) "bcd2e7821723ac22e122b8b7cbbd2daaa9a862df"
+string(10) "haval192,4"
+string(48) "a96600107463e8e97a7fe6f260d9bf4f4587a281caafa6db"
+string(48) "ae74619a88dcec1fbecde28e27f009a65ecc12170824d2cd"
+string(10) "haval224,4"
+string(56) "7147c9e1c1e67b942da3229f59a1ab18f121f5d7f5765ca88bc9f200"
+string(56) "fdaba6563f1334d40de24e311f14b324577f97c3b78b9439c408cdca"
+string(10) "haval256,4"
+string(64) "82fec42679ed5a77a841962827b88a9cddf7d677736e50bc81f1a14b99f06061"
+string(64) "289a2ba4820218bdb25a6534fbdf693f9de101362584fdd41e32244c719caa37"
+string(10) "haval128,5"
+string(32) "8d0b157828328ae7d34d60b4b60c1dab"
+string(32) "ffa7993a4e183b245263fb1f63e27343"
+string(10) "haval160,5"
+string(40) "54dab5e10dc41503f9b8aa32ffe3bab7cf1da8a3"
+string(40) "375ee5ab3a9bd07a1dbe5d071e07b2afb3165e3b"
+string(10) "haval192,5"
+string(48) "7d91265a1b27698279d8d95a5ee0a20014528070bf6415e7"
+string(48) "c650585f93c6e041e835caedc621f8c42d8bc6829fb76789"
+string(10) "haval224,5"
+string(56) "7772b2e22f2a3bce917e08cf57ebece46bb33168619a776c6f2f7234"
+string(56) "bc674d465a822817d939f19b38edde083fe5668759836c203c56e3e4"
+string(10) "haval256,5"
+string(64) "438a602cb1a761f7bd0a633b7bd8b3ccd0577b524d05174ca1ae1f559b9a2c2a"
+string(64) "da70ad9bd09ed7c9675329ea2b5279d57761807c7aeac6340d94b5d494809457"
+Done
diff --git a/ext/hash/tests/hash_copy_002.phpt b/ext/hash/tests/hash_copy_002.phpt
new file mode 100644
index 0000000..aac4c3b
--- /dev/null
+++ b/ext/hash/tests/hash_copy_002.phpt
@@ -0,0 +1,22 @@
+--TEST--
+hash_copy() errors
+--SKIPIF--
+<?php extension_loaded('hash') or die('skip'); ?>
+--FILE--
+<?php
+
+$r = hash_init("md5");
+var_dump(hash_copy());
+var_dump(hash_copy($r));
+var_dump(hash_copy($r, $r));
+
+echo "Done\n";
+?>
+--EXPECTF--
+Warning: hash_copy() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+resource(%d) of type (Hash Context)
+
+Warning: hash_copy() expects exactly 1 parameter, 2 given in %s on line %d
+NULL
+Done
diff --git a/ext/hash/tests/hash_error.phpt b/ext/hash/tests/hash_error.phpt
new file mode 100644
index 0000000..8317a56
--- /dev/null
+++ b/ext/hash/tests/hash_error.phpt
@@ -0,0 +1,48 @@
+--TEST--
+Test hash() function : error conditions
+--SKIPIF--
+<?php extension_loaded('hash') or die('skip: hash extension not loaded.'); ?>
+--FILE--
+<?php
+
+/* Prototype : string hash ( string $algo , string $data [, bool $raw_output ] )
+ * Description: Generate a hash value (message digest)
+ * Source code: ext/hash/hash.c
+ * Alias to functions:
+*/
+echo "*** Testing hash() : error conditions ***\n";
+
+echo "\n-- Testing hash() function with less than expected no. of arguments --\n";
+var_dump(hash());
+var_dump(hash('adler32'));
+
+echo "\n-- Testing hash() function with more than expected no. of arguments --\n";
+$extra_arg= 10;
+var_dump(hash('adler32', '', false, $extra_arg));
+
+echo "\n-- Testing hash() function with invalid hash algorithm --\n";
+var_dump(hash('foo', ''));
+
+?>
+===Done===
+--EXPECTF--
+*** Testing hash() : error conditions ***
+
+-- Testing hash() function with less than expected no. of arguments --
+
+Warning: hash() expects at least 2 parameters, 0 given in %s on line %d
+NULL
+
+Warning: hash() expects at least 2 parameters, 1 given in %s on line %d
+NULL
+
+-- Testing hash() function with more than expected no. of arguments --
+
+Warning: hash() expects at most 3 parameters, 4 given in %s on line %d
+NULL
+
+-- Testing hash() function with invalid hash algorithm --
+
+Warning: hash(): Unknown hashing algorithm: foo in %s on line %d
+bool(false)
+===Done=== \ No newline at end of file
diff --git a/ext/hash/tests/hash_file_basic.phpt b/ext/hash/tests/hash_file_basic.phpt
new file mode 100644
index 0000000..9851c14
--- /dev/null
+++ b/ext/hash/tests/hash_file_basic.phpt
@@ -0,0 +1,44 @@
+--TEST--
+Test hash_file() function : basic functionality
+--SKIPIF--
+<?php extension_loaded('hash') or die('skip: hash extension not loaded.'); ?>
+--CREDITS--
+Felix De Vliegher <felix.devliegher@gmail.com>
+--FILE--
+<?php
+/* Prototype : string hash_file(string algo, string filename[, bool raw_output = false])
+ * Description: Generate a hash of a given file
+ * Source code: ext/hash/hash.c
+ * Alias to functions:
+ */
+
+echo "*** Testing hash_file() : basic functionality ***\n";
+
+// Set up file
+$filename = 'hash_file_example.txt';
+file_put_contents( $filename, 'The quick brown fox jumped over the lazy dog.' );
+
+var_dump( hash_file( 'md5', $filename ) );
+var_dump( hash_file( 'sha1', $filename ) );
+var_dump( hash_file( 'sha256', $filename ) );
+var_dump( hash_file( 'sha512', $filename ) );
+
+var_dump( base64_encode( hash_file( 'md5', $filename, true ) ) );
+
+?>
+===DONE===
+--CLEAN--
+<?php
+
+$filename = 'hash_file_example.txt';
+unlink( $filename );
+
+?>
+--EXPECTF--
+*** Testing hash_file() : basic functionality ***
+string(32) "5c6ffbdd40d9556b73a21e63c3e0e904"
+string(40) "c0854fb9fb03c41cce3802cb0d220529e6eef94e"
+string(64) "68b1282b91de2c054c36629cb8dd447f12f096d3e3c587978dc2248444633483"
+string(128) "0a8c150176c2ba391d7f1670ef4955cd99d3c3ec8cf06198cec30d436f2ac0c9b64229b5a54bdbd5563160503ce992a74be528761da9d0c48b7c74627302eb25"
+string(24) "XG/73UDZVWtzoh5jw+DpBA=="
+===DONE===
diff --git a/ext/hash/tests/hash_file_basic1.phpt b/ext/hash/tests/hash_file_basic1.phpt
new file mode 100644
index 0000000..339d237
--- /dev/null
+++ b/ext/hash/tests/hash_file_basic1.phpt
@@ -0,0 +1,85 @@
+--TEST--
+Test hash_file() function : basic functionality
+--SKIPIF--
+<?php extension_loaded('hash') or die('skip: hash extension not loaded.'); ?>
+--FILE--
+<?php
+
+/* Prototype : string hash_file ( string algo, string filename [, bool raw_output] )
+ * Description: Generate a hash value using the contents of a given file
+ * Source code: ext/hash/hash.c
+ * Alias to functions:
+*/
+
+echo "*** Testing hash_file() : basic functionality ***\n";
+
+$file = dirname(__FILE__) . "hash_file.txt";
+/* Creating a temporary file file */
+if (($fp = fopen( $file, "w+")) == FALSE) {
+ echo "Cannot create file ($file)";
+ exit;
+}
+
+/* Writing into file */
+$content = "This is a sample string used to test the hash_file function with various hashing algorithms";
+if (is_writable($file)) {
+ if (fwrite($fp, $content) === FALSE) {
+ echo "Cannot write to file ($file)";
+ exit;
+ }
+}
+
+// close the file
+fclose($fp);
+
+echo "adler32: " . hash_file('adler32', $file) . "\n";
+echo "crc32: " . hash_file('crc32', $file) . "\n";
+echo "gost: " . hash_file('gost', $file). "\n";
+echo "haval128,3: " . hash_file('haval128,3', $file). "\n";
+echo "md2: " . hash_file('md2', $file). "\n";
+echo "md4: " . hash_file('md4', $file). "\n";
+echo "md5: " . hash_file('md5', $file). "\n";
+echo "ripemd128: " . hash_file('ripemd128', $file). "\n";
+echo "ripemd160: " . hash_file('ripemd160', $file). "\n";
+echo "ripemd256: " . hash_file('ripemd256', $file). "\n";
+echo "ripemd320: " . hash_file('ripemd320', $file). "\n";
+echo "sha1: " . hash_file('sha1', $file). "\n";
+echo "sha256: " . hash_file('sha256', $file). "\n";
+echo "sha384: " . hash_file('sha384', $file). "\n";
+echo "sha512: " . hash_file('sha512', $file). "\n";
+echo "snefru: " . hash_file('snefru', $file). "\n";
+echo "tiger192,3: " . hash_file('tiger192,3', $file). "\n";
+echo "whirlpool: " . hash_file('whirlpool', $file). "\n";
+
+echo "adler32(raw): " . bin2hex(hash_file('adler32', $file, TRUE)) . "\n";
+echo "md5(raw): " . bin2hex(hash_file('md5', $file, TRUE)). "\n";
+echo "sha256(raw): " . bin2hex(hash_file('sha256', $file, TRUE)). "\n";
+
+unlink($file);
+
+?>
+===Done===
+--EXPECTF--
+*** Testing hash_file() : basic functionality ***
+adler32: ff87222e
+crc32: 61664d33
+gost: d9e65f0c0c2ef944e4f8a01f4a46365c4f33a2853756878182a7f03e1490a4cd
+haval128,3: 8bb81269aca8b7f87829020d76a4e841
+md2: 70f791c0d8fa9edd7d08e32fcba8c354
+md4: a9d034b16bb290c57a645afd6f14cd3b
+md5: 704bf818448f5bbb94061332d2c889aa
+ripemd128: d02a5f320a11c54c7d51f933b0bd8471
+ripemd160: 3ff296ca6314313af3ed0437c8fc0ebbd3242d3b
+ripemd256: 0edd779587c11cf32781111b264251eb37529832fb207121cd45dd95002e48a8
+ripemd320: bf162fa2ff20491b3016c5d8190f8ee47d7dcda8c38eaf6779349a243a029d275eec9adf16ec1b35
+sha1: 8529b266611e3bd0d208fd9614653c2a8f23d0fe
+sha256: a0f5702fa5d3670b80033d668e8732b70550392abb53841355447f8bb0f72245
+sha384: a35d875ed96d94b6452acad910f97978200faa2398d8a0e6b9cffa33704c3809e3d2e5b0d63700d8f32a0716e7d2d528
+sha512: 1f42adaf938fbf136e381b164bae5f984c7f9fe60c82728bd889c14f187c7d63e81a0305a1731c7e0a8f3ed9fd2ec92a3833a93502bdf269532601f0b8e2bab0
+snefru: d414b2345d3e7fa1a31c044cf334bfc1fec24d89e464411998d579d24663895f
+tiger192,3: 7acf4ebea075fac6fc8ea0e2b4af3cfa71b9460e4c53403a
+whirlpool: 4248b149e000477269a4a5f1a84d97cfc3d0199b7aaf505913e6f010a6f83276029d11a9ad545374bc710eb59c7d958985023ab886ffa9ec9a23852844c764ec
+adler32(raw): ff87222e
+md5(raw): 704bf818448f5bbb94061332d2c889aa
+sha256(raw): a0f5702fa5d3670b80033d668e8732b70550392abb53841355447f8bb0f72245
+===Done===
diff --git a/ext/hash/tests/hash_file_error.phpt b/ext/hash/tests/hash_file_error.phpt
new file mode 100644
index 0000000..326fbd5
--- /dev/null
+++ b/ext/hash/tests/hash_file_error.phpt
@@ -0,0 +1,67 @@
+--TEST--
+Test hash_file() function : error conditions
+--SKIPIF--
+<?php extension_loaded('hash') or die('skip: hash extension not loaded.'); ?>
+--CREDITS--
+Felix De Vliegher <felix.devliegher@gmail.com>
+--FILE--
+<?php
+/* Prototype : string hash_file(string algo, string filename[, bool raw_output = false])
+ * Description: Generate a hash of a given file
+ * Source code: ext/hash/hash.c
+ * Alias to functions:
+ */
+
+echo "*** Testing hash_file() : error conditions ***\n";
+
+// Set up file
+$filename = 'hash_file_example.txt';
+file_put_contents( $filename, 'The quick brown fox jumped over the lazy dog.' );
+
+
+// hash_file() error tests
+echo "\n-- Testing hash_file() function with an unknown algorithm --\n";
+var_dump( hash_file( 'foobar', $filename ) );
+
+echo "\n-- Testing hash_file() function with a non-existant file --\n";
+var_dump( hash_file( 'md5', 'nonexistant.txt' ) );
+
+echo "\n-- Testing hash_file() function with less than expected no. of arguments --\n";
+var_dump( hash_file( 'md5' ) );
+
+echo "\n-- Testing hash_file() function with more than expected no. of arguments --\n";
+$extra_arg = 10;
+var_dump( hash_file( 'md5', $filename, false, $extra_arg ) );
+
+?>
+===DONE===
+--CLEAN--
+<?php
+
+$filename = 'hash_file_example.txt';
+unlink( $filename );
+
+?>
+--EXPECTF--
+*** Testing hash_file() : error conditions ***
+
+-- Testing hash_file() function with an unknown algorithm --
+
+Warning: hash_file(): Unknown hashing algorithm: %s in %s on line %d
+bool(false)
+
+-- Testing hash_file() function with a non-existant file --
+
+Warning: hash_file(%s): failed to open stream: No such file or directory in %s on line %d
+bool(false)
+
+-- Testing hash_file() function with less than expected no. of arguments --
+
+Warning: hash_file() expects at least 2 parameters, 1 given in %s on line %d
+NULL
+
+-- Testing hash_file() function with more than expected no. of arguments --
+
+Warning: hash_file() expects at most 3 parameters, 4 given in %s on line %d
+NULL
+===DONE===
diff --git a/ext/hash/tests/hash_hmac_basic.phpt b/ext/hash/tests/hash_hmac_basic.phpt
new file mode 100644
index 0000000..9631aa5
--- /dev/null
+++ b/ext/hash/tests/hash_hmac_basic.phpt
@@ -0,0 +1,66 @@
+--TEST--
+Test hash_file() function : basic functionality
+--SKIPIF--
+<?php extension_loaded('hash') or die('skip: hash extension not loaded.'); ?>
+--FILE--
+<?php
+
+/* Prototype : string hash_hmac ( string $algo , string $data , string $key [, bool $raw_output ] )
+ * Description: Generate a keyed hash value using the HMAC method
+ * Source code: ext/hash/hash.c
+ * Alias to functions:
+*/
+
+echo "*** Testing hash_hmac() : basic functionality ***\n";
+
+$content = "This is a sample string used to test the hash_hmac function with various hashing algorithms";
+$key = 'secret';
+
+echo "adler32: " . hash_hmac('adler32', $content, $key) . "\n";
+echo "crc32: " . hash_hmac('crc32', $content, $key) . "\n";
+echo "gost: " . hash_hmac('gost', $content, $key) . "\n";
+echo "haval128,3: " . hash_hmac('haval128,3', $content, $key) . "\n";
+echo "md2: " . hash_hmac('md2', $content, $key) . "\n";
+echo "md4: " . hash_hmac('md4', $content, $key) . "\n";
+echo "md5: " . hash_hmac('md5', $content, $key) . "\n";
+echo "ripemd128: " . hash_hmac('ripemd128', $content, $key) . "\n";
+echo "ripemd160: " . hash_hmac('ripemd160', $content, $key) . "\n";
+echo "ripemd256: " . hash_hmac('ripemd256', $content, $key) . "\n";
+echo "ripemd320: " . hash_hmac('ripemd320', $content, $key) . "\n";
+echo "sha1: " . hash_hmac('sha1', $content, $key) . "\n";
+echo "sha256: " . hash_hmac('sha256', $content, $key) . "\n";
+echo "sha384: " . hash_hmac('sha384', $content, $key) . "\n";
+echo "sha512: " . hash_hmac('sha512', $content, $key) . "\n";
+echo "snefru: " . hash_hmac('snefru', $content, $key) . "\n";
+echo "tiger192,3: " . hash_hmac('tiger192,3', $content, $key) . "\n";
+echo "whirlpool: " . hash_hmac('whirlpool', $content, $key) . "\n";
+echo "adler32(raw): " . bin2hex(hash_hmac('adler32', $content, $key, TRUE)) . "\n";
+echo "md5(raw): " . bin2hex(hash_hmac('md5', $content, $key, TRUE)) . "\n";
+echo "sha256(raw): " . bin2hex(hash_hmac('sha256', $content, $key, TRUE)) . "\n";
+
+?>
+===Done===
+--EXPECTF--
+*** Testing hash_hmac() : basic functionality ***
+adler32: 12c803f7
+crc32: 96859101
+gost: a4a3c80bdf3f8665bf07376a34dc9c1b11af7c813f4928f62e39f0c0dc564dad
+haval128,3: 82cd0f4bd36729b5c80c33efa8c13ac5
+md2: 6d111dab563025e4cb5f4425c991fa12
+md4: 10cdbfe843000c623f8b8da0d5d20b0b
+md5: 2a632783e2812cf23de100d7d6a463ae
+ripemd128: 26c2f694a65b1928b668cf55f65529b4
+ripemd160: 4b3433ba596ec39692bb7ce760a9ee5fb818113f
+ripemd256: 4e4e5ec19322895a727f272dfe68f87bc1af66cc6ce27c6c1360a5ee78a14b30
+ripemd320: f10a8ff82e828b92a5ff0a02fc9032bc61352d0d824821fc42f7e09cf5b5f41ee59fd33a730d7469
+sha1: 5bfdb62b97e2c987405463e9f7c193139c0e1fd0
+sha256: 49bde3496b9510a17d0edd8a4b0ac70148e32a1d51e881ec76faa96534125838
+sha384: b781415b856744834e532b9899e1aa0bec5a82cf09a838f0a833470468e2a42648a52428cfd9012385d04de5cd9bd122
+sha512: 7de05636b18e2b0ca3427e03f53074af3a48a7b9df226daba4f22324c570638e7d7b26430e214799c9ce0db5ee88dad3292ca0f38bf99b8eaebed59b3a9c140a
+snefru: 67af483046f9cf16fe19f9087929ccfc6ad176ade3290b4d33f43e0ddb07e711
+tiger192,3: 00a0f884f15a9e5549ed0e40ca0190522d369027e16d5b59
+whirlpool: 4a0f1582b21b7aff59bfba7f9c29131c69741b2ce80acdc7d314040f3b768cf5a17e30b74cceb86fbc6b34b1692e0addd5bfd7cfc043d40c0621f1b97e26fa49
+adler32(raw): 12c803f7
+md5(raw): 2a632783e2812cf23de100d7d6a463ae
+sha256(raw): 49bde3496b9510a17d0edd8a4b0ac70148e32a1d51e881ec76faa96534125838
+===Done===
diff --git a/ext/hash/tests/hash_hmac_error.phpt b/ext/hash/tests/hash_hmac_error.phpt
new file mode 100644
index 0000000..7ced431
--- /dev/null
+++ b/ext/hash/tests/hash_hmac_error.phpt
@@ -0,0 +1,54 @@
+--TEST--
+Test hash_hmac() function : basic functionality
+--SKIPIF--
+<?php extension_loaded('hash') or die('skip: hash extension not loaded.'); ?>
+--FILE--
+<?php
+/*
+* proto string hash_hmac ( string algo, string data, string key [, bool raw_output] )
+* Function is implemented in ext/hash/hash.c
+*/
+
+echo "*** Testing hash_hmac() : error conditions ***\n";
+
+$data = "This is a sample string used to test the hash_hmac function with various hashing algorithms";
+$key = 'secret';
+
+echo "\n-- Testing hash_hmac() function with less than expected no. of arguments --\n";
+var_dump(hash_hmac());
+var_dump(hash_hmac('crc32'));
+var_dump(hash_hmac('crc32', $data));
+
+echo "\n-- Testing hash_hmac() function with more than expected no. of arguments --\n";
+$extra_arg = 10;
+var_dump(hash_hmac('crc32', $data, $key, TRUE, $extra_arg));
+
+echo "\n-- Testing hash_hmac() function with invalid hash algorithm --\n";
+var_dump(hash_hmac('foo', $data, $key));
+
+?>
+===Done===
+--EXPECTF--
+*** Testing hash_hmac() : error conditions ***
+
+-- Testing hash_hmac() function with less than expected no. of arguments --
+
+Warning: hash_hmac() expects at least 3 parameters, 0 given in %s on line %d
+NULL
+
+Warning: hash_hmac() expects at least 3 parameters, 1 given in %s on line %d
+NULL
+
+Warning: hash_hmac() expects at least 3 parameters, 2 given in %s on line %d
+NULL
+
+-- Testing hash_hmac() function with more than expected no. of arguments --
+
+Warning: hash_hmac() expects at most 4 parameters, 5 given in %s on line %d
+NULL
+
+-- Testing hash_hmac() function with invalid hash algorithm --
+
+Warning: hash_hmac(): Unknown hashing algorithm: foo in %s on line %d
+bool(false)
+===Done=== \ No newline at end of file
diff --git a/ext/hash/tests/hash_hmac_file_basic.phpt b/ext/hash/tests/hash_hmac_file_basic.phpt
new file mode 100644
index 0000000..858d673
--- /dev/null
+++ b/ext/hash/tests/hash_hmac_file_basic.phpt
@@ -0,0 +1,101 @@
+--TEST--
+Test hash_hmac_file() function : basic functionality
+--SKIPIF--
+<?php extension_loaded('hash') or die('skip: hash extension not loaded.'); ?>
+--FILE--
+<?php
+
+
+/* Prototype : string hash_hmac_file ( string algo, string filename, string key [, bool raw_output] )
+ * Description: Generate a keyed hash value using the HMAC method and the contents of a given file
+ * Source code: ext/hash/hash.c
+ * Alias to functions:
+*/
+
+echo "*** Testing hash_hmac_file() : basic functionality ***\n";
+
+$file = dirname(__FILE__) . "hash_hmac_file.txt";
+/* Creating a temporary file file */
+if (($fp = fopen( $file, "w+")) == FALSE) {
+ echo "Cannot create file ($file)";
+ exit;
+}
+
+/* Writing into file */
+$content = "This is a sample string used to test the hash_hmac_file function with various hashing algorithms";
+if (is_writable($file)) {
+ if (fwrite($fp, $content) === FALSE) {
+ echo "Cannot write to file ($file)";
+ exit;
+ }
+}
+
+// close the files
+fclose($fp);
+
+$key = 'secret';
+
+
+echo "adler32: " . hash_hmac_file('adler32', $file, $key) . "\n";
+echo "crc32: " . hash_hmac_file('crc32', $file, $key) . "\n";
+echo "gost: " . hash_hmac_file('gost', $file, $key) . "\n";
+echo "haval128,3: " . hash_hmac_file('haval128,3', $file, $key) . "\n";
+echo "md2: " . hash_hmac_file('md2', $file, $key) . "\n";
+echo "md4: " . hash_hmac_file('md4', $file, $key) . "\n";
+echo "md5: " . hash_hmac_file('md5', $file, $key) . "\n";
+echo "ripemd128: " . hash_hmac_file('ripemd128', $file, $key) . "\n";
+echo "ripemd160: " . hash_hmac_file('ripemd160', $file, $key) . "\n";
+echo "ripemd256: " . hash_hmac_file('ripemd256', $file, $key) . "\n";
+echo "ripemd320: " . hash_hmac_file('ripemd320', $file, $key) . "\n";
+echo "sha1: " . hash_hmac_file('sha1', $file, $key) . "\n";
+echo "sha256: " . hash_hmac_file('sha256', $file, $key) . "\n";
+echo "sha384: " . hash_hmac_file('sha384', $file, $key) . "\n";
+echo "sha512: " . hash_hmac_file('sha512', $file, $key) . "\n";
+echo "snefru: " . hash_hmac_file('snefru', $file, $key) . "\n";
+echo "tiger192,3: " . hash_hmac_file('tiger192,3', $file, $key) . "\n";
+echo "whirlpool: " . hash_hmac_file('whirlpool', $file, $key) . "\n";
+
+echo "adler32(raw): " . bin2hex(hash_hmac_file('adler32', $file, $key, TRUE)) . "\n";
+echo "md5(raw): " . bin2hex(hash_hmac_file('md5', $file, $key, TRUE)). "\n";
+echo "sha256(raw): " . bin2hex(hash_hmac_file('sha256', $file, $key, TRUE)). "\n";
+
+echo "Error cases:\n";
+hash_hmac_file();
+hash_hmac_file('foo', $file);
+hash_hmac_file('foo', $file, $key, TRUE, 10);
+
+unlink($file);
+
+?>
+===Done===
+--EXPECTF--
+*** Testing hash_hmac_file() : basic functionality ***
+adler32: 0f8c02f9
+crc32: f2a60b9c
+gost: 94c39a40d5db852a8dc3d24e37eebf2d53e3d711457c59cd02b614f792a9d918
+haval128,3: e8fcff647f1a675acb429130fb94a17e
+md2: a685475e600314bb549ab4f33c3b27cb
+md4: cbc6bff781f48f57378d3effa27553e4
+md5: 8bddf39dd1c566c27acc7fa85ec36acf
+ripemd128: 03269b76bf61d508c50f038cbe9ba691
+ripemd160: 94652211292268d97eb63344a3a05d3009f9d2d3
+ripemd256: b6ab414cc1630e1e474fefa41976d252f38ca7cf401552774e71736165e512e7
+ripemd320: 71271a649265740eed4b9931417f979fd81eba6288f4e08ff2997bc3dd6858da054d53a9f1fffe8c
+sha1: 7f338d17b72371091abd28f451bc8d1f3a9eb3b6
+sha256: 9135286ca4c84dec711e4b831f6cd39e672e5ff93d011321274eb76733cc1e40
+sha384: 364fdc45a4c742763366ab5d3d1c17c24057e6c3b641607a36d969f00c88da25b19c8b88c8632411e3a0a02397f88aca
+sha512: d460aabdf0353655059ed0d408efa91f19c4cda46acc2a4e0adf4764b06951c899fbb2ed41519db78b58ff7be17b1b2910aebe674a56861b232143571b35c83f
+snefru: 7b79787e1c1d926b6cc98327f05c5d04ba6227ab51c1398661861196016ef34c
+tiger192,3: ca89badf843ba68e3fae5832635aa848a72a4bc11676edd4
+whirlpool: 37a0fbb90547690d5e5e11c046f6654ffdb7bab15e16d9d79c7d85765cc4bdcbfd9df8db7a3ce9558f3f244fead00ca29cf05297f75596555195a0683f15d69f
+adler32(raw): 0f8c02f9
+md5(raw): 8bddf39dd1c566c27acc7fa85ec36acf
+sha256(raw): 9135286ca4c84dec711e4b831f6cd39e672e5ff93d011321274eb76733cc1e40
+Error cases:
+
+Warning: hash_hmac_file() expects at least 3 parameters, 0 given in %s on line %d
+
+Warning: hash_hmac_file() expects at least 3 parameters, 2 given in %s on line %d
+
+Warning: hash_hmac_file() expects at most 4 parameters, 5 given in %s on line %d
+===Done===
diff --git a/ext/hash/tests/hash_hmac_file_error.phpt b/ext/hash/tests/hash_hmac_file_error.phpt
new file mode 100644
index 0000000..42ab122
--- /dev/null
+++ b/ext/hash/tests/hash_hmac_file_error.phpt
@@ -0,0 +1,54 @@
+--TEST--
+Test hash_hmac_file() function : basic functionality
+--SKIPIF--
+<?php extension_loaded('hash') or die('skip: hash extension not loaded.'); ?>
+--FILE--
+<?php
+
+/* Prototype : string hash_hmac_file ( string algo, string filename, string key [, bool raw_output] )
+ * Description: Generate a keyed hash value using the HMAC method and the contents of a given file
+ * Source code: ext/hash/hash.c
+ * Alias to functions:
+*/
+
+echo "*** Testing hash() : error conditions ***\n";
+
+$file = dirname(__FILE__) . "hash_file.txt";
+$key = 'secret';
+
+echo "\n-- Testing hash_hmac_file() function with less than expected no. of arguments --\n";
+var_dump(hash_hmac_file());
+var_dump(hash_hmac_file('crc32'));
+var_dump(hash_hmac_file('crc32', $file));
+
+echo "\n-- Testing hash_hmac_file() function with more than expected no. of arguments --\n";
+$extra_arg = 10;
+hash_hmac_file('crc32', $file, $key, TRUE, $extra_arg);
+
+echo "\n-- Testing hash_hmac_file() function with invalid hash algorithm --\n";
+hash_hmac_file('foo', $file, $key, TRUE);
+
+?>
+===Done===
+--EXPECTF--
+*** Testing hash() : error conditions ***
+
+-- Testing hash_hmac_file() function with less than expected no. of arguments --
+
+Warning: hash_hmac_file() expects at least 3 parameters, 0 given in %s on line %d
+NULL
+
+Warning: hash_hmac_file() expects at least 3 parameters, 1 given in %s on line %d
+NULL
+
+Warning: hash_hmac_file() expects at least 3 parameters, 2 given in %s on line %d
+NULL
+
+-- Testing hash_hmac_file() function with more than expected no. of arguments --
+
+Warning: hash_hmac_file() expects at most 4 parameters, 5 given in %s on line %d
+
+-- Testing hash_hmac_file() function with invalid hash algorithm --
+
+Warning: hash_hmac_file(): Unknown hashing algorithm: foo in %s on line %d
+===Done=== \ No newline at end of file
diff --git a/ext/hash/tests/haval.phpt b/ext/hash/tests/haval.phpt
new file mode 100644
index 0000000..16db2fa
--- /dev/null
+++ b/ext/hash/tests/haval.phpt
@@ -0,0 +1,76 @@
+--TEST--
+haval algorithm (multi-vector, multi-pass, multi-width)
+--SKIPIF--
+<?php if(!extension_loaded("hash")) print "skip"; ?>
+--FILE--
+<?php
+echo "Empty String\n";
+for($pass=3; $pass<=5; $pass++)
+ for($bits=128; $bits <= 256; $bits += 32) {
+ $algo = sprintf('haval%d,%d',$bits,$pass);
+ echo $algo . ': ' . hash($algo,'') . "\n";
+ }
+
+echo "\"abc\"\n";
+for($pass=3; $pass<=5; $pass++)
+ for($bits=128; $bits <= 256; $bits += 32) {
+ $algo = sprintf('haval%d,%d',$bits,$pass);
+ echo $algo . ': ' . hash($algo,'abc') . "\n";
+ }
+
+echo "\"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ0123456789\"\n";
+for($pass=3; $pass<=5; $pass++)
+ for($bits=128; $bits <= 256; $bits += 32) {
+ $algo = sprintf('haval%d,%d',$bits,$pass);
+ echo $algo . ': ' . hash($algo,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ0123456789') . "\n";
+ }
+
+--EXPECT--
+Empty String
+haval128,3: c68f39913f901f3ddf44c707357a7d70
+haval160,3: d353c3ae22a25401d257643836d7231a9a95f953
+haval192,3: e9c48d7903eaf2a91c5b350151efcb175c0fc82de2289a4e
+haval224,3: c5aae9d47bffcaaf84a8c6e7ccacd60a0dd1932be7b1a192b9214b6d
+haval256,3: 4f6938531f0bc8991f62da7bbd6f7de3fad44562b8c6f4ebf146d5b4e46f7c17
+haval128,4: ee6bbf4d6a46a679b3a856c88538bb98
+haval160,4: 1d33aae1be4146dbaaca0b6e70d7a11f10801525
+haval192,4: 4a8372945afa55c7dead800311272523ca19d42ea47b72da
+haval224,4: 3e56243275b3b81561750550e36fcd676ad2f5dd9e15f2e89e6ed78e
+haval256,4: c92b2e23091e80e375dadce26982482d197b1a2521be82da819f8ca2c579b99b
+haval128,5: 184b8482a0c050dca54b59c7f05bf5dd
+haval160,5: 255158cfc1eed1a7be7c55ddd64d9790415b933b
+haval192,5: 4839d0626f95935e17ee2fc4509387bbe2cc46cb382ffe85
+haval224,5: 4a0513c032754f5582a758d35917ac9adf3854219b39e3ac77d1837e
+haval256,5: be417bb4dd5cfb76c7126f4f8eeb1553a449039307b1a3cd451dbfdc0fbbe330
+"abc"
+haval128,3: 9e40ed883fb63e985d299b40cda2b8f2
+haval160,3: b21e876c4d391e2a897661149d83576b5530a089
+haval192,3: a7b14c9ef3092319b0e75e3b20b957d180bf20745629e8de
+haval224,3: 5bc955220ba2346a948d2848eca37bdd5eca6ecca7b594bd32923fab
+haval256,3: 8699f1e3384d05b2a84b032693e2b6f46df85a13a50d93808d6874bb8fb9e86c
+haval128,4: 6f2132867c9648419adcd5013e532fa2
+haval160,4: 77aca22f5b12cc09010afc9c0797308638b1cb9b
+haval192,4: 7e29881ed05c915903dd5e24a8e81cde5d910142ae66207c
+haval224,4: 124c43d2ba4884599d013e8c872bfea4c88b0b6bf6303974cbe04e68
+haval256,4: 8f409f1bb6b30c5016fdce55f652642261575bedca0b9533f32f5455459142b5
+haval128,5: d054232fe874d9c6c6dc8e6a853519ea
+haval160,5: ae646b04845e3351f00c5161d138940e1fa0c11c
+haval192,5: d12091104555b00119a8d07808a3380bf9e60018915b9025
+haval224,5: 8081027a500147c512e5f1055986674d746d92af4841abeb89da64ad
+haval256,5: 976cd6254c337969e5913b158392a2921af16fca51f5601d486e0a9de01156e7
+"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ0123456789"
+haval128,3: ddf4304cc5ffa3db8aab60d4f8fc2a00
+haval160,3: e709559359b15917623050e41d27a306c6c3a9db
+haval192,3: 51e25280ad356c06f4b913b3cdb3abaaac5879dda0a4fea4
+haval224,3: 28aa2c164e10bb3076574cc8aa8584fd6d04f6d82c37ea5c21e451b3
+haval256,3: 5537364e3d75174b846d21adf9b113f9d8f97e4750df64d428c01e782f9ade4d
+haval128,4: c7d981e8270e39888ba96cafe8745636
+haval160,4: 3444e38cc2a132b818b554ced8f7d9592df28f57
+haval192,4: 0ca58f140ed92828a27913ce5636611abcada220fccf3af7
+haval224,4: a9d0571d0857773e71363e4e9dfcca4696dba3e5019e7225e65e0cb1
+haval256,4: 1858d106bdc2fc787445364a163cfc6027597a45a58a2490d14203c8b9bdd268
+haval128,5: d41e927ea041d2f0c255352b1a9f6195
+haval160,5: f3245e222e6581d0c3077bd7af322af4b4fedab7
+haval192,5: fc45dc17a7b19adfed2a6485921f7af7951d70703b9357c1
+haval224,5: 29687958a6f0d54d495105df00dbda0153ee0f5708408db68a5bbea5
+haval256,5: f93421623f852ac877584d1e4bba5d9345a95f81bfd277fe36dfeed1815f83d5
diff --git a/ext/hash/tests/hmac-md5.phpt b/ext/hash/tests/hmac-md5.phpt
new file mode 100644
index 0000000..283285a
--- /dev/null
+++ b/ext/hash/tests/hmac-md5.phpt
@@ -0,0 +1,20 @@
+--TEST--
+hmac-md5 algorithm
+--SKIPIF--
+<?php if(!extension_loaded("hash")) print "skip"; ?>
+--FILE--
+<?php
+/* Test Vectors from RFC 2104 */
+$ctx = hash_init('md5',HASH_HMAC,str_repeat(chr(0x0b), 16));
+hash_update($ctx, 'Hi There');
+echo hash_final($ctx) . "\n";
+
+$ctx = hash_init('md5',HASH_HMAC,'Jefe');
+hash_update($ctx, 'what do ya want for nothing?');
+echo hash_final($ctx) . "\n";
+
+echo hash_hmac('md5', str_repeat(chr(0xDD), 50), str_repeat(chr(0xAA), 16)) . "\n";
+--EXPECT--
+9294727a3638bb1c13f48ef8158bfc9d
+750c783e6ab0b503eaa86e310a5db738
+56be34521d144c88dbb8c733f0e8b3f6
diff --git a/ext/hash/tests/joaat.phpt b/ext/hash/tests/joaat.phpt
new file mode 100644
index 0000000..fa310a9
--- /dev/null
+++ b/ext/hash/tests/joaat.phpt
@@ -0,0 +1,34 @@
+--TEST--
+Jenkins's one-at-a-time
+--SKIPIF--
+<?php extension_loaded('hash') or die ('Skip - hash extension not available'); ?>
+--FILE--
+<?php
+$tests = array(
+ array("hello world", "3e4a5a57"),
+ array("", 0),
+ array("", "000000"),
+ array("a", "ca2e9442"),
+ array("aa", "7081738e"),
+);
+
+$i = 0;
+$pass = true;
+
+foreach ($tests as $test) {
+ ++$i;
+
+ $result = hash("joaat", $test[0]);
+ if ($result != $test[1]) {
+ echo "Iteration " . $i . " failed - expected '" . $test[1] . "', got '" . $result . "' for '" . $test[1] . "'\n";
+
+ $pass = false;
+ }
+}
+
+if($pass) {
+ echo "PASS";
+}
+?>
+--EXPECT--
+PASS
diff --git a/ext/hash/tests/md2.phpt b/ext/hash/tests/md2.phpt
new file mode 100644
index 0000000..c98ad34
--- /dev/null
+++ b/ext/hash/tests/md2.phpt
@@ -0,0 +1,21 @@
+--TEST--
+md2 algorithm
+--SKIPIF--
+<?php if(!extension_loaded("hash")) print "skip"; ?>
+--FILE--
+<?php
+echo hash('md2', '') . "\n";
+echo hash('md2', 'a') . "\n";
+echo hash('md2', 'abc') . "\n";
+echo hash('md2', 'message digest') . "\n";
+echo hash('md2', 'abcdefghijklmnopqrstuvwxyz') . "\n";
+echo hash('md2', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') . "\n";
+echo hash('md2', '12345678901234567890123456789012345678901234567890123456789012345678901234567890') . "\n";
+--EXPECT--
+8350e5a3e24c153df2275c9f80692773
+32ec01ec4a6dac72c0ab96fb34c0b5d1
+da853b0d3f88d99b30283a69e6ded6bb
+ab4f496bfb2a530b219ff33031fe06b0
+4e8ddff3650292ab5a4108c3aa47940b
+da33def2a42df13975352846c30338cd
+d5976f79d83d3a0dc9806c3c66f3efd8
diff --git a/ext/hash/tests/md4.phpt b/ext/hash/tests/md4.phpt
new file mode 100644
index 0000000..8d90429
--- /dev/null
+++ b/ext/hash/tests/md4.phpt
@@ -0,0 +1,24 @@
+--TEST--
+md4 algorithm
+--SKIPIF--
+<?php if(!extension_loaded("hash")) print "skip"; ?>
+--FILE--
+<?php
+/* RFC 1320 vectors */
+echo hash('md4', '') . "\n";
+echo hash('md4', 'a') . "\n";
+echo hash('md4', 'abc') . "\n";
+echo hash('md4', 'message digest') . "\n";
+echo hash('md4', 'abcdefghijklmnopqrstuvwxyz') . "\n";
+echo hash('md4', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') . "\n";
+echo hash('md4', '12345678901234567890123456789012345678901234567890123456789012345678901234567890') . "\n";
+--EXPECT--
+31d6cfe0d16ae931b73c59d7e0c089c0
+bde52cb31de33e46245e05fbdbd6fb24
+a448017aaf21d8525fc10ae87aa6729d
+d9130a8164549fe818874806e1c7014b
+d79e1c308aa5bbcdeea8ed63df412da9
+043f8582f241db351ce627e153e7f0e4
+e33b4ddc9c38f2199c3e7b164fcc0536
+
+
diff --git a/ext/hash/tests/md5.phpt b/ext/hash/tests/md5.phpt
new file mode 100644
index 0000000..d56f0b9
--- /dev/null
+++ b/ext/hash/tests/md5.phpt
@@ -0,0 +1,16 @@
+--TEST--
+md5 algorithm
+--SKIPIF--
+<?php if(!extension_loaded("hash")) print "skip"; ?>
+--FILE--
+<?php
+echo hash('md5', '') . "\n";
+echo hash('md5', 'a') . "\n";
+echo hash('md5', '012345678901234567890123456789012345678901234567890123456789') . "\n";
+echo hash('md5', str_repeat('a', 1000000)) . "\n";
+--EXPECT--
+d41d8cd98f00b204e9800998ecf8427e
+0cc175b9c0f1b6a831c399e269772661
+1ced811af47ead374872fcca9d73dd71
+7707d6ae4e027c70eea2a935c2296f21
+
diff --git a/ext/hash/tests/mhash_001.phpt b/ext/hash/tests/mhash_001.phpt
new file mode 100644
index 0000000..e8aac9b
--- /dev/null
+++ b/ext/hash/tests/mhash_001.phpt
@@ -0,0 +1,71 @@
+--TEST--
+mhash() test
+--SKIPIF--
+<?php
+ include "skip_mhash.inc";
+?>
+--FILE--
+<?php
+
+$supported_hash_al = array(
+"MHASH_MD5" => "2d9bdb91f94e96d9c4e2ae532acc936a",
+"MHASH_SHA1" => "2f9341e55a9083edf5497bf83ba3db812a7de0a3",
+"MHASH_HAVAL256" => "b255feff01ad641b27358dc7909bc695a1fca53bddfdfaf19020b275928793af",
+"MHASH_HAVAL192" => "4ce837de481e1e30092ab2c610057094c988dfd7db1e01cd",
+"MHASH_HAVAL224" => "5362d1856752bf2c139bb2d6fdd772b9c515c8ce5ec82695264b85e1",
+"MHASH_HAVAL160" => "c6b36f87750b18576981bc17b4f22271947bf9cb",
+"MHASH_RIPEMD160" => "6c47435aa1d359c4b7c6af46349f0c3e1258583d",
+"MHASH_GOST" => "101b0a2552cebdf5137cadf15147f21e55b6432935bb9c2c03c7e28d188b2d9e",
+"MHASH_TIGER" => "953ac3799a01b9fdeb91aeab97207e67395cbb54300be00d",
+"MHASH_CRC32" => "83041db8",
+"MHASH_CRC32B" => "df5ab7a4"
+);
+
+$data = "This is the test of the mhash extension...";
+
+foreach ($supported_hash_al as $hash=>$wanted) {
+ $result = mhash(constant($hash), $data);
+ if (bin2hex($result)==$wanted) {
+ echo "$hash\nok\n";
+ } else {
+ echo "$hash: ";
+ var_dump($wanted);
+ echo "$hash: ";
+ var_dump(bin2hex($result));
+ }
+ echo "\n";
+}
+?>
+--EXPECT--
+MHASH_MD5
+ok
+
+MHASH_SHA1
+ok
+
+MHASH_HAVAL256
+ok
+
+MHASH_HAVAL192
+ok
+
+MHASH_HAVAL224
+ok
+
+MHASH_HAVAL160
+ok
+
+MHASH_RIPEMD160
+ok
+
+MHASH_GOST
+ok
+
+MHASH_TIGER
+ok
+
+MHASH_CRC32
+ok
+
+MHASH_CRC32B
+ok
diff --git a/ext/hash/tests/mhash_002.phpt b/ext/hash/tests/mhash_002.phpt
new file mode 100644
index 0000000..7bcafd3
--- /dev/null
+++ b/ext/hash/tests/mhash_002.phpt
@@ -0,0 +1,64 @@
+--TEST--
+mhash_get_block_size() & mhash_get_hash_name() test
+--SKIPIF--
+<?php
+ include "skip_mhash.inc";
+?>
+--FILE--
+<?php
+$supported_hash_al = array(
+"MD5" => 16,
+"MD4" => 16,
+"SHA1" => 20,
+"SHA256" => 32,
+"HAVAL256" => 32,
+"HAVAL192" => 24,
+"HAVAL224" => 28,
+"HAVAL160" => 20,
+"HAVAL128" => 16,
+"RIPEMD160" => 20,
+"GOST" => 32,
+"TIGER" => 24,
+"TIGER160" => 20,
+"TIGER128" => 16,
+"CRC32" => 4,
+"CRC32B" => 4,
+"ADLER32" => 4,
+"NA_XYZ" => 0 /* verify that the algorythm works */
+);
+
+$hc = mhash_count() + 1;
+
+$known_hash_al = array();
+for ($i=0; $i < $hc; $i++) {
+ $known_hash_al[mhash_get_hash_name($i)] = $i;
+}
+
+foreach ($supported_hash_al as $name => $len) {
+ if (array_key_exists($name, $known_hash_al)) {
+ $len = mhash_get_block_size($known_hash_al[$name]);
+ echo "$name = $len\n";
+ } else {
+ echo "$name ? $len\n";
+ }
+}
+?>
+--EXPECTREGEX--
+MD5 . 16
+MD4 . 16
+SHA1 . 20
+SHA256 . 32
+HAVAL256 . 32
+HAVAL192 . 24
+HAVAL224 . 28
+HAVAL160 . 20
+HAVAL128 . 16
+RIPEMD160 . 20
+GOST . 32
+TIGER . 24
+TIGER160 . 20
+TIGER128 . 16
+CRC32 . 4
+CRC32B . 4
+ADLER32 . 4
+NA_XYZ . 0
diff --git a/ext/hash/tests/mhash_003.phpt b/ext/hash/tests/mhash_003.phpt
new file mode 100644
index 0000000..38d1a8b
--- /dev/null
+++ b/ext/hash/tests/mhash_003.phpt
@@ -0,0 +1,71 @@
+--TEST--
+mhash_keygen_s2k() test
+--SKIPIF--
+<?php
+ include "skip_mhash.inc";
+?>
+--FILE--
+<?php
+
+$supported_hash_al = array(
+"MHASH_MD5" => "8690154eaf9432cde9347aa15094b9c046eb06e6a0940c5479aa7a6367ae68b5e0e0745e5709fede2d9fe9739d9aad413759faa73acced821077b4ddb2788064e371eb53b3a9d55ed2839aab2655c82cfedbe83a208461c799d9d77ae481061c81539b01",
+"MHASH_SHA1" => "dd315c70061d07455d53c2fb0b08df0c61aa665c1ab1a701fa10955423248ba832a5ade406b39b78630aba3d1688e622494a0eae279d4ece9ad4bdf76e878fcb084a33c9153c2b48131d30a75b00a7c05b91f1ffeabf59bb1271c4d8a11990b84baf6d49",
+"MHASH_HAVAL256" => "0ede47009f87d5e9a24ecf5077d60c483657a5d98404ab2bb780f5872c90caf61c0d67645a848e55fee107296f4169c95b4e61f0aeeefab2648554c1171fb0a2fc32aa5aeed3d5c155d334367d4959622cdadefe43ae17bd1a75f9d4fef77bf192be5b78",
+"MHASH_HAVAL224" => "5c4aff3d825ad608f608c8eae779ee3868610bc60a98f3d770b311a6677c797fc2dadcab71dde0c0191e068397ab297f0de5cbbc6cbcd0c78ca8470c42401f6b77e81dc2ba8d51930ff982760335324fb850ac2d30b73514004c096d60472d320e0ec349",
+"MHASH_HAVAL192" => "22e0c27126023c852ef94107bb2f1ee132b064178b9dcbfb1c32e658760b8f70bdc5b1c52599031628c2433bee2b0870ab7a38aeb21215134ec1088975b9a96487642971ef9eb3d987baf9765fd9e6d64d494e1719aa84afe7e0a0784c74979ebab1c787",
+"MHASH_HAVAL160" => "d6e5f0ef07f3facced646eedb6364758ecde6dc6fb061e00a496f5ceb723f78ea135884d9682226ded69c11d8431240ef97cad583c4f29593bbf3dd3cab0b8792eb3d86022ca6002ebd0d9b4429909d4af85bed2b5a96b3e47b9b8cac919c1177ec40d7e",
+"MHASH_RIPEMD160" => "e4d5db469af29f78e2b90dc735c9cf020a1d5b19a6674458677794d4dca144d426c562aff98d8e866a8a924299ebf6b0ea9a1637f987a1fb5de9b647edc35b1447605e1babc3084be7a003931117eb33432d4142e225df044b033f3ff64bb4a18682a4f9",
+"MHASH_GOST" => "c044f669bd7e8643953d77c682fd179242d9df157dadf873be4d9601e4647c018234689359e7220ab0492a6240d184c478634073dea87f79be7f86fd4e2564f7d709b68a46440a121250e00fc7d57d45a9c07ee23a704ff4148c0dad7077ec527b194d87",
+"MHASH_TIGER" => "470aca9d7bc9ea67e46402332f26f6b15532fe6037231cce297912d32f5142f6276b2358e7f1ccba8b116ec0c0c2a46845f7a5042f0ee41906c0db9ba9b80f82181720314d2a70981bba79da4bc9c4564d95f8d709d5604fd48d369797a218a862196f48",
+"MHASH_CRC32" => "481c40148c26185f9a59ef18e86f51c5d2d0315b46711d22ae08c1ccdd669fe956c817380815e3a545f6ee453c9da48d1d994dbc3ac8ba85a572108412f06b2a16b1489cda75b118e82f7d9bdfdb68336957bbf19e4a3f76750d6985a53dd557229dfcf3",
+"MHASH_CRC32B" => "65ab6cb5fb7d3ea67f5da92a9bd746b6628a13368fcbcd43af49092e9c6a960fd030a5ce3c1f0ddb512ec698be96e77969748db66278b0fd837d24d8c898f50bd70993b48cc8accf4b44c54431e91385ddf04c7560a1a7368fc9e6f763457c90b07f04f1"
+);
+
+foreach ($supported_hash_al as $hash=>$wanted) {
+ $passwd = str_repeat($hash, 10);
+ $salt = str_repeat($hash, 2);
+ $result = mhash_keygen_s2k(constant($hash), $passwd, $salt, 100);
+ if (!strcmp(bin2hex($result), $wanted)) {
+ echo "$hash\nok\n";
+ } else {
+ echo "$hash: ";
+ var_dump($wanted);
+ echo "$hash: ";
+ var_dump(bin2hex($result));
+ }
+ echo "\n";
+}
+?>
+--EXPECT--
+MHASH_MD5
+ok
+
+MHASH_SHA1
+ok
+
+MHASH_HAVAL256
+ok
+
+MHASH_HAVAL224
+ok
+
+MHASH_HAVAL192
+ok
+
+MHASH_HAVAL160
+ok
+
+MHASH_RIPEMD160
+ok
+
+MHASH_GOST
+ok
+
+MHASH_TIGER
+ok
+
+MHASH_CRC32
+ok
+
+MHASH_CRC32B
+ok
diff --git a/ext/hash/tests/mhash_004.phpt b/ext/hash/tests/mhash_004.phpt
new file mode 100644
index 0000000..b928a79
--- /dev/null
+++ b/ext/hash/tests/mhash_004.phpt
@@ -0,0 +1,19 @@
+--TEST--
+mhash() modifying algorithm parameter
+--SKIPIF--
+<?php
+ include "skip_mhash.inc";
+?>
+--FILE--
+<?php
+
+$algo = MHASH_MD5;
+var_dump($algo);
+var_dump(bin2hex(mhash($algo, "test")));
+var_dump($algo);
+
+?>
+--EXPECT--
+int(1)
+string(32) "098f6bcd4621d373cade4e832627b4f6"
+int(1)
diff --git a/ext/hash/tests/ripemd128.phpt b/ext/hash/tests/ripemd128.phpt
new file mode 100644
index 0000000..e7473e3
--- /dev/null
+++ b/ext/hash/tests/ripemd128.phpt
@@ -0,0 +1,25 @@
+--TEST--
+ripemd128 algorithm
+--SKIPIF--
+<?php if(!extension_loaded("hash")) print "skip"; ?>
+--FILE--
+<?php
+echo hash('ripemd128', '') . "\n";
+echo hash('ripemd128', 'a') . "\n";
+echo hash('ripemd128', 'abc') . "\n";
+echo hash('ripemd128', 'message digest') . "\n";
+echo hash('ripemd128', 'abcdefghijklmnopqrstuvwxyz') . "\n";
+echo hash('ripemd128', 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq') . "\n";
+echo hash('ripemd128', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') . "\n";
+echo hash('ripemd128', '12345678901234567890123456789012345678901234567890123456789012345678901234567890') . "\n";
+echo hash('ripemd128', str_repeat('a', 1000000)) . "\n";
+--EXPECT--
+cdf26213a150dc3ecb610f18f6b38b46
+86be7afa339d0fc7cfc785e72f578d33
+c14a12199c66e4ba84636b0f69144c77
+9e327b3d6e523062afc1132d7df9d1b8
+fd2aa607f71dc8f510714922b371834e
+a1aa0689d0fafa2ddc22e88b49133a06
+d1e959eb179c911faea4624c60c5c702
+3f45ef194732c2dbb2c4a2c769795fa3
+4a7f5723f954eba1216c9d8f6320431f
diff --git a/ext/hash/tests/ripemd160.phpt b/ext/hash/tests/ripemd160.phpt
new file mode 100644
index 0000000..8fe7b05
--- /dev/null
+++ b/ext/hash/tests/ripemd160.phpt
@@ -0,0 +1,25 @@
+--TEST--
+ripemd160 algorithm
+--SKIPIF--
+<?php if(!extension_loaded("hash")) print "skip"; ?>
+--FILE--
+<?php
+echo hash('ripemd160', '') . "\n";
+echo hash('ripemd160', 'a') . "\n";
+echo hash('ripemd160', 'abc') . "\n";
+echo hash('ripemd160', 'message digest') . "\n";
+echo hash('ripemd160', 'abcdefghijklmnopqrstuvwxyz') . "\n";
+echo hash('ripemd160', 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq') . "\n";
+echo hash('ripemd160', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') . "\n";
+echo hash('ripemd160', '12345678901234567890123456789012345678901234567890123456789012345678901234567890') . "\n";
+echo hash('ripemd160', str_repeat('a', 1000000)) . "\n";
+--EXPECT--
+9c1185a5c5e9fc54612808977ee8f548b2258d31
+0bdc9d2d256b3ee9daae347be6f4dc835a467ffe
+8eb208f7e05d987a9b044a8e98c6b087f15a0bfc
+5d0689ef49d2fae572b881b123a85ffa21595f36
+f71c27109c692c1b56bbdceb5b9d2865b3708dbc
+12a053384a9c0c88e405a06c27dcf49ada62eb2b
+b0e20b6e3116640286ed3a87a5713079b21f5189
+9b752e45573d4b39f4dbd3323cab82bf63326bfb
+52783243c1697bdbe16d37f97f68f08325dc1528
diff --git a/ext/hash/tests/ripemd256.phpt b/ext/hash/tests/ripemd256.phpt
new file mode 100644
index 0000000..6fc2379
--- /dev/null
+++ b/ext/hash/tests/ripemd256.phpt
@@ -0,0 +1,25 @@
+--TEST--
+ripemd256 algorithm
+--SKIPIF--
+<?php if(!extension_loaded("hash")) print "skip"; ?>
+--FILE--
+<?php
+echo hash('ripemd256', '') . "\n";
+echo hash('ripemd256', 'a') . "\n";
+echo hash('ripemd256', 'abc') . "\n";
+echo hash('ripemd256', 'message digest') . "\n";
+echo hash('ripemd256', 'abcdefghijklmnopqrstuvwxyz') . "\n";
+echo hash('ripemd256', 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq') . "\n";
+echo hash('ripemd256', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') . "\n";
+echo hash('ripemd256', '12345678901234567890123456789012345678901234567890123456789012345678901234567890') . "\n";
+echo hash('ripemd256', str_repeat('a', 1000000)) . "\n";
+--EXPECT--
+02ba4c4e5f8ecd1877fc52d64d30e37a2d9774fb1e5d026380ae0168e3c5522d
+f9333e45d857f5d90a91bab70a1eba0cfb1be4b0783c9acfcd883a9134692925
+afbd6e228b9d8cbbcef5ca2d03e6dba10ac0bc7dcbe4680e1e42d2e975459b65
+87e971759a1ce47a514d5c914c392c9018c7c46bc14465554afcdf54a5070c0e
+649d3034751ea216776bf9a18acc81bc7896118a5197968782dd1fd97d8d5133
+3843045583aac6c8c8d9128573e7a9809afb2a0f34ccc36ea9e72f16f6368e3f
+5740a408ac16b720b84424ae931cbb1fe363d1d0bf4017f1a89f7ea6de77a0b8
+06fdcc7a409548aaf91368c06a6275b553e3f099bf0ea4edfd6778df89a890dd
+ac953744e10e31514c150d4d8d7b677342e33399788296e43ae4850ce4f97978
diff --git a/ext/hash/tests/ripemd320.phpt b/ext/hash/tests/ripemd320.phpt
new file mode 100644
index 0000000..152c922
--- /dev/null
+++ b/ext/hash/tests/ripemd320.phpt
@@ -0,0 +1,25 @@
+--TEST--
+ripemd320 algorithm
+--SKIPIF--
+<?php if(!extension_loaded("hash")) print "skip"; ?>
+--FILE--
+<?php
+echo hash('ripemd320', '') . "\n";
+echo hash('ripemd320', 'a') . "\n";
+echo hash('ripemd320', 'abc') . "\n";
+echo hash('ripemd320', 'message digest') . "\n";
+echo hash('ripemd320', 'abcdefghijklmnopqrstuvwxyz') . "\n";
+echo hash('ripemd320', 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq') . "\n";
+echo hash('ripemd320', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') . "\n";
+echo hash('ripemd320', '12345678901234567890123456789012345678901234567890123456789012345678901234567890') . "\n";
+echo hash('ripemd320', str_repeat('a', 1000000)) . "\n";
+--EXPECT--
+22d65d5661536cdc75c1fdf5c6de7b41b9f27325ebc61e8557177d705a0ec880151c3a32a00899b8
+ce78850638f92658a5a585097579926dda667a5716562cfcf6fbe77f63542f99b04705d6970dff5d
+de4c01b3054f8930a79d09ae738e92301e5a17085beffdc1b8d116713e74f82fa942d64cdbc4682d
+3a8e28502ed45d422f68844f9dd316e7b98533fa3f2a91d29f84d425c88d6b4eff727df66a7c0197
+cabdb1810b92470a2093aa6bce05952c28348cf43ff60841975166bb40ed234004b8824463e6b009
+d034a7950cf722021ba4b84df769a5de2060e259df4c9bb4a4268c0e935bbc7470a969c9d072a1ac
+ed544940c86d67f250d232c30b7b3e5770e0c60c8cb9a4cafe3b11388af9920e1b99230b843c86a4
+557888af5f6d8ed62ab66945c6d2a0a47ecd5341e915eb8fea1d0524955f825dc717e4a008ab2d42
+bdee37f4371e20646b8b0d862dda16292ae36f40965e8c8509e63d1dbddecc503e2b63eb9245bb66
diff --git a/ext/hash/tests/sha1.phpt b/ext/hash/tests/sha1.phpt
new file mode 100644
index 0000000..b193781
--- /dev/null
+++ b/ext/hash/tests/sha1.phpt
@@ -0,0 +1,21 @@
+--TEST--
+sha1 algorithm
+--SKIPIF--
+<?php if(!extension_loaded("hash")) print "skip"; ?>
+--FILE--
+<?php
+echo hash('sha1', '') . "\n";
+echo hash('sha1', 'a') . "\n";
+echo hash('sha1', '012345678901234567890123456789012345678901234567890123456789') . "\n";
+
+/* FIPS-180 Vectors */
+echo hash('sha1', 'abc') . "\n";
+echo hash('sha1', 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq') . "\n";
+echo hash('sha1', str_repeat('a', 1000000)) . "\n";
+--EXPECT--
+da39a3ee5e6b4b0d3255bfef95601890afd80709
+86f7e437faa5a7fce15d1ddcb9eaeaea377667b8
+f52e3c2732de7bea28f216d877d78dae1aa1ac6a
+a9993e364706816aba3e25717850c26c9cd0d89d
+84983e441c3bd26ebaae4aa1f95129e5e54670f1
+34aa973cd4c4daa4f61eeb2bdbad27316534016f
diff --git a/ext/hash/tests/sha224.phpt b/ext/hash/tests/sha224.phpt
new file mode 100644
index 0000000..ab2bd6d
--- /dev/null
+++ b/ext/hash/tests/sha224.phpt
@@ -0,0 +1,22 @@
+--TEST--
+sha224 algorithm
+--SKIPIF--
+<?php if(!extension_loaded("hash")) print "skip"; ?>
+--FILE--
+<?php
+echo hash('sha224', '') . "\n";
+echo hash('sha224', 'a') . "\n";
+echo hash('sha224', '012345678901234567890123456789012345678901234567890123456789') . "\n";
+
+/* FIPS-180 Vectors */
+echo hash('sha224', 'abc') . "\n";
+echo hash('sha224', 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq') . "\n";
+echo hash('sha224', str_repeat('a', 1000000)) . "\n";
+--EXPECT--
+d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f
+abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5
+ae5c0d27fe120752911c994718296a3bccc77000aac07b8810714932
+23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7
+75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525
+20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67
+
diff --git a/ext/hash/tests/sha256.phpt b/ext/hash/tests/sha256.phpt
new file mode 100644
index 0000000..04b1c11
--- /dev/null
+++ b/ext/hash/tests/sha256.phpt
@@ -0,0 +1,22 @@
+--TEST--
+sha256 algorithm
+--SKIPIF--
+<?php if(!extension_loaded("hash")) print "skip"; ?>
+--FILE--
+<?php
+echo hash('sha256', '') . "\n";
+echo hash('sha256', 'a') . "\n";
+echo hash('sha256', '012345678901234567890123456789012345678901234567890123456789') . "\n";
+
+/* FIPS-180 Vectors */
+echo hash('sha256', 'abc') . "\n";
+echo hash('sha256', 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq') . "\n";
+echo hash('sha256', str_repeat('a', 1000000)) . "\n";
+--EXPECT--
+e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb
+5e43c8704ac81f33d701c1ace046ba9f257062b4d17e78f3254cbf243177e4f2
+ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
+248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1
+cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0
+
diff --git a/ext/hash/tests/sha384.phpt b/ext/hash/tests/sha384.phpt
new file mode 100644
index 0000000..e5be2ab
--- /dev/null
+++ b/ext/hash/tests/sha384.phpt
@@ -0,0 +1,21 @@
+--TEST--
+sha384 algorithm
+--SKIPIF--
+<?php if(!extension_loaded("hash")) print "skip"; ?>
+--FILE--
+<?php
+echo hash('sha384', '') . "\n";
+echo hash('sha384', 'a') . "\n";
+echo hash('sha384', '012345678901234567890123456789012345678901234567890123456789') . "\n";
+
+/* FIPS-180 Vectors */
+echo hash('sha384', 'abc') . "\n";
+echo hash('sha384', 'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu') . "\n";
+echo hash('sha384', str_repeat('a', 1000000)) . "\n";
+--EXPECT--
+38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b
+54a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31
+ce6bebce38aad0fd35805b50f77f3e1814d46df8e930356ec905a5d7b94bfa615fce4c3b6caf50eb4a7f1a1164887470
+cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7
+09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039
+9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b07b8b3dc38ecc4ebae97ddd87f3d8985
diff --git a/ext/hash/tests/sha512.phpt b/ext/hash/tests/sha512.phpt
new file mode 100644
index 0000000..93fbb20
--- /dev/null
+++ b/ext/hash/tests/sha512.phpt
@@ -0,0 +1,21 @@
+--TEST--
+sha512 algorithm
+--SKIPIF--
+<?php if(!extension_loaded("hash")) print "skip"; ?>
+--FILE--
+<?php
+echo hash('sha512', '') . "\n";
+echo hash('sha512', 'a') . "\n";
+echo hash('sha512', '012345678901234567890123456789012345678901234567890123456789') . "\n";
+
+/* FIPS-180 Vectors */
+echo hash('sha512', 'abc') . "\n";
+echo hash('sha512', 'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu') . "\n";
+echo hash('sha512', str_repeat('a', 1000000)) . "\n";
+--EXPECT--
+cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e
+1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75
+e3e33e00eec4753ea01c134b21c52badc44d364648ba2321ff18aa213902759b04f7f0dbfff426acec097c09476adcd0666d2d86e8cc2fcd4f7c549acbfbfd94
+ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f
+8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909
+e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b
diff --git a/ext/hash/tests/skip_mhash.inc b/ext/hash/tests/skip_mhash.inc
new file mode 100644
index 0000000..17e5fe7
--- /dev/null
+++ b/ext/hash/tests/skip_mhash.inc
@@ -0,0 +1,5 @@
+<?php
+if (!extension_loaded("mhash") || !function_exists("mhash")) {
+ die("skip mhash extension is not available");
+}
+?>
diff --git a/ext/hash/tests/snefru.phpt b/ext/hash/tests/snefru.phpt
new file mode 100644
index 0000000..1b0dfa7
--- /dev/null
+++ b/ext/hash/tests/snefru.phpt
@@ -0,0 +1,18 @@
+--TEST--
+snefru
+--SKIPIF--
+<?php extension_loaded('hash') or die('skip'); ?>
+--FILE--
+<?php
+echo hash('snefru', ''), "\n";
+echo hash('snefru', 'The quick brown fox jumps over the lazy dog'), "\n";
+echo hash('snefru', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'), "\n";
+echo hash('snefru', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'), "\n";
+echo hash('snefru', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'), "\n";
+?>
+--EXPECT--
+8617f366566a011837f4fb4ba5bedea2b892f3ed8b894023d16ae344b2be5881
+674caa75f9d8fd2089856b95e93a4fb42fa6c8702f8980e11d97a142d76cb358
+94682bc46e5fbb8417e2f3e10ed360484048d946bb8cbb0ea4cad2700dbeaab0
+c54c602ac46383716ee7200a76c9c90a7b435bbe31d13f04e0b00a7ea5c347fa
+7a8539c59e192e8d70b1ab82aa86a1b54560d42020bda4e00ddd6d048fe3bcaa
diff --git a/ext/hash/tests/tiger.phpt b/ext/hash/tests/tiger.phpt
new file mode 100644
index 0000000..468fc8f
--- /dev/null
+++ b/ext/hash/tests/tiger.phpt
@@ -0,0 +1,19 @@
+--TEST--
+tiger
+--SKIPIF--
+<?php extension_loaded('hash') or die('skip'); ?>
+--FILE--
+<?php
+echo hash('tiger192,3', ''),"\n";
+echo hash('tiger192,3', 'abc'),"\n";
+echo hash('tiger192,3', str_repeat('a', 63)),"\n";
+echo hash('tiger192,3', str_repeat('abc', 61)),"\n";
+echo hash('tiger192,3', str_repeat('abc', 64)),"\n";
+?>
+--EXPECT--
+3293ac630c13f0245f92bbb1766e16167a4e58492dde73f3
+2aab1484e8c158f2bfb8c5ff41b57a525129131c957b5f93
+9366604ea109e48ed763caabb2d5633b4946eb295ef5781a
+b19abf166d158625808f035edf8be4e6b0bcb31d070ec353
+badd965340a9e83e4a16f48a5038c01b856a9158ef59fec1
+
diff --git a/ext/hash/tests/whirlpool.phpt b/ext/hash/tests/whirlpool.phpt
new file mode 100644
index 0000000..5f9dd16
--- /dev/null
+++ b/ext/hash/tests/whirlpool.phpt
@@ -0,0 +1,14 @@
+--TEST--
+whirlpool
+--SKIPIF--
+<?php extension_loaded('hash') or die('skip'); ?>
+--FILE--
+<?php
+echo hash('whirlpool', ''), "\n";
+echo hash('whirlpool', $s='---qwertzuiopasdfghjklyxcvbnm------qwertzuiopasdfghjklyxcvbnm---'), "\n";
+echo hash('whirlpool', str_repeat($s.'0', 1000)), "\n";
+?>
+--EXPECT--
+19fa61d75522a4669b44e39c1d2e1726c530232130d407f89afee0964997f7a73e83be698b288febcf88e3e03c4f0757ea8964e59b63d93708b138cc42a66eb3
+916ce6431d2f384be68d96bcaba800c21b82e9cc2f07076554c9557f85476b5d8f2b263951121fa955e34b31a4cdc857bdf076b123c2252543dcef34f84a7ef3
+b51984710d11893ac08e10529519f9801d82ea534629d14bc8c810307934496017ccdf23bfcb62c7e1259664e84c9388ff646b0b46688b0a6c32e5571234dd95