summaryrefslogtreecommitdiff
path: root/ext/hash
diff options
context:
space:
mode:
Diffstat (limited to 'ext/hash')
-rw-r--r--ext/hash/CREDITS2
-rw-r--r--ext/hash/README19
-rw-r--r--ext/hash/bench.php92
-rw-r--r--ext/hash/config.m440
-rw-r--r--ext/hash/config.w3225
-rw-r--r--ext/hash/hash.c1107
-rw-r--r--ext/hash/hash_adler32.c82
-rw-r--r--ext/hash/hash_crc32.c102
-rw-r--r--ext/hash/hash_fnv.c229
-rw-r--r--ext/hash/hash_gost.c322
-rw-r--r--ext/hash/hash_haval.c551
-rw-r--r--ext/hash/hash_joaat.c99
-rw-r--r--ext/hash/hash_md.c704
-rw-r--r--ext/hash/hash_ripemd.c775
-rw-r--r--ext/hash/hash_sha.c1044
-rw-r--r--ext/hash/hash_snefru.c213
-rw-r--r--ext/hash/hash_tiger.c271
-rw-r--r--ext/hash/hash_whirlpool.c453
-rw-r--r--ext/hash/package.xml95
-rw-r--r--ext/hash/php_hash.h156
-rw-r--r--ext/hash/php_hash_adler32.h44
-rw-r--r--ext/hash/php_hash_crc32.h45
-rw-r--r--ext/hash/php_hash_crc32_tables.h149
-rw-r--r--ext/hash/php_hash_fnv.h79
-rw-r--r--ext/hash/php_hash_gost.h47
-rw-r--r--ext/hash/php_hash_gost_tables.h138
-rw-r--r--ext/hash/php_hash_haval.h59
-rw-r--r--ext/hash/php_hash_joaat.h43
-rw-r--r--ext/hash/php_hash_md.h100
-rw-r--r--ext/hash/php_hash_ripemd.h66
-rw-r--r--ext/hash/php_hash_sha.h97
-rw-r--r--ext/hash/php_hash_snefru.h51
-rw-r--r--ext/hash/php_hash_snefru_tables.h942
-rw-r--r--ext/hash/php_hash_tiger.h49
-rw-r--r--ext/hash/php_hash_tiger_tables.h549
-rw-r--r--ext/hash/php_hash_types.h71
-rw-r--r--ext/hash/php_hash_whirlpool.h48
-rw-r--r--ext/hash/php_hash_whirlpool_tables.h585
-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
78 files changed, 11665 insertions, 0 deletions
diff --git a/ext/hash/CREDITS b/ext/hash/CREDITS
new file mode 100644
index 0000000..5316a09
--- /dev/null
+++ b/ext/hash/CREDITS
@@ -0,0 +1,2 @@
+PHP hash
+Sara Golemon, Rasmus Lerdorf, Stefan Esser, Michael Wallner, Scott MacVicar
diff --git a/ext/hash/README b/ext/hash/README
new file mode 100644
index 0000000..97eb206
--- /dev/null
+++ b/ext/hash/README
@@ -0,0 +1,19 @@
+Generic hashing framework for PHP
+
+Simplest usages:
+
+$digest = hash($algoname, $message);
+$digest = hash_file($algoname, $filename);
+
+Examples:
+
+$digest = hash('md5', 'The quick brown fox jumped over the lazy dog.');
+
+Feeder usage:
+
+$context = hash_init($algoname);
+hash_update($context, $message);
+$digest = hash_final($context);
+
+hash(), hash_file(), and hash_final() each support an optional boolean parameter $raw_output which behaves in the same
+manner as sha1()'s optional parameter.
diff --git a/ext/hash/bench.php b/ext/hash/bench.php
new file mode 100644
index 0000000..a433af0
--- /dev/null
+++ b/ext/hash/bench.php
@@ -0,0 +1,92 @@
+<?php
+/* $Id$ */
+
+/*
+ This gives rather interesting results :)
+
+ Measures on a Notebook P4M-1.7 256MB Windows 2000:
+ sha1 0.556691
+ tiger160,3 0.774469
+ tiger192,3 0.776314
+ tiger128,3 0.777004
+ ripemd128 0.896674
+ sha256 1.011164
+ md5 1.016032
+ tiger160,4 1.056617
+ tiger128,4 1.063101
+ tiger192,4 1.069258
+ haval160,3 1.125099
+ haval128,3 1.125679
+ haval224,3 1.128017
+ haval192,3 1.130026
+ haval256,3 1.134846
+ ripemd160 1.150693
+ haval128,4 1.686261
+ haval192,4 1.687274
+ haval160,4 1.693091
+ haval256,4 1.699323
+ haval224,4 1.743094
+ haval160,5 2.003452
+ haval192,5 2.008341
+ haval256,5 2.009048
+ haval128,5 2.009555
+ haval224,5 2.015539
+ sha384 3.370734
+ sha512 3.381121
+ whirlpool 6.912327
+ snefru 9.268168
+
+ Measures on a Desktop P4-2.4 512MB Debian (Linux-2.4):
+ md5 0.147739
+ haval128,3 0.317006
+ haval192,3 0.317524
+ haval256,3 0.317526
+ haval160,3 0.323035
+ haval224,3 0.333318
+ ripemd128 0.353447
+ sha1 0.376200
+ ripemd160 0.413758
+ sha256 0.435957
+ haval160,4 0.452357
+ haval224,4 0.454531
+ haval128,4 0.458026
+ haval256,4 0.459051
+ haval192,4 0.468094
+ haval128,5 0.524262
+ haval160,5 0.529573
+ haval224,5 0.533655
+ haval256,5 0.534446
+ haval192,5 0.543726
+ tiger128,3 0.577975
+ tiger160,3 0.579951
+ tiger192,3 0.597111
+ tiger192,4 0.781408
+ tiger160,4 0.801243
+ tiger128,4 0.812239
+ sha512 1.298627
+ sha384 1.313607
+ whirlpool 1.556159
+ snefru 5.703742
+
+*/
+
+error_reporting(E_ALL&~E_NOTICE);
+
+$data = file_get_contents(__FILE__);
+$time = array();
+
+for ($j = 0; $j < 10; $j++) {
+ foreach (hash_algos() as $algo) {
+ $start = microtime(true);
+ for ($i = 0; $i < 1000; $i++) {
+ hash($algo, $data);
+ }
+ $time[$algo] += microtime(true)-$start;
+ }
+}
+
+asort($time, SORT_NUMERIC);
+foreach ($time as $a => $t) {
+ printf("%-12s %02.6f\n", $a, $t);
+}
+?>
diff --git a/ext/hash/config.m4 b/ext/hash/config.m4
new file mode 100644
index 0000000..79ac25e
--- /dev/null
+++ b/ext/hash/config.m4
@@ -0,0 +1,40 @@
+dnl $Id$
+dnl config.m4 for extension hash
+
+PHP_ARG_WITH(mhash, for mhash support,
+[ --with-mhash[=DIR] Include mhash support])
+
+PHP_ARG_ENABLE(hash, whether to enable hash support,
+[ --disable-hash Disable hash support], yes)
+
+if test "$PHP_MHASH" != "no"; then
+ if test "$PHP_HASH" = "no"; then
+ PHP_HASH="yes"
+ fi
+
+ AC_DEFINE(PHP_MHASH_BC, 1, [ ])
+fi
+
+if test "$PHP_HASH" != "no"; then
+ AC_DEFINE(HAVE_HASH_EXT,1,[Have HASH Extension])
+
+ PHP_C_BIGENDIAN
+
+ AC_CHECK_SIZEOF(short, 2)
+ AC_CHECK_SIZEOF(int, 4)
+ AC_CHECK_SIZEOF(long, 4)
+ AC_CHECK_SIZEOF(long long, 8)
+
+ EXT_HASH_SOURCES="hash.c hash_md.c hash_sha.c hash_ripemd.c hash_haval.c \
+ hash_tiger.c hash_gost.c hash_snefru.c hash_whirlpool.c hash_adler32.c \
+ hash_crc32.c hash_fnv.c hash_joaat.c"
+ EXT_HASH_HEADERS="php_hash.h php_hash_md.h php_hash_sha.h php_hash_ripemd.h \
+ php_hash_haval.h php_hash_tiger.h php_hash_gost.h php_hash_snefru.h \
+ php_hash_whirlpool.h php_hash_adler32.h php_hash_crc32.h \
+ php_hash_fnv.h php_hash_joaat.h php_hash_types.h"
+
+ PHP_NEW_EXTENSION(hash, $EXT_HASH_SOURCES, $ext_shared)
+ ifdef([PHP_INSTALL_HEADERS], [
+ PHP_INSTALL_HEADERS(ext/hash, $EXT_HASH_HEADERS)
+ ])
+fi
diff --git a/ext/hash/config.w32 b/ext/hash/config.w32
new file mode 100644
index 0000000..abe8675
--- /dev/null
+++ b/ext/hash/config.w32
@@ -0,0 +1,25 @@
+// $Id$
+// vim:ft=javascript
+
+ARG_ENABLE("hash", "enable hash support", "yes");
+ARG_WITH("mhash", "mhash support", "no");
+
+if (PHP_MHASH != "no") {
+ if (PHP_HASH == "no") {
+ PHP_HASH = "yes";
+ }
+ AC_DEFINE('PHP_MHASH_BC', 1);
+}
+
+if (PHP_HASH != "no") {
+ AC_DEFINE('HAVE_HASH_EXT', 1);
+ EXTENSION("hash", "hash.c hash_md.c hash_sha.c hash_ripemd.c hash_haval.c "
+ + "hash_tiger.c hash_gost.c hash_snefru.c hash_whirlpool.c "
+ + "hash_adler32.c hash_crc32.c hash_joaat.c hash_fnv.c");
+
+ PHP_INSTALL_HEADERS("ext/hash/", "php_hash.h php_hash_md.h php_hash_sha.h php_hash_ripemd.h " +
+ "php_hash_haval.h php_hash_tiger.h php_hash_gost.h php_hash_snefru.h " +
+ "php_hash_whirlpool.h php_hash_adler32.h php_hash_crc32.h " +
+ "php_hash_types.h");
+}
+
diff --git a/ext/hash/hash.c b/ext/hash/hash.c
new file mode 100644
index 0000000..f5dca3f
--- /dev/null
+++ b/ext/hash/hash.c
@@ -0,0 +1,1107 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Sara Golemon <pollita@php.net> |
+ | Scott MacVicar <scottmac@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "php_hash.h"
+#include "ext/standard/info.h"
+#include "ext/standard/file.h"
+
+static int php_hash_le_hash;
+HashTable php_hash_hashtable;
+
+#if (PHP_MAJOR_VERSION >= 5)
+# define DEFAULT_CONTEXT FG(default_context)
+#else
+# define DEFAULT_CONTEXT NULL
+#endif
+
+#ifdef PHP_MHASH_BC
+struct mhash_bc_entry {
+ char *mhash_name;
+ char *hash_name;
+ int value;
+};
+
+#define MHASH_NUM_ALGOS 34
+
+static struct mhash_bc_entry mhash_to_hash[MHASH_NUM_ALGOS] = {
+ {"CRC32", "crc32", 0},
+ {"MD5", "md5", 1},
+ {"SHA1", "sha1", 2},
+ {"HAVAL256", "haval256,3", 3},
+ {NULL, NULL, 4},
+ {"RIPEMD160", "ripemd160", 5},
+ {NULL, NULL, 6},
+ {"TIGER", "tiger192,3", 7},
+ {"GOST", "gost", 8},
+ {"CRC32B", "crc32b", 9},
+ {"HAVAL224", "haval224,3", 10},
+ {"HAVAL192", "haval192,3", 11},
+ {"HAVAL160", "haval160,3", 12},
+ {"HAVAL128", "haval128,3", 13},
+ {"TIGER128", "tiger128,3", 14},
+ {"TIGER160", "tiger160,3", 15},
+ {"MD4", "md4", 16},
+ {"SHA256", "sha256", 17},
+ {"ADLER32", "adler32", 18},
+ {"SHA224", "sha224", 19},
+ {"SHA512", "sha512", 20},
+ {"SHA384", "sha384", 21},
+ {"WHIRLPOOL", "whirlpool", 22},
+ {"RIPEMD128", "ripemd128", 23},
+ {"RIPEMD256", "ripemd256", 24},
+ {"RIPEMD320", "ripemd320", 25},
+ {NULL, NULL, 26}, /* support needs to be added for snefru 128 */
+ {"SNEFRU256", "snefru256", 27},
+ {"MD2", "md2", 28},
+ {"FNV132", "fnv132", 29},
+ {"FNV1A32", "fnv1a32", 30},
+ {"FNV164", "fnv164", 31},
+ {"FNV1A64", "fnv1a64", 32},
+ {"JOAAT", "joaat", 33},
+};
+#endif
+
+/* Hash Registry Access */
+
+PHP_HASH_API const php_hash_ops *php_hash_fetch_ops(const char *algo, int algo_len) /* {{{ */
+{
+ php_hash_ops *ops;
+ char *lower = estrndup(algo, algo_len);
+
+ zend_str_tolower(lower, algo_len);
+ if (SUCCESS != zend_hash_find(&php_hash_hashtable, lower, algo_len + 1, (void*)&ops)) {
+ ops = NULL;
+ }
+ efree(lower);
+
+ return ops;
+}
+/* }}} */
+
+PHP_HASH_API void php_hash_register_algo(const char *algo, const php_hash_ops *ops) /* {{{ */
+{
+ int algo_len = strlen(algo);
+ char *lower = estrndup(algo, algo_len);
+
+ zend_str_tolower(lower, algo_len);
+ zend_hash_add(&php_hash_hashtable, lower, algo_len + 1, (void*)ops, sizeof(php_hash_ops), NULL);
+ efree(lower);
+}
+/* }}} */
+
+PHP_HASH_API int php_hash_copy(const void *ops, void *orig_context, void *dest_context) /* {{{ */
+{
+ php_hash_ops *hash_ops = (php_hash_ops *)ops;
+
+ memcpy(dest_context, orig_context, hash_ops->context_size);
+ return SUCCESS;
+}
+/* }}} */
+
+/* Userspace */
+
+static void php_hash_do_hash(INTERNAL_FUNCTION_PARAMETERS, int isfilename, zend_bool raw_output_default) /* {{{ */
+{
+ char *algo, *data, *digest;
+ int algo_len, data_len;
+ zend_bool raw_output = raw_output_default;
+ const php_hash_ops *ops;
+ void *context;
+ php_stream *stream = NULL;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|b", &algo, &algo_len, &data, &data_len, &raw_output) == FAILURE) {
+ return;
+ }
+
+ ops = php_hash_fetch_ops(algo, algo_len);
+ if (!ops) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown hashing algorithm: %s", algo);
+ RETURN_FALSE;
+ }
+ if (isfilename) {
+ if (CHECK_NULL_PATH(data, data_len)) {
+ RETURN_FALSE;
+ }
+ stream = php_stream_open_wrapper_ex(data, "rb", REPORT_ERRORS, NULL, DEFAULT_CONTEXT);
+ if (!stream) {
+ /* Stream will report errors opening file */
+ RETURN_FALSE;
+ }
+ }
+
+ context = emalloc(ops->context_size);
+ ops->hash_init(context);
+
+ if (isfilename) {
+ char buf[1024];
+ int n;
+
+ while ((n = php_stream_read(stream, buf, sizeof(buf))) > 0) {
+ ops->hash_update(context, (unsigned char *) buf, n);
+ }
+ php_stream_close(stream);
+ } else {
+ ops->hash_update(context, (unsigned char *) data, data_len);
+ }
+
+ digest = emalloc(ops->digest_size + 1);
+ ops->hash_final((unsigned char *) digest, context);
+ efree(context);
+
+ if (raw_output) {
+ digest[ops->digest_size] = 0;
+ RETURN_STRINGL(digest, ops->digest_size, 0);
+ } else {
+ char *hex_digest = safe_emalloc(ops->digest_size, 2, 1);
+
+ php_hash_bin2hex(hex_digest, (unsigned char *) digest, ops->digest_size);
+ hex_digest[2 * ops->digest_size] = 0;
+ efree(digest);
+ RETURN_STRINGL(hex_digest, 2 * ops->digest_size, 0);
+ }
+}
+/* }}} */
+
+/* {{{ proto string hash(string algo, string data[, bool raw_output = false])
+Generate a hash of a given input string
+Returns lowercase hexits by default */
+PHP_FUNCTION(hash)
+{
+ php_hash_do_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 0);
+}
+/* }}} */
+
+/* {{{ proto string hash_file(string algo, string filename[, bool raw_output = false])
+Generate a hash of a given file
+Returns lowercase hexits by default */
+PHP_FUNCTION(hash_file)
+{
+ php_hash_do_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1, 0);
+}
+/* }}} */
+
+static void php_hash_do_hash_hmac(INTERNAL_FUNCTION_PARAMETERS, int isfilename, zend_bool raw_output_default) /* {{{ */
+{
+ char *algo, *data, *digest, *key, *K;
+ int algo_len, data_len, key_len, i;
+ zend_bool raw_output = raw_output_default;
+ const php_hash_ops *ops;
+ void *context;
+ php_stream *stream = NULL;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss|b", &algo, &algo_len, &data, &data_len,
+ &key, &key_len, &raw_output) == FAILURE) {
+ return;
+ }
+
+ ops = php_hash_fetch_ops(algo, algo_len);
+ if (!ops) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown hashing algorithm: %s", algo);
+ RETURN_FALSE;
+ }
+ if (isfilename) {
+ stream = php_stream_open_wrapper_ex(data, "rb", REPORT_ERRORS, NULL, DEFAULT_CONTEXT);
+ if (!stream) {
+ /* Stream will report errors opening file */
+ RETURN_FALSE;
+ }
+ }
+
+ context = emalloc(ops->context_size);
+ ops->hash_init(context);
+
+ K = emalloc(ops->block_size);
+ memset(K, 0, ops->block_size);
+
+ if (key_len > ops->block_size) {
+ /* Reduce the key first */
+ ops->hash_update(context, (unsigned char *) key, key_len);
+ ops->hash_final((unsigned char *) K, context);
+ /* Make the context ready to start over */
+ ops->hash_init(context);
+ } else {
+ memcpy(K, key, key_len);
+ }
+
+ /* XOR ipad */
+ for(i=0; i < ops->block_size; i++) {
+ K[i] ^= 0x36;
+ }
+ ops->hash_update(context, (unsigned char *) K, ops->block_size);
+
+ if (isfilename) {
+ char buf[1024];
+ int n;
+
+ while ((n = php_stream_read(stream, buf, sizeof(buf))) > 0) {
+ ops->hash_update(context, (unsigned char *) buf, n);
+ }
+ php_stream_close(stream);
+ } else {
+ ops->hash_update(context, (unsigned char *) data, data_len);
+ }
+
+ digest = emalloc(ops->digest_size + 1);
+ ops->hash_final((unsigned char *) digest, context);
+
+ /* Convert K to opad -- 0x6A = 0x36 ^ 0x5C */
+ for(i=0; i < ops->block_size; i++) {
+ K[i] ^= 0x6A;
+ }
+
+ /* Feed this result into the outter hash */
+ ops->hash_init(context);
+ ops->hash_update(context, (unsigned char *) K, ops->block_size);
+ ops->hash_update(context, (unsigned char *) digest, ops->digest_size);
+ ops->hash_final((unsigned char *) digest, context);
+
+ /* Zero the key */
+ memset(K, 0, ops->block_size);
+ efree(K);
+ efree(context);
+
+ if (raw_output) {
+ digest[ops->digest_size] = 0;
+ RETURN_STRINGL(digest, ops->digest_size, 0);
+ } else {
+ char *hex_digest = safe_emalloc(ops->digest_size, 2, 1);
+
+ php_hash_bin2hex(hex_digest, (unsigned char *) digest, ops->digest_size);
+ hex_digest[2 * ops->digest_size] = 0;
+ efree(digest);
+ RETURN_STRINGL(hex_digest, 2 * ops->digest_size, 0);
+ }
+}
+/* }}} */
+
+/* {{{ proto string hash_hmac(string algo, string data, string key[, bool raw_output = false])
+Generate a hash of a given input string with a key using HMAC
+Returns lowercase hexits by default */
+PHP_FUNCTION(hash_hmac)
+{
+ php_hash_do_hash_hmac(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 0);
+}
+/* }}} */
+
+/* {{{ proto string hash_hmac_file(string algo, string filename, string key[, bool raw_output = false])
+Generate a hash of a given file with a key using HMAC
+Returns lowercase hexits by default */
+PHP_FUNCTION(hash_hmac_file)
+{
+ php_hash_do_hash_hmac(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1, 0);
+}
+/* }}} */
+
+
+/* {{{ proto resource hash_init(string algo[, int options, string key])
+Initialize a hashing context */
+PHP_FUNCTION(hash_init)
+{
+ char *algo, *key = NULL;
+ int algo_len, key_len = 0, argc = ZEND_NUM_ARGS();
+ long options = 0;
+ void *context;
+ const php_hash_ops *ops;
+ php_hash_data *hash;
+
+ if (zend_parse_parameters(argc TSRMLS_CC, "s|ls", &algo, &algo_len, &options, &key, &key_len) == FAILURE) {
+ return;
+ }
+
+ ops = php_hash_fetch_ops(algo, algo_len);
+ if (!ops) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown hashing algorithm: %s", algo);
+ RETURN_FALSE;
+ }
+
+ if (options & PHP_HASH_HMAC &&
+ key_len <= 0) {
+ /* Note: a zero length key is no key at all */
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "HMAC requested without a key");
+ RETURN_FALSE;
+ }
+
+ context = emalloc(ops->context_size);
+ ops->hash_init(context);
+
+ hash = emalloc(sizeof(php_hash_data));
+ hash->ops = ops;
+ hash->context = context;
+ hash->options = options;
+ hash->key = NULL;
+
+ if (options & PHP_HASH_HMAC) {
+ char *K = emalloc(ops->block_size);
+ int i;
+
+ memset(K, 0, ops->block_size);
+
+ if (key_len > ops->block_size) {
+ /* Reduce the key first */
+ ops->hash_update(context, (unsigned char *) key, key_len);
+ ops->hash_final((unsigned char *) K, context);
+ /* Make the context ready to start over */
+ ops->hash_init(context);
+ } else {
+ memcpy(K, key, key_len);
+ }
+
+ /* XOR ipad */
+ for(i=0; i < ops->block_size; i++) {
+ K[i] ^= 0x36;
+ }
+ ops->hash_update(context, (unsigned char *) K, ops->block_size);
+ hash->key = (unsigned char *) K;
+ }
+
+ ZEND_REGISTER_RESOURCE(return_value, hash, php_hash_le_hash);
+}
+/* }}} */
+
+/* {{{ proto bool hash_update(resource context, string data)
+Pump data into the hashing algorithm */
+PHP_FUNCTION(hash_update)
+{
+ zval *zhash;
+ php_hash_data *hash;
+ char *data;
+ int data_len;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &zhash, &data, &data_len) == FAILURE) {
+ return;
+ }
+
+ ZEND_FETCH_RESOURCE(hash, php_hash_data*, &zhash, -1, PHP_HASH_RESNAME, php_hash_le_hash);
+
+ hash->ops->hash_update(hash->context, (unsigned char *) data, data_len);
+
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto int hash_update_stream(resource context, resource handle[, integer length])
+Pump data into the hashing algorithm from an open stream */
+PHP_FUNCTION(hash_update_stream)
+{
+ zval *zhash, *zstream;
+ php_hash_data *hash;
+ php_stream *stream = NULL;
+ long length = -1, didread = 0;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr|l", &zhash, &zstream, &length) == FAILURE) {
+ return;
+ }
+
+ ZEND_FETCH_RESOURCE(hash, php_hash_data*, &zhash, -1, PHP_HASH_RESNAME, php_hash_le_hash);
+ php_stream_from_zval(stream, &zstream);
+
+ while (length) {
+ char buf[1024];
+ long n, toread = 1024;
+
+ if (length > 0 && toread > length) {
+ toread = length;
+ }
+
+ if ((n = php_stream_read(stream, buf, toread)) <= 0) {
+ /* Nada mas */
+ RETURN_LONG(didread);
+ }
+ hash->ops->hash_update(hash->context, (unsigned char *) buf, n);
+ length -= n;
+ didread += n;
+ }
+
+ RETURN_LONG(didread);
+}
+/* }}} */
+
+/* {{{ proto bool hash_update_file(resource context, string filename[, resource context])
+Pump data into the hashing algorithm from a file */
+PHP_FUNCTION(hash_update_file)
+{
+ zval *zhash, *zcontext = NULL;
+ php_hash_data *hash;
+ php_stream_context *context;
+ php_stream *stream;
+ char *filename, buf[1024];
+ int filename_len, n;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|r", &zhash, &filename, &filename_len, &zcontext) == FAILURE) {
+ return;
+ }
+
+ ZEND_FETCH_RESOURCE(hash, php_hash_data*, &zhash, -1, PHP_HASH_RESNAME, php_hash_le_hash);
+ context = php_stream_context_from_zval(zcontext, 0);
+
+ stream = php_stream_open_wrapper_ex(filename, "rb", REPORT_ERRORS, NULL, context);
+ if (!stream) {
+ /* Stream will report errors opening file */
+ RETURN_FALSE;
+ }
+
+ while ((n = php_stream_read(stream, buf, sizeof(buf))) > 0) {
+ hash->ops->hash_update(hash->context, (unsigned char *) buf, n);
+ }
+ php_stream_close(stream);
+
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto string hash_final(resource context[, bool raw_output=false])
+Output resulting digest */
+PHP_FUNCTION(hash_final)
+{
+ zval *zhash;
+ php_hash_data *hash;
+ zend_bool raw_output = 0;
+ zend_rsrc_list_entry *le;
+ char *digest;
+ int digest_len;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|b", &zhash, &raw_output) == FAILURE) {
+ return;
+ }
+
+ ZEND_FETCH_RESOURCE(hash, php_hash_data*, &zhash, -1, PHP_HASH_RESNAME, php_hash_le_hash);
+
+ digest_len = hash->ops->digest_size;
+ digest = emalloc(digest_len + 1);
+ hash->ops->hash_final((unsigned char *) digest, hash->context);
+ if (hash->options & PHP_HASH_HMAC) {
+ int i;
+
+ /* Convert K to opad -- 0x6A = 0x36 ^ 0x5C */
+ for(i=0; i < hash->ops->block_size; i++) {
+ hash->key[i] ^= 0x6A;
+ }
+
+ /* Feed this result into the outter hash */
+ hash->ops->hash_init(hash->context);
+ hash->ops->hash_update(hash->context, (unsigned char *) hash->key, hash->ops->block_size);
+ hash->ops->hash_update(hash->context, (unsigned char *) digest, hash->ops->digest_size);
+ hash->ops->hash_final((unsigned char *) digest, hash->context);
+
+ /* Zero the key */
+ memset(hash->key, 0, hash->ops->block_size);
+ efree(hash->key);
+ hash->key = NULL;
+ }
+ digest[digest_len] = 0;
+ efree(hash->context);
+ hash->context = NULL;
+
+ /* zend_list_REAL_delete() */
+ if (zend_hash_index_find(&EG(regular_list), Z_RESVAL_P(zhash), (void *) &le)==SUCCESS) {
+ /* This is a hack to avoid letting the resource hide elsewhere (like in separated vars)
+ FETCH_RESOURCE is intelligent enough to handle dealing with any issues this causes */
+ le->refcount = 1;
+ } /* FAILURE is not an option */
+ zend_list_delete(Z_RESVAL_P(zhash));
+
+ if (raw_output) {
+ RETURN_STRINGL(digest, digest_len, 0);
+ } else {
+ char *hex_digest = safe_emalloc(digest_len,2,1);
+
+ php_hash_bin2hex(hex_digest, (unsigned char *) digest, digest_len);
+ hex_digest[2 * digest_len] = 0;
+ efree(digest);
+ RETURN_STRINGL(hex_digest, 2 * digest_len, 0);
+ }
+}
+/* }}} */
+
+/* {{{ proto resource hash_copy(resource context)
+Copy hash resource */
+PHP_FUNCTION(hash_copy)
+{
+ zval *zhash;
+ php_hash_data *hash, *copy_hash;
+ void *context;
+ int res;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zhash) == FAILURE) {
+ return;
+ }
+
+ ZEND_FETCH_RESOURCE(hash, php_hash_data*, &zhash, -1, PHP_HASH_RESNAME, php_hash_le_hash);
+
+
+ context = emalloc(hash->ops->context_size);
+ hash->ops->hash_init(context);
+
+ res = hash->ops->hash_copy(hash->ops, hash->context, context);
+ if (res != SUCCESS) {
+ efree(context);
+ RETURN_FALSE;
+ }
+
+ copy_hash = emalloc(sizeof(php_hash_data));
+ copy_hash->ops = hash->ops;
+ copy_hash->context = context;
+ copy_hash->options = hash->options;
+ copy_hash->key = ecalloc(1, hash->ops->block_size);
+ if (hash->key) {
+ memcpy(copy_hash->key, hash->key, hash->ops->block_size);
+ }
+ ZEND_REGISTER_RESOURCE(return_value, copy_hash, php_hash_le_hash);
+}
+/* }}} */
+
+/* {{{ proto array hash_algos(void)
+Return a list of registered hashing algorithms */
+PHP_FUNCTION(hash_algos)
+{
+ HashPosition pos;
+ char *str;
+ uint str_len;
+ long type;
+ ulong idx;
+
+ array_init(return_value);
+ for(zend_hash_internal_pointer_reset_ex(&php_hash_hashtable, &pos);
+ (type = zend_hash_get_current_key_ex(&php_hash_hashtable, &str, &str_len, &idx, 0, &pos)) != HASH_KEY_NON_EXISTANT;
+ zend_hash_move_forward_ex(&php_hash_hashtable, &pos)) {
+ add_next_index_stringl(return_value, str, str_len-1, 1);
+ }
+}
+/* }}} */
+
+/* Module Housekeeping */
+
+static void php_hash_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ */
+{
+ php_hash_data *hash = (php_hash_data*)rsrc->ptr;
+
+ /* Just in case the algo has internally allocated resources */
+ if (hash->context) {
+ unsigned char *dummy = emalloc(hash->ops->digest_size);
+ hash->ops->hash_final(dummy, hash->context);
+ efree(dummy);
+ efree(hash->context);
+ }
+
+ if (hash->key) {
+ memset(hash->key, 0, hash->ops->block_size);
+ efree(hash->key);
+ }
+ efree(hash);
+}
+/* }}} */
+
+#define PHP_HASH_HAVAL_REGISTER(p,b) php_hash_register_algo("haval" #b "," #p , &php_hash_##p##haval##b##_ops);
+
+#ifdef PHP_MHASH_BC
+
+PHP_MINFO_FUNCTION(mhash)
+{
+ php_info_print_table_start();
+ php_info_print_table_row(2, "MHASH support", "Enabled");
+ php_info_print_table_row(2, "MHASH API Version", "Emulated Support");
+ php_info_print_table_end();
+}
+
+zend_module_entry mhash_module_entry = {
+ STANDARD_MODULE_HEADER,
+ "mhash",
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ PHP_MINFO(mhash),
+ NO_VERSION_YET,
+ STANDARD_MODULE_PROPERTIES,
+};
+
+static void mhash_init(INIT_FUNC_ARGS)
+{
+ char buf[128];
+ int len;
+ int algo_number = 0;
+
+ for (algo_number = 0; algo_number < MHASH_NUM_ALGOS; algo_number++) {
+ struct mhash_bc_entry algorithm = mhash_to_hash[algo_number];
+ if (algorithm.mhash_name == NULL) {
+ continue;
+ }
+
+ len = slprintf(buf, 127, "MHASH_%s", algorithm.mhash_name, strlen(algorithm.mhash_name));
+ zend_register_long_constant(buf, len + 1, algorithm.value, CONST_CS | CONST_PERSISTENT, module_number TSRMLS_CC);
+ }
+ zend_register_internal_module(&mhash_module_entry TSRMLS_CC);
+}
+
+/* {{{ proto string mhash(int hash, string data [, string key])
+ Hash data with hash */
+PHP_FUNCTION(mhash)
+{
+ zval **z_algorithm;
+ long algorithm;
+
+ if (zend_parse_parameters(1 TSRMLS_CC, "Z", &z_algorithm) == FAILURE) {
+ return;
+ }
+
+ SEPARATE_ZVAL(z_algorithm);
+ convert_to_long_ex(z_algorithm);
+ algorithm = Z_LVAL_PP(z_algorithm);
+
+ /* need to convert the first parameter from int constant to string algorithm name */
+ if (algorithm >= 0 && algorithm < MHASH_NUM_ALGOS) {
+ struct mhash_bc_entry algorithm_lookup = mhash_to_hash[algorithm];
+ if (algorithm_lookup.hash_name) {
+ ZVAL_STRING(*z_algorithm, algorithm_lookup.hash_name, 1);
+ }
+ }
+
+ if (ZEND_NUM_ARGS() == 3) {
+ php_hash_do_hash_hmac(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 1);
+ } else if (ZEND_NUM_ARGS() == 2) {
+ php_hash_do_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 1);
+ } else {
+ WRONG_PARAM_COUNT;
+ }
+}
+/* }}} */
+
+/* {{{ proto string mhash_get_hash_name(int hash)
+ Gets the name of hash */
+PHP_FUNCTION(mhash_get_hash_name)
+{
+ long algorithm;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &algorithm) == FAILURE) {
+ return;
+ }
+
+ if (algorithm >= 0 && algorithm < MHASH_NUM_ALGOS) {
+ struct mhash_bc_entry algorithm_lookup = mhash_to_hash[algorithm];
+ if (algorithm_lookup.mhash_name) {
+ RETURN_STRING(algorithm_lookup.mhash_name, 1);
+ }
+ }
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto int mhash_count(void)
+ Gets the number of available hashes */
+PHP_FUNCTION(mhash_count)
+{
+ if (zend_parse_parameters_none() == FAILURE) {
+ return;
+ }
+ RETURN_LONG(MHASH_NUM_ALGOS - 1);
+}
+/* }}} */
+
+/* {{{ proto int mhash_get_block_size(int hash)
+ Gets the block size of hash */
+PHP_FUNCTION(mhash_get_block_size)
+{
+ long algorithm;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &algorithm) == FAILURE) {
+ return;
+ }
+ RETVAL_FALSE;
+
+ if (algorithm >= 0 && algorithm < MHASH_NUM_ALGOS) {
+ struct mhash_bc_entry algorithm_lookup = mhash_to_hash[algorithm];
+ if (algorithm_lookup.mhash_name) {
+ const php_hash_ops *ops = php_hash_fetch_ops(algorithm_lookup.hash_name, strlen(algorithm_lookup.hash_name));
+ if (ops) {
+ RETVAL_LONG(ops->digest_size);
+ }
+ }
+ }
+}
+/* }}} */
+
+#define SALT_SIZE 8
+
+/* {{{ proto string mhash_keygen_s2k(int hash, string input_password, string salt, int bytes)
+ Generates a key using hash functions */
+PHP_FUNCTION(mhash_keygen_s2k)
+{
+ long algorithm, l_bytes;
+ int bytes;
+ char *password, *salt;
+ int password_len, salt_len;
+ char padded_salt[SALT_SIZE];
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lssl", &algorithm, &password, &password_len, &salt, &salt_len, &l_bytes) == FAILURE) {
+ return;
+ }
+
+ bytes = (int)l_bytes;
+ if (bytes <= 0){
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "the byte parameter must be greater than 0");
+ RETURN_FALSE;
+ }
+
+ salt_len = MIN(salt_len, SALT_SIZE);
+
+ memcpy(padded_salt, salt, salt_len);
+ if (salt_len < SALT_SIZE) {
+ memset(padded_salt + salt_len, 0, SALT_SIZE - salt_len);
+ }
+ salt_len = SALT_SIZE;
+
+ RETVAL_FALSE;
+ if (algorithm >= 0 && algorithm < MHASH_NUM_ALGOS) {
+ struct mhash_bc_entry algorithm_lookup = mhash_to_hash[algorithm];
+ if (algorithm_lookup.mhash_name) {
+ const php_hash_ops *ops = php_hash_fetch_ops(algorithm_lookup.hash_name, strlen(algorithm_lookup.hash_name));
+ if (ops) {
+ unsigned char null = '\0';
+ void *context;
+ char *key, *digest;
+ int i = 0, j = 0;
+ int block_size = ops->digest_size;
+ int times = bytes / block_size;
+ if (bytes % block_size != 0) times++;
+
+ context = emalloc(ops->context_size);
+ ops->hash_init(context);
+
+ key = ecalloc(1, times * block_size);
+ digest = emalloc(ops->digest_size + 1);
+
+ for (i = 0; i < times; i++) {
+ ops->hash_init(context);
+
+ for (j=0;j<i;j++) {
+ ops->hash_update(context, &null, 1);
+ }
+ ops->hash_update(context, (unsigned char *)padded_salt, salt_len);
+ ops->hash_update(context, (unsigned char *)password, password_len);
+ ops->hash_final((unsigned char *)digest, context);
+ memcpy( &key[i*block_size], digest, block_size);
+ }
+
+ RETVAL_STRINGL(key, bytes, 1);
+ memset(key, 0, bytes);
+ efree(digest);
+ efree(context);
+ efree(key);
+ }
+ }
+ }
+}
+/* }}} */
+
+#endif
+
+/* {{{ PHP_MINIT_FUNCTION
+ */
+PHP_MINIT_FUNCTION(hash)
+{
+ php_hash_le_hash = zend_register_list_destructors_ex(php_hash_dtor, NULL, PHP_HASH_RESNAME, module_number);
+
+ zend_hash_init(&php_hash_hashtable, 35, NULL, NULL, 1);
+
+ php_hash_register_algo("md2", &php_hash_md2_ops);
+ php_hash_register_algo("md4", &php_hash_md4_ops);
+ php_hash_register_algo("md5", &php_hash_md5_ops);
+ php_hash_register_algo("sha1", &php_hash_sha1_ops);
+ php_hash_register_algo("sha224", &php_hash_sha224_ops);
+ php_hash_register_algo("sha256", &php_hash_sha256_ops);
+ php_hash_register_algo("sha384", &php_hash_sha384_ops);
+ php_hash_register_algo("sha512", &php_hash_sha512_ops);
+ php_hash_register_algo("ripemd128", &php_hash_ripemd128_ops);
+ php_hash_register_algo("ripemd160", &php_hash_ripemd160_ops);
+ php_hash_register_algo("ripemd256", &php_hash_ripemd256_ops);
+ php_hash_register_algo("ripemd320", &php_hash_ripemd320_ops);
+ php_hash_register_algo("whirlpool", &php_hash_whirlpool_ops);
+ php_hash_register_algo("tiger128,3", &php_hash_3tiger128_ops);
+ php_hash_register_algo("tiger160,3", &php_hash_3tiger160_ops);
+ php_hash_register_algo("tiger192,3", &php_hash_3tiger192_ops);
+ php_hash_register_algo("tiger128,4", &php_hash_4tiger128_ops);
+ php_hash_register_algo("tiger160,4", &php_hash_4tiger160_ops);
+ php_hash_register_algo("tiger192,4", &php_hash_4tiger192_ops);
+ php_hash_register_algo("snefru", &php_hash_snefru_ops);
+ php_hash_register_algo("snefru256", &php_hash_snefru_ops);
+ php_hash_register_algo("gost", &php_hash_gost_ops);
+ php_hash_register_algo("adler32", &php_hash_adler32_ops);
+ php_hash_register_algo("crc32", &php_hash_crc32_ops);
+ php_hash_register_algo("crc32b", &php_hash_crc32b_ops);
+ php_hash_register_algo("fnv132", &php_hash_fnv132_ops);
+ php_hash_register_algo("fnv164", &php_hash_fnv164_ops);
+ php_hash_register_algo("joaat", &php_hash_joaat_ops);
+
+ PHP_HASH_HAVAL_REGISTER(3,128);
+ PHP_HASH_HAVAL_REGISTER(3,160);
+ PHP_HASH_HAVAL_REGISTER(3,192);
+ PHP_HASH_HAVAL_REGISTER(3,224);
+ PHP_HASH_HAVAL_REGISTER(3,256);
+
+ PHP_HASH_HAVAL_REGISTER(4,128);
+ PHP_HASH_HAVAL_REGISTER(4,160);
+ PHP_HASH_HAVAL_REGISTER(4,192);
+ PHP_HASH_HAVAL_REGISTER(4,224);
+ PHP_HASH_HAVAL_REGISTER(4,256);
+
+ PHP_HASH_HAVAL_REGISTER(5,128);
+ PHP_HASH_HAVAL_REGISTER(5,160);
+ PHP_HASH_HAVAL_REGISTER(5,192);
+ PHP_HASH_HAVAL_REGISTER(5,224);
+ PHP_HASH_HAVAL_REGISTER(5,256);
+
+ REGISTER_LONG_CONSTANT("HASH_HMAC", PHP_HASH_HMAC, CONST_CS | CONST_PERSISTENT);
+
+#ifdef PHP_MHASH_BC
+ mhash_init(INIT_FUNC_ARGS_PASSTHRU);
+#endif
+
+ return SUCCESS;
+}
+/* }}} */
+
+/* {{{ PHP_MSHUTDOWN_FUNCTION
+ */
+PHP_MSHUTDOWN_FUNCTION(hash)
+{
+ zend_hash_destroy(&php_hash_hashtable);
+
+ return SUCCESS;
+}
+/* }}} */
+
+/* {{{ PHP_MINFO_FUNCTION
+ */
+PHP_MINFO_FUNCTION(hash)
+{
+ HashPosition pos;
+ char buffer[2048];
+ char *s = buffer, *e = s + sizeof(buffer), *str;
+ ulong idx;
+ long type;
+
+ for(zend_hash_internal_pointer_reset_ex(&php_hash_hashtable, &pos);
+ (type = zend_hash_get_current_key_ex(&php_hash_hashtable, &str, NULL, &idx, 0, &pos)) != HASH_KEY_NON_EXISTANT;
+ zend_hash_move_forward_ex(&php_hash_hashtable, &pos)) {
+ s += slprintf(s, e - s, "%s ", str);
+ }
+ *s = 0;
+
+ php_info_print_table_start();
+ php_info_print_table_row(2, "hash support", "enabled");
+ php_info_print_table_row(2, "Hashing Engines", buffer);
+ php_info_print_table_end();
+}
+/* }}} */
+
+/* {{{ arginfo */
+#ifdef PHP_HASH_MD5_NOT_IN_CORE
+ZEND_BEGIN_ARG_INFO_EX(arginfo_hash_md5, 0, 0, 1)
+ ZEND_ARG_INFO(0, str)
+ ZEND_ARG_INFO(0, raw_output)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_hash_md5_file, 0, 0, 1)
+ ZEND_ARG_INFO(0, filename)
+ ZEND_ARG_INFO(0, raw_output)
+ZEND_END_ARG_INFO()
+#endif
+
+#ifdef PHP_HASH_SHA1_NOT_IN_CORE
+ZEND_BEGIN_ARG_INFO_EX(arginfo_hash_sha1, 0, 0, 1)
+ ZEND_ARG_INFO(0, str)
+ ZEND_ARG_INFO(0, raw_output)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_hash_sha1_file, 0, 0, 1)
+ ZEND_ARG_INFO(0, filename)
+ ZEND_ARG_INFO(0, raw_output)
+ZEND_END_ARG_INFO()
+#endif
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_hash, 0, 0, 2)
+ ZEND_ARG_INFO(0, algo)
+ ZEND_ARG_INFO(0, data)
+ ZEND_ARG_INFO(0, raw_output)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_hash_file, 0, 0, 2)
+ ZEND_ARG_INFO(0, algo)
+ ZEND_ARG_INFO(0, filename)
+ ZEND_ARG_INFO(0, raw_output)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_hash_hmac, 0, 0, 3)
+ ZEND_ARG_INFO(0, algo)
+ ZEND_ARG_INFO(0, data)
+ ZEND_ARG_INFO(0, key)
+ ZEND_ARG_INFO(0, raw_output)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_hash_hmac_file, 0, 0, 3)
+ ZEND_ARG_INFO(0, algo)
+ ZEND_ARG_INFO(0, filename)
+ ZEND_ARG_INFO(0, key)
+ ZEND_ARG_INFO(0, raw_output)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_hash_init, 0, 0, 1)
+ ZEND_ARG_INFO(0, algo)
+ ZEND_ARG_INFO(0, options)
+ ZEND_ARG_INFO(0, key)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO(arginfo_hash_update, 0)
+ ZEND_ARG_INFO(0, context)
+ ZEND_ARG_INFO(0, data)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_hash_update_stream, 0, 0, 2)
+ ZEND_ARG_INFO(0, context)
+ ZEND_ARG_INFO(0, handle)
+ ZEND_ARG_INFO(0, length)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_hash_update_file, 0, 0, 2)
+ ZEND_ARG_INFO(0, context)
+ ZEND_ARG_INFO(0, filename)
+ ZEND_ARG_INFO(0, context)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_hash_final, 0, 0, 1)
+ ZEND_ARG_INFO(0, context)
+ ZEND_ARG_INFO(0, raw_output)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO(arginfo_hash_copy, 0)
+ ZEND_ARG_INFO(0, context)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO(arginfo_hash_algos, 0)
+ZEND_END_ARG_INFO()
+
+/* BC Land */
+#ifdef PHP_MHASH_BC
+ZEND_BEGIN_ARG_INFO(arginfo_mhash_get_block_size, 0)
+ ZEND_ARG_INFO(0, hash)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO(arginfo_mhash_get_hash_name, 0)
+ ZEND_ARG_INFO(0, hash)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO(arginfo_mhash_keygen_s2k, 0)
+ ZEND_ARG_INFO(0, hash)
+ ZEND_ARG_INFO(0, input_password)
+ ZEND_ARG_INFO(0, salt)
+ ZEND_ARG_INFO(0, bytes)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO(arginfo_mhash_count, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_mhash, 0, 0, 2)
+ ZEND_ARG_INFO(0, hash)
+ ZEND_ARG_INFO(0, data)
+ ZEND_ARG_INFO(0, key)
+ZEND_END_ARG_INFO()
+#endif
+
+/* }}} */
+
+/* {{{ hash_functions[]
+ */
+const zend_function_entry hash_functions[] = {
+ PHP_FE(hash, arginfo_hash)
+ PHP_FE(hash_file, arginfo_hash_file)
+
+ PHP_FE(hash_hmac, arginfo_hash_hmac)
+ PHP_FE(hash_hmac_file, arginfo_hash_hmac_file)
+
+ PHP_FE(hash_init, arginfo_hash_init)
+ PHP_FE(hash_update, arginfo_hash_update)
+ PHP_FE(hash_update_stream, arginfo_hash_update_stream)
+ PHP_FE(hash_update_file, arginfo_hash_update_file)
+ PHP_FE(hash_final, arginfo_hash_final)
+ PHP_FE(hash_copy, arginfo_hash_copy)
+
+ PHP_FE(hash_algos, arginfo_hash_algos)
+
+ /* BC Land */
+#ifdef PHP_HASH_MD5_NOT_IN_CORE
+ PHP_NAMED_FE(md5, php_if_md5, arginfo_hash_md5)
+ PHP_NAMED_FE(md5_file, php_if_md5_file, arginfo_hash_md5_file)
+#endif /* PHP_HASH_MD5_NOT_IN_CORE */
+
+#ifdef PHP_HASH_SHA1_NOT_IN_CORE
+ PHP_NAMED_FE(sha1, php_if_sha1, arginfo_hash_sha1)
+ PHP_NAMED_FE(sha1_file, php_if_sha1_file, arginfo_hash_sha1_file)
+#endif /* PHP_HASH_SHA1_NOT_IN_CORE */
+
+#ifdef PHP_MHASH_BC
+ PHP_FE(mhash_keygen_s2k, arginfo_mhash_keygen_s2k)
+ PHP_FE(mhash_get_block_size, arginfo_mhash_get_block_size)
+ PHP_FE(mhash_get_hash_name, arginfo_mhash_get_hash_name)
+ PHP_FE(mhash_count, arginfo_mhash_count)
+ PHP_FE(mhash, arginfo_mhash)
+#endif
+
+ PHP_FE_END
+};
+/* }}} */
+
+/* {{{ hash_module_entry
+ */
+zend_module_entry hash_module_entry = {
+#if ZEND_MODULE_API_NO >= 20010901
+ STANDARD_MODULE_HEADER,
+#endif
+ PHP_HASH_EXTNAME,
+ hash_functions,
+ PHP_MINIT(hash),
+ PHP_MSHUTDOWN(hash),
+ NULL, /* RINIT */
+ NULL, /* RSHUTDOWN */
+ PHP_MINFO(hash),
+#if ZEND_MODULE_API_NO >= 20010901
+ PHP_HASH_EXTVER, /* Replace with version number for your extension */
+#endif
+ STANDARD_MODULE_PROPERTIES
+};
+/* }}} */
+
+#ifdef COMPILE_DL_HASH
+ZEND_GET_MODULE(hash)
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/hash/hash_adler32.c b/ext/hash/hash_adler32.c
new file mode 100644
index 0000000..4575c00
--- /dev/null
+++ b/ext/hash/hash_adler32.c
@@ -0,0 +1,82 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Michael Wallner <mike@php.net> |
+ | Sara Golemon <pollita@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#include "php_hash.h"
+#include "php_hash_adler32.h"
+
+PHP_HASH_API void PHP_ADLER32Init(PHP_ADLER32_CTX *context)
+{
+ context->state = 1;
+}
+
+PHP_HASH_API void PHP_ADLER32Update(PHP_ADLER32_CTX *context, const unsigned char *input, size_t len)
+{
+ php_hash_uint32 i, s[2];
+
+ s[0] = context->state & 0xffff;
+ s[1] = (context->state >> 16) & 0xffff;
+ for (i = 0; i < len; ++i) {
+ s[0] += input[i];
+ s[1] += s[0];
+ if (s[1]>=0x7fffffff)
+ {
+ s[0] = s[0] % 65521;
+ s[1] = s[1] % 65521;
+ }
+ }
+ s[0] = s[0] % 65521;
+ s[1] = s[1] % 65521;
+ context->state = s[0] + (s[1] << 16);
+}
+
+PHP_HASH_API void PHP_ADLER32Final(unsigned char digest[4], PHP_ADLER32_CTX *context)
+{
+ digest[0] = (unsigned char) ((context->state >> 24) & 0xff);
+ digest[1] = (unsigned char) ((context->state >> 16) & 0xff);
+ digest[2] = (unsigned char) ((context->state >> 8) & 0xff);
+ digest[3] = (unsigned char) (context->state & 0xff);
+ context->state = 0;
+}
+
+PHP_HASH_API int PHP_ADLER32Copy(const php_hash_ops *ops, PHP_ADLER32_CTX *orig_context, PHP_ADLER32_CTX *copy_context)
+{
+ copy_context->state = orig_context->state;
+ return SUCCESS;
+}
+
+const php_hash_ops php_hash_adler32_ops = {
+ (php_hash_init_func_t) PHP_ADLER32Init,
+ (php_hash_update_func_t) PHP_ADLER32Update,
+ (php_hash_final_func_t) PHP_ADLER32Final,
+ (php_hash_copy_func_t) PHP_ADLER32Copy,
+ 4, /* what to say here? */
+ 4,
+ sizeof(PHP_ADLER32_CTX)
+};
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/hash_crc32.c b/ext/hash/hash_crc32.c
new file mode 100644
index 0000000..9be5b4b
--- /dev/null
+++ b/ext/hash/hash_crc32.c
@@ -0,0 +1,102 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Michael Wallner <mike@php.net> |
+ | Sara Golemon <pollita@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#include "php_hash.h"
+#include "php_hash_crc32.h"
+#include "php_hash_crc32_tables.h"
+
+PHP_HASH_API void PHP_CRC32Init(PHP_CRC32_CTX *context)
+{
+ context->state = ~0;
+}
+
+PHP_HASH_API void PHP_CRC32Update(PHP_CRC32_CTX *context, const unsigned char *input, size_t len)
+{
+ size_t i;
+
+ for (i = 0; i < len; ++i) {
+ context->state = (context->state << 8) ^ crc32_table[(context->state >> 24) ^ (input[i] & 0xff)];
+ }
+}
+
+PHP_HASH_API void PHP_CRC32BUpdate(PHP_CRC32_CTX *context, const unsigned char *input, size_t len)
+{
+ size_t i;
+
+ for (i = 0; i < len; ++i) {
+ context->state = (context->state >> 8) ^ crc32b_table[(context->state ^ input[i]) & 0xff];
+ }
+}
+
+PHP_HASH_API void PHP_CRC32Final(unsigned char digest[4], PHP_CRC32_CTX *context)
+{
+ context->state=~context->state;
+ digest[3] = (unsigned char) ((context->state >> 24) & 0xff);
+ digest[2] = (unsigned char) ((context->state >> 16) & 0xff);
+ digest[1] = (unsigned char) ((context->state >> 8) & 0xff);
+ digest[0] = (unsigned char) (context->state & 0xff);
+ context->state = 0;
+}
+
+PHP_HASH_API void PHP_CRC32BFinal(unsigned char digest[4], PHP_CRC32_CTX *context)
+{
+ context->state=~context->state;
+ digest[0] = (unsigned char) ((context->state >> 24) & 0xff);
+ digest[1] = (unsigned char) ((context->state >> 16) & 0xff);
+ digest[2] = (unsigned char) ((context->state >> 8) & 0xff);
+ digest[3] = (unsigned char) (context->state & 0xff);
+ context->state = 0;
+}
+
+PHP_HASH_API int PHP_CRC32Copy(const php_hash_ops *ops, PHP_CRC32_CTX *orig_context, PHP_CRC32_CTX *copy_context)
+{
+ copy_context->state = orig_context->state;
+ return SUCCESS;
+}
+
+const php_hash_ops php_hash_crc32_ops = {
+ (php_hash_init_func_t) PHP_CRC32Init,
+ (php_hash_update_func_t) PHP_CRC32Update,
+ (php_hash_final_func_t) PHP_CRC32Final,
+ (php_hash_copy_func_t) PHP_CRC32Copy,
+ 4, /* what to say here? */
+ 4,
+ sizeof(PHP_CRC32_CTX)
+};
+
+const php_hash_ops php_hash_crc32b_ops = {
+ (php_hash_init_func_t) PHP_CRC32Init,
+ (php_hash_update_func_t) PHP_CRC32BUpdate,
+ (php_hash_final_func_t) PHP_CRC32BFinal,
+ (php_hash_copy_func_t) PHP_CRC32Copy,
+ 4, /* what to say here? */
+ 4,
+ sizeof(PHP_CRC32_CTX)
+};
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/hash_fnv.c b/ext/hash/hash_fnv.c
new file mode 100644
index 0000000..f96946d
--- /dev/null
+++ b/ext/hash/hash_fnv.c
@@ -0,0 +1,229 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Michael Maclean <mgdm@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+/* Based on the public domain algorithm found at
+ http://www.isthe.com/chongo/tech/comp/fnv/index.html */
+
+#include "php_hash.h"
+#include "php_hash_fnv.h"
+
+const php_hash_ops php_hash_fnv132_ops = {
+ (php_hash_init_func_t) PHP_FNV132Init,
+ (php_hash_update_func_t) PHP_FNV132Update,
+ (php_hash_final_func_t) PHP_FNV132Final,
+ (php_hash_copy_func_t) php_hash_copy,
+ 4,
+ 4,
+ sizeof(PHP_FNV132_CTX)
+};
+
+ const php_hash_ops php_hash_fnv1a32_ops = {
+ (php_hash_init_func_t) PHP_FNV132Init,
+ (php_hash_update_func_t) PHP_FNV1a32Update,
+ (php_hash_final_func_t) PHP_FNV132Final,
+ (php_hash_copy_func_t) php_hash_copy,
+ 4,
+ 4,
+ sizeof(PHP_FNV132_CTX)
+};
+
+const php_hash_ops php_hash_fnv164_ops = {
+ (php_hash_init_func_t) PHP_FNV164Init,
+ (php_hash_update_func_t) PHP_FNV164Update,
+ (php_hash_final_func_t) PHP_FNV164Final,
+ (php_hash_copy_func_t) php_hash_copy,
+ 8,
+ 4,
+ sizeof(PHP_FNV164_CTX)
+};
+
+const php_hash_ops php_hash_fnv1a64_ops = {
+ (php_hash_init_func_t) PHP_FNV164Init,
+ (php_hash_update_func_t) PHP_FNV1a64Update,
+ (php_hash_final_func_t) PHP_FNV164Final,
+ (php_hash_copy_func_t) php_hash_copy,
+ 8,
+ 4,
+ sizeof(PHP_FNV164_CTX)
+};
+
+/* {{{ PHP_FNV132Init
+ * 32-bit FNV-1 hash initialisation
+ */
+PHP_HASH_API void PHP_FNV132Init(PHP_FNV132_CTX *context)
+{
+ context->state = PHP_FNV1_32_INIT;
+}
+/* }}} */
+
+PHP_HASH_API void PHP_FNV132Update(PHP_FNV132_CTX *context, const unsigned char *input,
+ unsigned int inputLen)
+{
+ context->state = fnv_32_buf((void *)input, inputLen, context->state, 0);
+}
+
+PHP_HASH_API void PHP_FNV1a32Update(PHP_FNV132_CTX *context, const unsigned char *input,
+ unsigned int inputLen)
+{
+ context->state = fnv_32_buf((void *)input, inputLen, context->state, 1);
+}
+
+PHP_HASH_API void PHP_FNV132Final(unsigned char digest[4], PHP_FNV132_CTX * context)
+{
+#ifdef WORDS_BIGENDIAN
+ memcpy(digest, &context->state, 4);
+#else
+ int i = 0;
+ unsigned char *c = (unsigned char *) &context->state;
+
+ for (i = 0; i < 4; i++) {
+ digest[i] = c[3 - i];
+ }
+#endif
+}
+
+/* {{{ PHP_FNV164Init
+ * 64-bit FNV-1 hash initialisation
+ */
+PHP_HASH_API void PHP_FNV164Init(PHP_FNV164_CTX *context)
+{
+ context->state = PHP_FNV1_64_INIT;
+}
+/* }}} */
+
+PHP_HASH_API void PHP_FNV164Update(PHP_FNV164_CTX *context, const unsigned char *input,
+ unsigned int inputLen)
+{
+ context->state = fnv_64_buf((void *)input, inputLen, context->state, 0);
+}
+
+PHP_HASH_API void PHP_FNV1a64Update(PHP_FNV164_CTX *context, const unsigned char *input,
+ unsigned int inputLen)
+{
+ context->state = fnv_64_buf((void *)input, inputLen, context->state, 1);
+}
+
+PHP_HASH_API void PHP_FNV164Final(unsigned char digest[8], PHP_FNV164_CTX * context)
+{
+#ifdef WORDS_BIGENDIAN
+ memcpy(digest, &context->state, 8);
+#else
+ int i = 0;
+ unsigned char *c = (unsigned char *) &context->state;
+
+ for (i = 0; i < 8; i++) {
+ digest[i] = c[7 - i];
+ }
+#endif
+}
+
+
+/*
+ * fnv_32_buf - perform a 32 bit Fowler/Noll/Vo hash on a buffer
+ *
+ * input:
+ * buf - start of buffer to hash
+ * len - length of buffer in octets
+ * hval - previous hash value or 0 if first call
+ * alternate - if > 0 use the alternate version
+ *
+ * returns:
+ * 32 bit hash as a static hash type
+ */
+static php_hash_uint32
+fnv_32_buf(void *buf, size_t len, php_hash_uint32 hval, int alternate)
+{
+ unsigned char *bp = (unsigned char *)buf; /* start of buffer */
+ unsigned char *be = bp + len; /* beyond end of buffer */
+
+ /*
+ * FNV-1 hash each octet in the buffer
+ */
+ while (bp < be) {
+
+ if (alternate == 0) {
+ /* multiply by the 32 bit FNV magic prime mod 2^32 */
+ hval *= PHP_FNV_32_PRIME;
+
+ /* xor the bottom with the current octet */
+ hval ^= (php_hash_uint32)*bp++;
+ } else {
+ /* xor the bottom with the current octet */
+ hval ^= (php_hash_uint32)*bp++;
+
+ /* multiply by the 32 bit FNV magic prime mod 2^32 */
+ hval *= PHP_FNV_32_PRIME;
+ }
+ }
+
+ /* return our new hash value */
+ return hval;
+}
+
+/*
+ * fnv_64_buf - perform a 64 bit Fowler/Noll/Vo hash on a buffer
+ *
+ * input:
+ * buf - start of buffer to hash
+ * len - length of buffer in octets
+ * hval - previous hash value or 0 if first call
+ * alternate - if > 0 use the alternate version
+ *
+ * returns:
+ * 64 bit hash as a static hash type
+ */
+static php_hash_uint64
+fnv_64_buf(void *buf, size_t len, php_hash_uint64 hval, int alternate)
+{
+ unsigned char *bp = (unsigned char *)buf; /* start of buffer */
+ unsigned char *be = bp + len; /* beyond end of buffer */
+
+ /*
+ * FNV-1 hash each octet of the buffer
+ */
+ while (bp < be) {
+
+ if (alternate == 0) {
+ /* multiply by the 64 bit FNV magic prime mod 2^64 */
+ hval *= PHP_FNV_64_PRIME;
+
+ /* xor the bottom with the current octet */
+ hval ^= (php_hash_uint64)*bp++;
+ } else {
+ /* xor the bottom with the current octet */
+ hval ^= (php_hash_uint64)*bp++;
+
+ /* multiply by the 64 bit FNV magic prime mod 2^64 */
+ hval *= PHP_FNV_64_PRIME;
+ }
+ }
+
+ /* return our new hash value */
+ return hval;
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/hash/hash_gost.c b/ext/hash/hash_gost.c
new file mode 100644
index 0000000..3961c4f
--- /dev/null
+++ b/ext/hash/hash_gost.c
@@ -0,0 +1,322 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Michael Wallner <mike@php.net> |
+ | Sara Golemon <pollita@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#include "php_hash.h"
+#include "php_hash_gost.h"
+#include "php_hash_gost_tables.h"
+
+/* {{{ Gost()
+ * derived from gost_compress() by Markku-Juhani Saarinen <mjos@ssh.fi>
+ */
+
+#define round(k1, k2) \
+ t = (k1) + r; \
+ l ^= tables[0][t & 0xff] ^ tables[1][(t >> 8) & 0xff] ^ \
+ tables[2][(t >> 16) & 0xff] ^ tables[3][t >> 24]; \
+ t = (k2) + l; \
+ r ^= tables[0][t & 0xff] ^ tables[1][(t >> 8) & 0xff] ^ \
+ tables[2][(t >> 16) & 0xff] ^ tables[3][t >> 24];
+
+#define R(key, h, i, t, l, r) \
+ r = h[i]; \
+ l = h[i + 1]; \
+ round(key[0], key[1]) \
+ round(key[2], key[3]) \
+ round(key[4], key[5]) \
+ round(key[6], key[7]) \
+ round(key[0], key[1]) \
+ round(key[2], key[3]) \
+ round(key[4], key[5]) \
+ round(key[6], key[7]) \
+ round(key[0], key[1]) \
+ round(key[2], key[3]) \
+ round(key[4], key[5]) \
+ round(key[6], key[7]) \
+ round(key[7], key[6]) \
+ round(key[5], key[4]) \
+ round(key[3], key[2]) \
+ round(key[1], key[0]) \
+ t = r; \
+ r = l; \
+ l = t; \
+
+#define X(w, u, v) \
+ w[0] = u[0] ^ v[0]; \
+ w[1] = u[1] ^ v[1]; \
+ w[2] = u[2] ^ v[2]; \
+ w[3] = u[3] ^ v[3]; \
+ w[4] = u[4] ^ v[4]; \
+ w[5] = u[5] ^ v[5]; \
+ w[6] = u[6] ^ v[6]; \
+ w[7] = u[7] ^ v[7];
+
+#define P(key, w) \
+ key[0] = (w[0] & 0x000000ff) | ((w[2] & 0x000000ff) << 8) | \
+ ((w[4] & 0x000000ff) << 16) | ((w[6] & 0x000000ff) << 24); \
+ key[1] = ((w[0] & 0x0000ff00) >> 8) | (w[2] & 0x0000ff00) | \
+ ((w[4] & 0x0000ff00) << 8) | ((w[6] & 0x0000ff00) << 16); \
+ key[2] = ((w[0] & 0x00ff0000) >> 16) | ((w[2] & 0x00ff0000) >> 8) | \
+ (w[4] & 0x00ff0000) | ((w[6] & 0x00ff0000) << 8); \
+ key[3] = ((w[0] & 0xff000000) >> 24) | ((w[2] & 0xff000000) >> 16) | \
+ ((w[4] & 0xff000000) >> 8) | (w[6] & 0xff000000); \
+ key[4] = (w[1] & 0x000000ff) | ((w[3] & 0x000000ff) << 8) | \
+ ((w[5] & 0x000000ff) << 16) | ((w[7] & 0x000000ff) << 24); \
+ key[5] = ((w[1] & 0x0000ff00) >> 8) | (w[3] & 0x0000ff00) | \
+ ((w[5] & 0x0000ff00) << 8) | ((w[7] & 0x0000ff00) << 16); \
+ key[6] = ((w[1] & 0x00ff0000) >> 16) | ((w[3] & 0x00ff0000) >> 8) | \
+ (w[5] & 0x00ff0000) | ((w[7] & 0x00ff0000) << 8); \
+ key[7] = ((w[1] & 0xff000000) >> 24) | ((w[3] & 0xff000000) >> 16) | \
+ ((w[5] & 0xff000000) >> 8) | (w[7] & 0xff000000);
+
+#define A(x, l, r) \
+ l = x[0] ^ x[2]; \
+ r = x[1] ^ x[3]; \
+ x[0] = x[2]; \
+ x[1] = x[3]; \
+ x[2] = x[4]; \
+ x[3] = x[5]; \
+ x[4] = x[6]; \
+ x[5] = x[7]; \
+ x[6] = l; \
+ x[7] = r;
+
+#define AA(x, l, r) \
+ l = x[0]; \
+ r = x[2]; \
+ x[0] = x[4]; \
+ x[2] = x[6]; \
+ x[4] = l ^ r; \
+ x[6] = x[0] ^ r; \
+ l = x[1]; \
+ r = x[3]; \
+ x[1] = x[5]; \
+ x[3] = x[7]; \
+ x[5] = l ^ r; \
+ x[7] = x[1] ^ r;
+
+#define C(x) \
+ x[0] ^= 0xff00ff00; \
+ x[1] ^= 0xff00ff00; \
+ x[2] ^= 0x00ff00ff; \
+ x[3] ^= 0x00ff00ff; \
+ x[4] ^= 0x00ffff00; \
+ x[5] ^= 0xff0000ff; \
+ x[6] ^= 0x000000ff; \
+ x[7] ^= 0xff00ffff;
+
+#define S(s, l, r) \
+ s[i] = r; \
+ s[i + 1] = l;
+
+#define SHIFT12(u, m, s) \
+ u[0] = m[0] ^ s[6]; \
+ u[1] = m[1] ^ s[7]; \
+ u[2] = m[2] ^ (s[0] << 16) ^ (s[0] >> 16) ^ (s[0] & 0xffff) ^ \
+ (s[1] & 0xffff) ^ (s[1] >> 16) ^ (s[2] << 16) ^ s[6] ^ (s[6] << 16) ^ \
+ (s[7] & 0xffff0000) ^ (s[7] >> 16); \
+ u[3] = m[3] ^ (s[0] & 0xffff) ^ (s[0] << 16) ^ (s[1] & 0xffff) ^ \
+ (s[1] << 16) ^ (s[1] >> 16) ^ (s[2] << 16) ^ (s[2] >> 16) ^ \
+ (s[3] << 16) ^ s[6] ^ (s[6] << 16) ^ (s[6] >> 16) ^ (s[7] & 0xffff) ^ \
+ (s[7] << 16) ^ (s[7] >> 16); \
+ u[4] = m[4] ^ \
+ (s[0] & 0xffff0000) ^ (s[0] << 16) ^ (s[0] >> 16) ^ \
+ (s[1] & 0xffff0000) ^ (s[1] >> 16) ^ (s[2] << 16) ^ (s[2] >> 16) ^ \
+ (s[3] << 16) ^ (s[3] >> 16) ^ (s[4] << 16) ^ (s[6] << 16) ^ \
+ (s[6] >> 16) ^(s[7] & 0xffff) ^ (s[7] << 16) ^ (s[7] >> 16); \
+ u[5] = m[5] ^ (s[0] << 16) ^ (s[0] >> 16) ^ (s[0] & 0xffff0000) ^ \
+ (s[1] & 0xffff) ^ s[2] ^ (s[2] >> 16) ^ (s[3] << 16) ^ (s[3] >> 16) ^ \
+ (s[4] << 16) ^ (s[4] >> 16) ^ (s[5] << 16) ^ (s[6] << 16) ^ \
+ (s[6] >> 16) ^ (s[7] & 0xffff0000) ^ (s[7] << 16) ^ (s[7] >> 16); \
+ u[6] = m[6] ^ s[0] ^ (s[1] >> 16) ^ (s[2] << 16) ^ s[3] ^ (s[3] >> 16) ^ \
+ (s[4] << 16) ^ (s[4] >> 16) ^ (s[5] << 16) ^ (s[5] >> 16) ^ s[6] ^ \
+ (s[6] << 16) ^ (s[6] >> 16) ^ (s[7] << 16); \
+ u[7] = m[7] ^ (s[0] & 0xffff0000) ^ (s[0] << 16) ^ (s[1] & 0xffff) ^ \
+ (s[1] << 16) ^ (s[2] >> 16) ^ (s[3] << 16) ^ s[4] ^ (s[4] >> 16) ^ \
+ (s[5] << 16) ^ (s[5] >> 16) ^ (s[6] >> 16) ^ (s[7] & 0xffff) ^ \
+ (s[7] << 16) ^ (s[7] >> 16);
+
+#define SHIFT16(h, v, u) \
+ v[0] = h[0] ^ (u[1] << 16) ^ (u[0] >> 16); \
+ v[1] = h[1] ^ (u[2] << 16) ^ (u[1] >> 16); \
+ v[2] = h[2] ^ (u[3] << 16) ^ (u[2] >> 16); \
+ v[3] = h[3] ^ (u[4] << 16) ^ (u[3] >> 16); \
+ v[4] = h[4] ^ (u[5] << 16) ^ (u[4] >> 16); \
+ v[5] = h[5] ^ (u[6] << 16) ^ (u[5] >> 16); \
+ v[6] = h[6] ^ (u[7] << 16) ^ (u[6] >> 16); \
+ v[7] = h[7] ^ (u[0] & 0xffff0000) ^ (u[0] << 16) ^ (u[7] >> 16) ^ \
+ (u[1] & 0xffff0000) ^ (u[1] << 16) ^ (u[6] << 16) ^ (u[7] & 0xffff0000);
+
+#define SHIFT61(h, v) \
+ h[0] = (v[0] & 0xffff0000) ^ (v[0] << 16) ^ (v[0] >> 16) ^ (v[1] >> 16) ^ \
+ (v[1] & 0xffff0000) ^ (v[2] << 16) ^ (v[3] >> 16) ^ (v[4] << 16) ^ \
+ (v[5] >> 16) ^ v[5] ^ (v[6] >> 16) ^ (v[7] << 16) ^ (v[7] >> 16) ^ \
+ (v[7] & 0xffff); \
+ h[1] = (v[0] << 16) ^ (v[0] >> 16) ^ (v[0] & 0xffff0000) ^ (v[1] & 0xffff) ^ \
+ v[2] ^ (v[2] >> 16) ^ (v[3] << 16) ^ (v[4] >> 16) ^ (v[5] << 16) ^ \
+ (v[6] << 16) ^ v[6] ^ (v[7] & 0xffff0000) ^ (v[7] >> 16); \
+ h[2] = (v[0] & 0xffff) ^ (v[0] << 16) ^ (v[1] << 16) ^ (v[1] >> 16) ^ \
+ (v[1] & 0xffff0000) ^ (v[2] << 16) ^ (v[3] >> 16) ^ v[3] ^ (v[4] << 16) ^ \
+ (v[5] >> 16) ^ v[6] ^ (v[6] >> 16) ^ (v[7] & 0xffff) ^ (v[7] << 16) ^ \
+ (v[7] >> 16); \
+ h[3] = (v[0] << 16) ^ (v[0] >> 16) ^ (v[0] & 0xffff0000) ^ \
+ (v[1] & 0xffff0000) ^ (v[1] >> 16) ^ (v[2] << 16) ^ (v[2] >> 16) ^ v[2] ^ \
+ (v[3] << 16) ^ (v[4] >> 16) ^ v[4] ^ (v[5] << 16) ^ (v[6] << 16) ^ \
+ (v[7] & 0xffff) ^ (v[7] >> 16); \
+ h[4] = (v[0] >> 16) ^ (v[1] << 16) ^ v[1] ^ (v[2] >> 16) ^ v[2] ^ \
+ (v[3] << 16) ^ (v[3] >> 16) ^ v[3] ^ (v[4] << 16) ^ (v[5] >> 16) ^ \
+ v[5] ^ (v[6] << 16) ^ (v[6] >> 16) ^ (v[7] << 16); \
+ h[5] = (v[0] << 16) ^ (v[0] & 0xffff0000) ^ (v[1] << 16) ^ (v[1] >> 16) ^ \
+ (v[1] & 0xffff0000) ^ (v[2] << 16) ^ v[2] ^ (v[3] >> 16) ^ v[3] ^ \
+ (v[4] << 16) ^ (v[4] >> 16) ^ v[4] ^ (v[5] << 16) ^ (v[6] << 16) ^ \
+ (v[6] >> 16) ^ v[6] ^ (v[7] << 16) ^ (v[7] >> 16) ^ (v[7] & 0xffff0000); \
+ h[6] = v[0] ^ v[2] ^ (v[2] >> 16) ^ v[3] ^ (v[3] << 16) ^ v[4] ^ \
+ (v[4] >> 16) ^ (v[5] << 16) ^ (v[5] >> 16) ^ v[5] ^ (v[6] << 16) ^ \
+ (v[6] >> 16) ^ v[6] ^ (v[7] << 16) ^ v[7]; \
+ h[7] = v[0] ^ (v[0] >> 16) ^ (v[1] << 16) ^ (v[1] >> 16) ^ (v[2] << 16) ^ \
+ (v[3] >> 16) ^ v[3] ^ (v[4] << 16) ^ v[4] ^ (v[5] >> 16) ^ v[5] ^ \
+ (v[6] << 16) ^ (v[6] >> 16) ^ (v[7] << 16) ^ v[7];
+
+#define PASS \
+ X(w, u, v); \
+ P(key, w); \
+ R(key, h, i, t, l, r); \
+ S(s, l, r); \
+ if (i != 6) { \
+ A(u, l, r); \
+ if (i == 2) { \
+ C(u); \
+ } \
+ AA(v, l, r); \
+ }
+
+static inline void Gost(php_hash_uint32 state[8], php_hash_uint32 data[8])
+{
+ int i;
+ php_hash_uint32 l, r, t, key[8], u[8], v[8], w[8], s[8], *h = state, *m = data;
+
+ memcpy(u, state, sizeof(u));
+ memcpy(v, data, sizeof(v));
+
+ for (i = 0; i < 8; i += 2) {
+ PASS;
+ }
+ SHIFT12(u, m, s);
+ SHIFT16(h, v, u);
+ SHIFT61(h, v);
+}
+/* }}} */
+
+static inline void GostTransform(PHP_GOST_CTX *context, const unsigned char input[32])
+{
+ int i, j;
+ php_hash_uint32 data[8], temp = 0, save = 0;
+
+ for (i = 0, j = 0; i < 8; ++i, j += 4) {
+ data[i] = ((php_hash_uint32) input[j]) | (((php_hash_uint32) input[j + 1]) << 8) |
+ (((php_hash_uint32) input[j + 2]) << 16) | (((php_hash_uint32) input[j + 3]) << 24);
+ save = context->state[i + 8];
+ context->state[i + 8] += data[i] + temp;
+ temp = ((context->state[i + 8] < data[i]) || (context->state[i + 8] < save)) ? 1 : 0;
+ }
+
+ Gost(context->state, data);
+}
+
+PHP_HASH_API void PHP_GOSTInit(PHP_GOST_CTX *context)
+{
+ memset(context, 0, sizeof(*context));
+}
+
+static const php_hash_uint32 MAX32 = 0xffffffffLU;
+
+PHP_HASH_API void PHP_GOSTUpdate(PHP_GOST_CTX *context, const unsigned char *input, size_t len)
+{
+ if ((MAX32 - context->count[0]) < (len * 8)) {
+ context->count[1]++;
+ context->count[0] = MAX32 - context->count[0];
+ context->count[0] = (len * 8) - context->count[0];
+ } else {
+ context->count[0] += len * 8;
+ }
+
+ if (context->length + len < 32) {
+ memcpy(&context->buffer[context->length], input, len);
+ context->length += len;
+ } else {
+ size_t i = 0, r = (context->length + len) % 32;
+
+ if (context->length) {
+ i = 32 - context->length;
+ memcpy(&context->buffer[context->length], input, i);
+ GostTransform(context, context->buffer);
+ }
+
+ for (; i + 32 <= len; i += 32) {
+ GostTransform(context, input + i);
+ }
+
+ memcpy(context->buffer, input + i, r);
+ memset(&context->buffer[r], 0, 32 - r);
+ context->length = r;
+ }
+}
+
+PHP_HASH_API void PHP_GOSTFinal(unsigned char digest[32], PHP_GOST_CTX *context)
+{
+ php_hash_uint32 i, j, l[8] = {0};
+
+ if (context->length) {
+ GostTransform(context, context->buffer);
+ }
+
+ memcpy(l, context->count, sizeof(context->count));
+ Gost(context->state, l);
+ memcpy(l, &context->state[8], sizeof(l));
+ Gost(context->state, l);
+
+ for (i = 0, j = 0; j < 32; i++, j += 4) {
+ digest[j] = (unsigned char) (context->state[i] & 0xff);
+ digest[j + 1] = (unsigned char) ((context->state[i] >> 8) & 0xff);
+ digest[j + 2] = (unsigned char) ((context->state[i] >> 16) & 0xff);
+ digest[j + 3] = (unsigned char) ((context->state[i] >> 24) & 0xff);
+ }
+
+ memset(context, 0, sizeof(*context));
+}
+
+const php_hash_ops php_hash_gost_ops = {
+ (php_hash_init_func_t) PHP_GOSTInit,
+ (php_hash_update_func_t) PHP_GOSTUpdate,
+ (php_hash_final_func_t) PHP_GOSTFinal,
+ (php_hash_copy_func_t) php_hash_copy,
+ 32,
+ 32,
+ sizeof(PHP_GOST_CTX)
+};
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/hash_haval.c b/ext/hash/hash_haval.c
new file mode 100644
index 0000000..7d8b496
--- /dev/null
+++ b/ext/hash/hash_haval.c
@@ -0,0 +1,551 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Sara Golemon <pollita@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#include "php_hash.h"
+#include "php_hash_haval.h"
+
+static const unsigned char PADDING[128] ={
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+static const php_hash_uint32 D0[8] = {
+ 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89 };
+
+static const php_hash_uint32 K2[32] = {
+ 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,
+ 0x9216D5D9, 0x8979FB1B, 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, 0xB8E1AFED, 0x6A267E96,
+ 0xBA7C9045, 0xF12C7F99, 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16, 0x636920D8, 0x71574E69,
+ 0xA458FEA3, 0xF4933D7E, 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE, 0x7B54A41D, 0xC25A59B5 };
+
+static const php_hash_uint32 K3[32] = {
+ 0x9C30D539, 0x2AF26013, 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF, 0x8E79DCB0, 0x603A180E,
+ 0x6C9E0E8B, 0xB01E8A3E, 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60, 0xE65525F3, 0xAA55AB94,
+ 0x57489862, 0x63E81440, 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE, 0xA15486AF, 0x7C72E993,
+ 0xB3EE1411, 0x636FBC2A, 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E, 0xAFD6BA33, 0x6C24CF5C };
+
+static const php_hash_uint32 K4[32] = {
+ 0x7A325381, 0x28958677, 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193, 0x61D809CC, 0xFB21A991,
+ 0x487CAC60, 0x5DEC8032, 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88, 0x23893E81, 0xD396ACC5,
+ 0x0F6D6FF3, 0x83F44239, 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E, 0x21C66842, 0xF6E96C9A,
+ 0x670C9C61, 0xABD388F0, 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3, 0x6EEF0B6C, 0x137A3BE4 };
+
+static const php_hash_uint32 K5[32] = {
+ 0xBA3BF050, 0x7EFB2A98, 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88, 0x8CEE8619, 0x456F9FB4,
+ 0x7D84A5C3, 0x3B8B5EBE, 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6, 0x4ED3AA62, 0x363F7706,
+ 0x1BFEDF72, 0x429B023D, 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B, 0x075372C9, 0x80991B7B,
+ 0x25D479D8, 0xF6E8DEF7, 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA, 0xC1A94FB6, 0x409F60C4 };
+
+static const short I2[32] = { 5, 14, 26, 18, 11, 28, 7, 16, 0, 23, 20, 22, 1, 10, 4, 8,
+ 30, 3, 21, 9, 17, 24, 29, 6, 19, 12, 15, 13, 2, 25, 31, 27 };
+
+static const short I3[32] = { 19, 9, 4, 20, 28, 17, 8, 22, 29, 14, 25, 12, 24, 30, 16, 26,
+ 31, 15, 7, 3, 1, 0, 18, 27, 13, 6, 21, 10, 23, 11, 5, 2 };
+
+static const short I4[32] = { 24, 4, 0, 14, 2, 7, 28, 23, 26, 6, 30, 20, 18, 25, 19, 3,
+ 22, 11, 31, 21, 8, 27, 12, 9, 1, 29, 5, 15, 17, 10, 16, 13 };
+
+static const short I5[32] = { 27, 3, 21, 26, 17, 11, 20, 29, 19, 0, 12, 7, 13, 8, 31, 10,
+ 5, 9, 14, 30, 18, 6, 28, 24, 2, 23, 16, 22, 4, 1, 25, 15 };
+
+static const short M0[32] = { 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1,
+ 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1 };
+
+static const short M1[32] = { 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2,
+ 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2 };
+
+static const short M2[32] = { 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3,
+ 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3 };
+
+static const short M3[32] = { 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4,
+ 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4 };
+
+static const short M4[32] = { 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5,
+ 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5 };
+
+static const short M5[32] = { 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6,
+ 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6 };
+
+static const short M6[32] = { 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7,
+ 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7 };
+
+static const short M7[32] = { 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0,
+ 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0 };
+
+/* {{{ Encode
+ Encodes input (php_hash_uint32) into output (unsigned char). Assumes len is
+ a multiple of 4.
+ */
+static void Encode(unsigned char *output, php_hash_uint32 *input, unsigned int len)
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4) {
+ output[j] = (unsigned char) (input[i] & 0xff);
+ output[j + 1] = (unsigned char) ((input[i] >> 8) & 0xff);
+ output[j + 2] = (unsigned char) ((input[i] >> 16) & 0xff);
+ output[j + 3] = (unsigned char) ((input[i] >> 24) & 0xff);
+ }
+}
+/* }}} */
+
+/* {{{ Decode
+ Decodes input (unsigned char) into output (php_hash_uint32). Assumes len is
+ a multiple of 4.
+ */
+static void Decode(php_hash_uint32 *output, const unsigned char *input, unsigned int len)
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4) {
+ output[i] = ((php_hash_uint32) input[j]) | (((php_hash_uint32) input[j + 1]) << 8) |
+ (((php_hash_uint32) input[j + 2]) << 16) | (((php_hash_uint32) input[j + 3]) << 24);
+ }
+}
+/* }}} */
+
+#define F1(x6,x5,x4,x3,x2,x1,x0) ( ((x1) & (x4)) ^ ((x2) & (x5)) ^ ((x3) & (x6)) ^ ((x0) & (x1)) ^ (x0) )
+#define F2(x6,x5,x4,x3,x2,x1,x0) ( ((x1) & (x2) & (x3)) ^ ((x2) & (x4) & (x5)) ^ ((x1) & (x2)) ^ ((x1) & (x4)) ^ \
+ ((x2) & (x6)) ^ ((x3) & (x5)) ^ ((x4) & (x5)) ^ ((x0) & (x2)) ^ (x0) )
+#define F3(x6,x5,x4,x3,x2,x1,x0) ( ((x1) & (x2) & (x3)) ^ ((x1) & (x4)) ^ ((x2) & (x5)) ^ ((x3) & (x6)) ^ ((x0) & (x3)) ^ (x0) )
+#define F4(x6,x5,x4,x3,x2,x1,x0) ( ((x1) & (x2) & (x3)) ^ ((x2) & (x4) & (x5)) ^ ((x3) & (x4) & (x6)) ^ \
+ ((x1) & (x4)) ^ ((x2) & (x6)) ^ ((x3) & (x4)) ^ ((x3) & (x5)) ^ \
+ ((x3) & (x6)) ^ ((x4) & (x5)) ^ ((x4) & (x6)) ^ ((x0) & (x4)) ^ (x0) )
+#define F5(x6,x5,x4,x3,x2,x1,x0) ( ((x1) & (x4)) ^ ((x2) & (x5)) ^ ((x3) & (x6)) ^ \
+ ((x0) & (x1) & (x2) & (x3)) ^ ((x0) & (x5)) ^ (x0) )
+
+#define ROTR(x,n) (((x) >> (n)) | ((x) << (32 - (n))))
+
+
+/* {{{ PHP_3HAVALTransform
+ */
+static void PHP_3HAVALTransform(php_hash_uint32 state[8], const unsigned char block[128])
+{
+ php_hash_uint32 E[8];
+ php_hash_uint32 x[32];
+ int i;
+
+ Decode(x, block, 128);
+
+ for(i = 0; i < 8; i++) {
+ E[i] = state[i];
+ }
+
+ for(i = 0; i < 32; i++) {
+ E[7 - (i % 8)] = ROTR(F1(E[M1[i]],E[M0[i]],E[M3[i]],E[M5[i]],E[M6[i]],E[M2[i]],E[M4[i]]),7) + ROTR(E[M7[i]],11) + x[i];
+ }
+ for(i = 0; i < 32; i++) {
+ E[7 - (i % 8)] = ROTR(F2(E[M4[i]],E[M2[i]],E[M1[i]],E[M0[i]],E[M5[i]],E[M3[i]],E[M6[i]]),7) + ROTR(E[M7[i]],11) + x[I2[i]] + K2[i];
+ }
+ for(i = 0; i < 32; i++) {
+ E[7 - (i % 8)] = ROTR(F3(E[M6[i]],E[M1[i]],E[M2[i]],E[M3[i]],E[M4[i]],E[M5[i]],E[M0[i]]),7) + ROTR(E[M7[i]],11) + x[I3[i]] + K3[i];
+ }
+
+ /* Update digest */
+ for(i = 0; i < 8; i++) {
+ state[i] += E[i];
+ }
+
+ /* Zeroize sensitive information. */
+ memset((unsigned char*) x, 0, sizeof(x));
+}
+/* }}} */
+
+/* {{{ PHP_4HAVALTransform
+ */
+static void PHP_4HAVALTransform(php_hash_uint32 state[8], const unsigned char block[128])
+{
+ php_hash_uint32 E[8];
+ php_hash_uint32 x[32];
+ int i;
+
+ Decode(x, block, 128);
+
+ for(i = 0; i < 8; i++) {
+ E[i] = state[i];
+ }
+
+ for(i = 0; i < 32; i++) {
+ E[7 - (i % 8)] = ROTR(F1(E[M2[i]],E[M6[i]],E[M1[i]],E[M4[i]],E[M5[i]],E[M3[i]],E[M0[i]]),7) + ROTR(E[M7[i]],11) + x[i];
+ }
+ for(i = 0; i < 32; i++) {
+ E[7 - (i % 8)] = ROTR(F2(E[M3[i]],E[M5[i]],E[M2[i]],E[M0[i]],E[M1[i]],E[M6[i]],E[M4[i]]),7) + ROTR(E[M7[i]],11) + x[I2[i]] + K2[i];
+ }
+ for(i = 0; i < 32; i++) {
+ E[7 - (i % 8)] = ROTR(F3(E[M1[i]],E[M4[i]],E[M3[i]],E[M6[i]],E[M0[i]],E[M2[i]],E[M5[i]]),7) + ROTR(E[M7[i]],11) + x[I3[i]] + K3[i];
+ }
+ for(i = 0; i < 32; i++) {
+ E[7 - (i % 8)] = ROTR(F4(E[M6[i]],E[M4[i]],E[M0[i]],E[M5[i]],E[M2[i]],E[M1[i]],E[M3[i]]),7) + ROTR(E[M7[i]],11) + x[I4[i]] + K4[i];
+ }
+
+ /* Update digest */
+ for(i = 0; i < 8; i++) {
+ state[i] += E[i];
+ }
+
+ /* Zeroize sensitive information. */
+ memset((unsigned char*) x, 0, sizeof(x));
+}
+/* }}} */
+
+/* {{{ PHP_5HAVALTransform
+ */
+static void PHP_5HAVALTransform(php_hash_uint32 state[8], const unsigned char block[128])
+{
+ php_hash_uint32 E[8];
+ php_hash_uint32 x[32];
+ int i;
+
+ Decode(x, block, 128);
+
+ for(i = 0; i < 8; i++) {
+ E[i] = state[i];
+ }
+ for(i = 0; i < 32; i++) {
+ E[7 - (i % 8)] = ROTR(F1(E[M3[i]],E[M4[i]],E[M1[i]],E[M0[i]],E[M5[i]],E[M2[i]],E[M6[i]]),7) + ROTR(E[M7[i]],11) + x[i];
+ }
+ for(i = 0; i < 32; i++) {
+ E[7 - (i % 8)] = ROTR(F2(E[M6[i]],E[M2[i]],E[M1[i]],E[M0[i]],E[M3[i]],E[M4[i]],E[M5[i]]),7) + ROTR(E[M7[i]],11) + x[I2[i]] + K2[i];
+ }
+ for(i = 0; i < 32; i++) {
+ E[7 - (i % 8)] = ROTR(F3(E[M2[i]],E[M6[i]],E[M0[i]],E[M4[i]],E[M3[i]],E[M1[i]],E[M5[i]]),7) + ROTR(E[M7[i]],11) + x[I3[i]] + K3[i];
+ }
+ for(i = 0; i < 32; i++) {
+ E[7 - (i % 8)] = ROTR(F4(E[M1[i]],E[M5[i]],E[M3[i]],E[M2[i]],E[M0[i]],E[M4[i]],E[M6[i]]),7) + ROTR(E[M7[i]],11) + x[I4[i]] + K4[i];
+ }
+ for(i = 0; i < 32; i++) {
+ E[7 - (i % 8)] = ROTR(F5(E[M2[i]],E[M5[i]],E[M0[i]],E[M6[i]],E[M4[i]],E[M3[i]],E[M1[i]]),7) + ROTR(E[M7[i]],11) + x[I5[i]] + K5[i];
+ }
+
+ /* Update digest */
+ for(i = 0; i < 8; i++) {
+ state[i] += E[i];
+ }
+
+ /* Zeroize sensitive information. */
+ memset((unsigned char*) x, 0, sizeof(x));
+}
+/* }}} */
+
+#define PHP_HASH_HAVAL_INIT(p,b) \
+const php_hash_ops php_hash_##p##haval##b##_ops = { \
+ (php_hash_init_func_t) PHP_##p##HAVAL##b##Init, \
+ (php_hash_update_func_t) PHP_HAVALUpdate, \
+ (php_hash_final_func_t) PHP_HAVAL##b##Final, \
+ (php_hash_copy_func_t) php_hash_copy, \
+ ((b) / 8), 128, sizeof(PHP_HAVAL_CTX) }; \
+PHP_HASH_API void PHP_##p##HAVAL##b##Init(PHP_HAVAL_CTX *context) \
+{ int i; context->count[0] = context->count[1] = 0; \
+ for(i = 0; i < 8; i++) context->state[i] = D0[i]; \
+ context->passes = p; context->output = b; \
+ context->Transform = PHP_##p##HAVALTransform; }
+
+PHP_HASH_HAVAL_INIT(3,128)
+PHP_HASH_HAVAL_INIT(3,160)
+PHP_HASH_HAVAL_INIT(3,192)
+PHP_HASH_HAVAL_INIT(3,224)
+PHP_HASH_HAVAL_INIT(3,256)
+
+PHP_HASH_HAVAL_INIT(4,128)
+PHP_HASH_HAVAL_INIT(4,160)
+PHP_HASH_HAVAL_INIT(4,192)
+PHP_HASH_HAVAL_INIT(4,224)
+PHP_HASH_HAVAL_INIT(4,256)
+
+PHP_HASH_HAVAL_INIT(5,128)
+PHP_HASH_HAVAL_INIT(5,160)
+PHP_HASH_HAVAL_INIT(5,192)
+PHP_HASH_HAVAL_INIT(5,224)
+PHP_HASH_HAVAL_INIT(5,256)
+
+/* {{{ PHP_HAVALUpdate
+ */
+PHP_HASH_API void PHP_HAVALUpdate(PHP_HAVAL_CTX *context, const unsigned char *input, unsigned int inputLen)
+{
+ unsigned int i, index, partLen;
+
+ /* Compute number of bytes mod 128 */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x7F);
+ /* Update number of bits */
+ if ((context->count[0] += ((php_hash_uint32) inputLen << 3)) < ((php_hash_uint32) inputLen << 3)) {
+ context->count[1]++;
+ }
+ context->count[1] += ((php_hash_uint32) inputLen >> 29);
+
+ partLen = 128 - index;
+
+ /* Transform as many times as possible.
+ */
+ if (inputLen >= partLen) {
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) input, partLen);
+ context->Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 127 < inputLen; i += 128) {
+ context->Transform(context->state, &input[i]);
+ }
+
+ index = 0;
+ } else {
+ i = 0;
+ }
+
+ /* Buffer remaining input */
+ memcpy((unsigned char*) &context->buffer[index], (unsigned char*) &input[i], inputLen - i);
+}
+/* }}} */
+
+#define PHP_HASH_HAVAL_VERSION 0x01
+
+/* {{{ PHP_HAVAL128Final
+ */
+PHP_HASH_API void PHP_HAVAL128Final(unsigned char *digest, PHP_HAVAL_CTX * context)
+{
+ unsigned char bits[10];
+ unsigned int index, padLen;
+
+ /* Version, Passes, and Digest Length */
+ bits[0] = (PHP_HASH_HAVAL_VERSION & 0x07) |
+ ((context->passes & 0x07) << 3) |
+ ((context->output & 0x03) << 6);
+ bits[1] = (context->output >> 2);
+
+ /* Save number of bits */
+ Encode(bits + 2, context->count, 8);
+
+ /* Pad out to 118 mod 128.
+ */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3f);
+ padLen = (index < 118) ? (118 - index) : (246 - index);
+ PHP_HAVALUpdate(context, PADDING, padLen);
+
+ /* Append version, passes, digest length, and message length */
+ PHP_HAVALUpdate(context, bits, 10);
+
+ /* Store state in digest */
+ context->state[3] += (context->state[7] & 0xFF000000) |
+ (context->state[6] & 0x00FF0000) |
+ (context->state[5] & 0x0000FF00) |
+ (context->state[4] & 0x000000FF);
+
+ context->state[2] += (((context->state[7] & 0x00FF0000) |
+ (context->state[6] & 0x0000FF00) |
+ (context->state[5] & 0x000000FF)) << 8) |
+ ((context->state[4] & 0xFF000000) >> 24);
+
+ context->state[1] += (((context->state[7] & 0x0000FF00) |
+ (context->state[6] & 0x000000FF)) << 16) |
+ (((context->state[5] & 0xFF000000) |
+ (context->state[4] & 0x00FF0000)) >> 16);
+
+ context->state[0] += ((context->state[7] & 0x000000FF) << 24) |
+ (((context->state[6] & 0xFF000000) |
+ (context->state[5] & 0x00FF0000) |
+ (context->state[4] & 0x0000FF00)) >> 8);
+
+ Encode(digest, context->state, 16);
+
+ /* Zeroize sensitive information.
+ */
+ memset((unsigned char*) context, 0, sizeof(*context));
+}
+/* }}} */
+
+/* {{{ PHP_HAVAL160Final
+ */
+PHP_HASH_API void PHP_HAVAL160Final(unsigned char *digest, PHP_HAVAL_CTX * context)
+{
+ unsigned char bits[10];
+ unsigned int index, padLen;
+
+ /* Version, Passes, and Digest Length */
+ bits[0] = (PHP_HASH_HAVAL_VERSION & 0x07) |
+ ((context->passes & 0x07) << 3) |
+ ((context->output & 0x03) << 6);
+ bits[1] = (context->output >> 2);
+
+ /* Save number of bits */
+ Encode(bits + 2, context->count, 8);
+
+ /* Pad out to 118 mod 128.
+ */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3f);
+ padLen = (index < 118) ? (118 - index) : (246 - index);
+ PHP_HAVALUpdate(context, PADDING, padLen);
+
+ /* Append version, passes, digest length, and message length */
+ PHP_HAVALUpdate(context, bits, 10);
+
+ /* Store state in digest */
+ context->state[4] += ((context->state[7] & 0xFE000000) |
+ (context->state[6] & 0x01F80000) |
+ (context->state[5] & 0x0007F000)) >> 12;
+
+ context->state[3] += ((context->state[7] & 0x01F80000) |
+ (context->state[6] & 0x0007F000) |
+ (context->state[5] & 0x00000FC0)) >> 6;
+
+ context->state[2] += (context->state[7] & 0x0007F000) |
+ (context->state[6] & 0x00000FC0) |
+ (context->state[5] & 0x0000003F);
+
+ context->state[1] += ROTR((context->state[7] & 0x00000FC0) |
+ (context->state[6] & 0x0000003F) |
+ (context->state[5] & 0xFE000000), 25);
+
+ context->state[0] += ROTR((context->state[7] & 0x0000003F) |
+ (context->state[6] & 0xFE000000) |
+ (context->state[5] & 0x01F80000), 19);
+
+ Encode(digest, context->state, 20);
+
+ /* Zeroize sensitive information.
+ */
+ memset((unsigned char*) context, 0, sizeof(*context));
+}
+/* }}} */
+
+/* {{{ PHP_HAVAL192Final
+ */
+PHP_HASH_API void PHP_HAVAL192Final(unsigned char *digest, PHP_HAVAL_CTX * context)
+{
+ unsigned char bits[10];
+ unsigned int index, padLen;
+
+ /* Version, Passes, and Digest Length */
+ bits[0] = (PHP_HASH_HAVAL_VERSION & 0x07) |
+ ((context->passes & 0x07) << 3) |
+ ((context->output & 0x03) << 6);
+ bits[1] = (context->output >> 2);
+
+ /* Save number of bits */
+ Encode(bits + 2, context->count, 8);
+
+ /* Pad out to 118 mod 128.
+ */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3f);
+ padLen = (index < 118) ? (118 - index) : (246 - index);
+ PHP_HAVALUpdate(context, PADDING, padLen);
+
+ /* Append version, passes, digest length, and message length */
+ PHP_HAVALUpdate(context, bits, 10);
+
+ /* Store state in digest */
+ context->state[5] += ((context->state[7] & 0xFC000000) | (context->state[6] & 0x03E00000)) >> 21;
+ context->state[4] += ((context->state[7] & 0x03E00000) | (context->state[6] & 0x001F0000)) >> 16;
+ context->state[3] += ((context->state[7] & 0x001F0000) | (context->state[6] & 0x0000FC00)) >> 10;
+ context->state[2] += ((context->state[7] & 0x0000FC00) | (context->state[6] & 0x000003E0)) >> 5;
+ context->state[1] += (context->state[7] & 0x000003E0) | (context->state[6] & 0x0000001F);
+ context->state[0] += ROTR((context->state[7] & 0x0000001F) | (context->state[6] & 0xFC000000), 26);
+ Encode(digest, context->state, 24);
+
+ /* Zeroize sensitive information.
+ */
+ memset((unsigned char*) context, 0, sizeof(*context));
+}
+/* }}} */
+
+/* {{{ PHP_HAVAL224Final
+ */
+PHP_HASH_API void PHP_HAVAL224Final(unsigned char *digest, PHP_HAVAL_CTX * context)
+{
+ unsigned char bits[10];
+ unsigned int index, padLen;
+
+ /* Version, Passes, and Digest Length */
+ bits[0] = (PHP_HASH_HAVAL_VERSION & 0x07) |
+ ((context->passes & 0x07) << 3) |
+ ((context->output & 0x03) << 6);
+ bits[1] = (context->output >> 2);
+
+ /* Save number of bits */
+ Encode(bits + 2, context->count, 8);
+
+ /* Pad out to 118 mod 128.
+ */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3f);
+ padLen = (index < 118) ? (118 - index) : (246 - index);
+ PHP_HAVALUpdate(context, PADDING, padLen);
+
+ /* Append version, passes, digest length, and message length */
+ PHP_HAVALUpdate(context, bits, 10);
+
+ /* Store state in digest */
+ context->state[6] += context->state[7] & 0x0000000F;
+ context->state[5] += (context->state[7] >> 4) & 0x0000001F;
+ context->state[4] += (context->state[7] >> 9) & 0x0000000F;
+ context->state[3] += (context->state[7] >> 13) & 0x0000001F;
+ context->state[2] += (context->state[7] >> 18) & 0x0000000F;
+ context->state[1] += (context->state[7] >> 22) & 0x0000001F;
+ context->state[0] += (context->state[7] >> 27) & 0x0000001F;
+ Encode(digest, context->state, 28);
+
+ /* Zeroize sensitive information.
+ */
+ memset((unsigned char*) context, 0, sizeof(*context));
+}
+/* }}} */
+
+/* {{{ PHP_HAVAL256Final
+ */
+PHP_HASH_API void PHP_HAVAL256Final(unsigned char *digest, PHP_HAVAL_CTX * context)
+{
+ unsigned char bits[10];
+ unsigned int index, padLen;
+
+ /* Version, Passes, and Digest Length */
+ bits[0] = (PHP_HASH_HAVAL_VERSION & 0x07) |
+ ((context->passes & 0x07) << 3) |
+ ((context->output & 0x03) << 6);
+ bits[1] = (context->output >> 2);
+
+ /* Save number of bits */
+ Encode(bits + 2, context->count, 8);
+
+ /* Pad out to 118 mod 128.
+ */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3f);
+ padLen = (index < 118) ? (118 - index) : (246 - index);
+ PHP_HAVALUpdate(context, PADDING, padLen);
+
+ /* Append version, passes, digest length, and message length */
+ PHP_HAVALUpdate(context, bits, 10);
+
+ /* Store state in digest */
+ Encode(digest, context->state, 32);
+
+ /* Zeroize sensitive information.
+ */
+ memset((unsigned char*) context, 0, sizeof(*context));
+}
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/hash_joaat.c b/ext/hash/hash_joaat.c
new file mode 100644
index 0000000..d73938d
--- /dev/null
+++ b/ext/hash/hash_joaat.c
@@ -0,0 +1,99 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Martin Jansen <mj@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+/* Implements Jenkins's one-at-a-time hashing algorithm as presented on
+ * http://www.burtleburtle.net/bob/hash/doobs.html.
+ */
+
+#include "php_hash.h"
+#include "php_hash_joaat.h"
+
+const php_hash_ops php_hash_joaat_ops = {
+ (php_hash_init_func_t) PHP_JOAATInit,
+ (php_hash_update_func_t) PHP_JOAATUpdate,
+ (php_hash_final_func_t) PHP_JOAATFinal,
+ (php_hash_copy_func_t) php_hash_copy,
+ 4,
+ 4,
+ sizeof(PHP_JOAAT_CTX)
+};
+
+PHP_HASH_API void PHP_JOAATInit(PHP_JOAAT_CTX *context)
+{
+ context->state = 0;
+}
+
+PHP_HASH_API void PHP_JOAATUpdate(PHP_JOAAT_CTX *context, const unsigned char *input, unsigned int inputLen)
+{
+ context->state = joaat_buf((void *)input, inputLen, context->state);
+}
+
+PHP_HASH_API void PHP_JOAATFinal(unsigned char digest[4], PHP_JOAAT_CTX * context)
+{
+#ifdef WORDS_BIGENDIAN
+ memcpy(digest, &context->state, 4);
+#else
+ int i = 0;
+ unsigned char *c = (unsigned char *) &context->state;
+
+ for (i = 0; i < 4; i++) {
+ digest[i] = c[3 - i];
+ }
+#endif
+ context->state = 0;
+}
+
+/*
+ * joaat_buf - perform a Jenkins's one-at-a-time hash on a buffer
+ *
+ * input:
+ * buf - start of buffer to hash
+ * len - length of buffer in octets
+ *
+ * returns:
+ * 32 bit hash as a static hash type
+ */
+static php_hash_uint32
+joaat_buf(void *buf, size_t len, php_hash_uint32 hval)
+{
+ size_t i;
+ unsigned char *input = (unsigned char *)buf;
+
+ for (i = 0; i < len; i++) {
+ hval += input[i];
+ hval += (hval << 10);
+ hval ^= (hval >> 6);
+ }
+
+ hval += (hval << 3);
+ hval ^= (hval >> 11);
+ hval += (hval << 15);
+
+ return hval;
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/hash/hash_md.c b/ext/hash/hash_md.c
new file mode 100644
index 0000000..25165ee
--- /dev/null
+++ b/ext/hash/hash_md.c
@@ -0,0 +1,704 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Taken from: ext/standard/md5.c |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#include "php_hash.h"
+#include "php_hash_md.h"
+
+const php_hash_ops php_hash_md5_ops = {
+ (php_hash_init_func_t) PHP_MD5Init,
+ (php_hash_update_func_t) PHP_MD5Update,
+ (php_hash_final_func_t) PHP_MD5Final,
+ (php_hash_copy_func_t) php_hash_copy,
+ 16,
+ 64,
+ sizeof(PHP_MD5_CTX)
+};
+
+const php_hash_ops php_hash_md4_ops = {
+ (php_hash_init_func_t) PHP_MD4Init,
+ (php_hash_update_func_t) PHP_MD4Update,
+ (php_hash_final_func_t) PHP_MD4Final,
+ (php_hash_copy_func_t) php_hash_copy,
+ 16,
+ 64,
+ sizeof(PHP_MD4_CTX)
+};
+
+const php_hash_ops php_hash_md2_ops = {
+ (php_hash_init_func_t) PHP_MD2Init,
+ (php_hash_update_func_t) PHP_MD2Update,
+ (php_hash_final_func_t) PHP_MD2Final,
+ (php_hash_copy_func_t) php_hash_copy,
+ 16,
+ 16,
+ sizeof(PHP_MD2_CTX)
+};
+
+/* MD common stuff */
+
+static const unsigned char PADDING[64] =
+{
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* {{{ Encode
+ Encodes input (php_hash_uint32) into output (unsigned char). Assumes len is
+ a multiple of 4.
+ */
+static void Encode(unsigned char *output, php_hash_uint32 *input, unsigned int len)
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4) {
+ output[j] = (unsigned char) (input[i] & 0xff);
+ output[j + 1] = (unsigned char) ((input[i] >> 8) & 0xff);
+ output[j + 2] = (unsigned char) ((input[i] >> 16) & 0xff);
+ output[j + 3] = (unsigned char) ((input[i] >> 24) & 0xff);
+ }
+}
+/* }}} */
+
+/* {{{ Decode
+ Decodes input (unsigned char) into output (php_hash_uint32). Assumes len is
+ a multiple of 4.
+ */
+static void Decode(php_hash_uint32 *output, const unsigned char *input, unsigned int len)
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4)
+ output[i] = ((php_hash_uint32) input[j]) | (((php_hash_uint32) input[j + 1]) << 8) |
+ (((php_hash_uint32) input[j + 2]) << 16) | (((php_hash_uint32) input[j + 3]) << 24);
+}
+/* }}} */
+
+#ifdef PHP_HASH_MD5_NOT_IN_CORE
+
+/* MD5 */
+
+PHP_HASH_API void make_digest(char *md5str, unsigned char *digest)
+{
+ php_hash_bin2hex(md5str, digest, 16);
+ md5str[32] = '\0';
+}
+
+/* {{{ proto string md5(string str, [ bool raw_output])
+ Calculate the md5 hash of a string */
+PHP_NAMED_FUNCTION(php_if_md5)
+{
+ char *arg;
+ int arg_len;
+ zend_bool raw_output = 0;
+ char md5str[33];
+ PHP_MD5_CTX context;
+ unsigned char digest[16];
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b", &arg, &arg_len, &raw_output) == FAILURE) {
+ return;
+ }
+
+ md5str[0] = '\0';
+ PHP_MD5Init(&context);
+ PHP_MD5Update(&context, arg, arg_len);
+ PHP_MD5Final(digest, &context);
+ if (raw_output) {
+ RETURN_STRINGL(digest, 16, 1);
+ } else {
+ make_digest(md5str, digest);
+ RETVAL_STRING(md5str, 1);
+ }
+
+}
+/* }}} */
+
+/* {{{ proto string md5_file(string filename [, bool raw_output])
+ Calculate the md5 hash of given filename */
+PHP_NAMED_FUNCTION(php_if_md5_file)
+{
+ char *arg;
+ int arg_len;
+ zend_bool raw_output = 0;
+ char md5str[33];
+ unsigned char buf[1024];
+ unsigned char digest[16];
+ PHP_MD5_CTX context;
+ int n;
+ php_stream *stream;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|b", &arg, &arg_len, &raw_output) == FAILURE) {
+ return;
+ }
+
+ stream = php_stream_open_wrapper(arg, "rb", REPORT_ERRORS, NULL);
+ if (!stream) {
+ RETURN_FALSE;
+ }
+
+ PHP_MD5Init(&context);
+
+ while ((n = php_stream_read(stream, buf, sizeof(buf))) > 0) {
+ PHP_MD5Update(&context, buf, n);
+ }
+
+ PHP_MD5Final(digest, &context);
+
+ php_stream_close(stream);
+
+ if (n<0) {
+ RETURN_FALSE;
+ }
+
+ if (raw_output) {
+ RETURN_STRINGL(digest, 16, 1);
+ } else {
+ make_digest(md5str, digest);
+ RETVAL_STRING(md5str, 1);
+ }
+}
+/* }}} */
+
+/*
+ * The remaining code is the reference MD5 code (md5c.c) from rfc1321
+ */
+/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
+ */
+
+/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+ rights reserved.
+
+ License to copy and use this software is granted provided that it
+ is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+ Algorithm" in all material mentioning or referencing this software
+ or this function.
+
+ License is also granted to make and use derivative works provided
+ that such works are identified as "derived from the RSA Data
+ Security, Inc. MD5 Message-Digest Algorithm" in all material
+ mentioning or referencing the derived work.
+
+ RSA Data Security, Inc. makes no representations concerning either
+ the merchantability of this software or the suitability of this
+ software for any particular purpose. It is provided "as is"
+ without express or implied warranty of any kind.
+
+ These notices must be retained in any copies of any part of this
+ documentation and/or software.
+ */
+
+/* Constants for MD5Transform routine.
+ */
+
+#define S11 7
+#define S12 12
+#define S13 17
+#define S14 22
+#define S21 5
+#define S22 9
+#define S23 14
+#define S24 20
+#define S31 4
+#define S32 11
+#define S33 16
+#define S34 23
+#define S41 6
+#define S42 10
+#define S43 15
+#define S44 21
+
+static void MD5Transform(php_hash_uint32[4], const unsigned char[64]);
+
+/* F, G, H and I are basic MD5 functions.
+ */
+#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
+#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define I(x, y, z) ((y) ^ ((x) | (~z)))
+
+/* ROTATE_LEFT rotates x left n bits.
+ */
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+
+/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
+ Rotation is separate from addition to prevent recomputation.
+ */
+#define FF(a, b, c, d, x, s, ac) { \
+ (a) += F ((b), (c), (d)) + (x) + (php_hash_uint32)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define GG(a, b, c, d, x, s, ac) { \
+ (a) += G ((b), (c), (d)) + (x) + (php_hash_uint32)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define HH(a, b, c, d, x, s, ac) { \
+ (a) += H ((b), (c), (d)) + (x) + (php_hash_uint32)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define II(a, b, c, d, x, s, ac) { \
+ (a) += I ((b), (c), (d)) + (x) + (php_hash_uint32)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+
+/* {{{ PHP_MD5Init
+ * MD5 initialization. Begins an MD5 operation, writing a new context.
+ */
+PHP_HASH_API void PHP_MD5Init(PHP_MD5_CTX * context)
+{
+ context->count[0] = context->count[1] = 0;
+ /* Load magic initialization constants.
+ */
+ context->state[0] = 0x67452301;
+ context->state[1] = 0xefcdab89;
+ context->state[2] = 0x98badcfe;
+ context->state[3] = 0x10325476;
+}
+/* }}} */
+
+/* {{{ PHP_MD5Update
+ MD5 block update operation. Continues an MD5 message-digest
+ operation, processing another message block, and updating the
+ context.
+ */
+PHP_HASH_API void PHP_MD5Update(PHP_MD5_CTX * context, const unsigned char *input,
+ unsigned int inputLen)
+{
+ unsigned int i, index, partLen;
+
+ /* Compute number of bytes mod 64 */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3F);
+
+ /* Update number of bits */
+ if ((context->count[0] += ((php_hash_uint32) inputLen << 3))
+ < ((php_hash_uint32) inputLen << 3))
+ context->count[1]++;
+ context->count[1] += ((php_hash_uint32) inputLen >> 29);
+
+ partLen = 64 - index;
+
+ /* Transform as many times as possible.
+ */
+ if (inputLen >= partLen) {
+ memcpy
+ ((unsigned char*) & context->buffer[index], (unsigned char*) input, partLen);
+ MD5Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64)
+ MD5Transform(context->state, &input[i]);
+
+ index = 0;
+ } else
+ i = 0;
+
+ /* Buffer remaining input */
+ memcpy
+ ((unsigned char*) & context->buffer[index], (unsigned char*) & input[i],
+ inputLen - i);
+}
+/* }}} */
+
+/* {{{ PHP_MD5Final
+ MD5 finalization. Ends an MD5 message-digest operation, writing the
+ the message digest and zeroizing the context.
+ */
+PHP_HASH_API void PHP_MD5Final(unsigned char digest[16], PHP_MD5_CTX * context)
+{
+ unsigned char bits[8];
+ unsigned int index, padLen;
+
+ /* Save number of bits */
+ Encode(bits, context->count, 8);
+
+ /* Pad out to 56 mod 64.
+ */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3f);
+ padLen = (index < 56) ? (56 - index) : (120 - index);
+ PHP_MD5Update(context, PADDING, padLen);
+
+ /* Append length (before padding) */
+ PHP_MD5Update(context, bits, 8);
+
+ /* Store state in digest */
+ Encode(digest, context->state, 16);
+
+ /* Zeroize sensitive information.
+ */
+ memset((unsigned char*) context, 0, sizeof(*context));
+}
+/* }}} */
+
+/* {{{ MD5Transform
+ * MD5 basic transformation. Transforms state based on block.
+ */
+static void MD5Transform(state, block)
+php_hash_uint32 state[4];
+const unsigned char block[64];
+{
+ php_hash_uint32 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
+
+ Decode(x, block, 64);
+
+ /* Round 1 */
+ FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */
+ FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */
+ FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */
+ FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */
+ FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */
+ FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */
+ FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */
+ FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */
+ FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */
+ FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */
+ FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
+ FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
+ FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
+ FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
+ FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
+ FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
+
+ /* Round 2 */
+ GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */
+ GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */
+ GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
+ GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */
+ GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */
+ GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */
+ GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
+ GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */
+ GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */
+ GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
+ GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */
+ GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */
+ GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
+ GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */
+ GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */
+ GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
+
+ /* Round 3 */
+ HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */
+ HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */
+ HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
+ HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
+ HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */
+ HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */
+ HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */
+ HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
+ HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
+ HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */
+ HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */
+ HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */
+ HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */
+ HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
+ HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
+ HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */
+
+ /* Round 4 */
+ II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */
+ II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */
+ II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
+ II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */
+ II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
+ II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */
+ II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
+ II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */
+ II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */
+ II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
+ II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */
+ II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
+ II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */
+ II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
+ II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */
+ II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */
+
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+
+ /* Zeroize sensitive information. */
+ memset((unsigned char*) x, 0, sizeof(x));
+}
+/* }}} */
+
+#endif /* PHP_HASH_MD5_NOT_IN_CORE */
+
+/* MD4 */
+
+#define MD4_F(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))
+#define MD4_G(x,y,z) (((x) & ((y) | (z))) | ((y) & (z)))
+#define MD4_H(x,y,z) ((x) ^ (y) ^ (z))
+
+#define ROTL32(s,v) (((v) << (s)) | ((v) >> (32 - (s))))
+
+#define MD4_R1(a,b,c,d,k,s) a = ROTL32(s, a + MD4_F(b,c,d) + x[k])
+#define MD4_R2(a,b,c,d,k,s) a = ROTL32(s, a + MD4_G(b,c,d) + x[k] + 0x5A827999)
+#define MD4_R3(a,b,c,d,k,s) a = ROTL32(s, a + MD4_H(b,c,d) + x[k] + 0x6ED9EBA1)
+
+static void MD4Transform(php_hash_uint32 state[4], const unsigned char block[64])
+{
+ php_hash_uint32 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
+
+ Decode(x, block, 64);
+
+ /* Round 1 */
+ MD4_R1(a,b,c,d, 0, 3);
+ MD4_R1(d,a,b,c, 1, 7);
+ MD4_R1(c,d,a,b, 2,11);
+ MD4_R1(b,c,d,a, 3,19);
+ MD4_R1(a,b,c,d, 4, 3);
+ MD4_R1(d,a,b,c, 5, 7);
+ MD4_R1(c,d,a,b, 6,11);
+ MD4_R1(b,c,d,a, 7,19);
+ MD4_R1(a,b,c,d, 8, 3);
+ MD4_R1(d,a,b,c, 9, 7);
+ MD4_R1(c,d,a,b,10,11);
+ MD4_R1(b,c,d,a,11,19);
+ MD4_R1(a,b,c,d,12, 3);
+ MD4_R1(d,a,b,c,13, 7);
+ MD4_R1(c,d,a,b,14,11);
+ MD4_R1(b,c,d,a,15,19);
+
+ /* Round 2 */
+ MD4_R2(a,b,c,d, 0, 3);
+ MD4_R2(d,a,b,c, 4, 5);
+ MD4_R2(c,d,a,b, 8, 9);
+ MD4_R2(b,c,d,a,12,13);
+ MD4_R2(a,b,c,d, 1, 3);
+ MD4_R2(d,a,b,c, 5, 5);
+ MD4_R2(c,d,a,b, 9, 9);
+ MD4_R2(b,c,d,a,13,13);
+ MD4_R2(a,b,c,d, 2, 3);
+ MD4_R2(d,a,b,c, 6, 5);
+ MD4_R2(c,d,a,b,10, 9);
+ MD4_R2(b,c,d,a,14,13);
+ MD4_R2(a,b,c,d, 3, 3);
+ MD4_R2(d,a,b,c, 7, 5);
+ MD4_R2(c,d,a,b,11, 9);
+ MD4_R2(b,c,d,a,15,13);
+
+ /* Round 3 */
+ MD4_R3(a,b,c,d, 0, 3);
+ MD4_R3(d,a,b,c, 8, 9);
+ MD4_R3(c,d,a,b, 4,11);
+ MD4_R3(b,c,d,a,12,15);
+ MD4_R3(a,b,c,d, 2, 3);
+ MD4_R3(d,a,b,c,10, 9);
+ MD4_R3(c,d,a,b, 6,11);
+ MD4_R3(b,c,d,a,14,15);
+ MD4_R3(a,b,c,d, 1, 3);
+ MD4_R3(d,a,b,c, 9, 9);
+ MD4_R3(c,d,a,b, 5,11);
+ MD4_R3(b,c,d,a,13,15);
+ MD4_R3(a,b,c,d, 3, 3);
+ MD4_R3(d,a,b,c,11, 9);
+ MD4_R3(c,d,a,b, 7,11);
+ MD4_R3(b,c,d,a,15,15);
+
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+}
+
+/* {{{ PHP_MD4Init
+ * MD4 initialization. Begins an MD4 operation, writing a new context.
+ */
+PHP_HASH_API void PHP_MD4Init(PHP_MD4_CTX * context)
+{
+ context->count[0] = context->count[1] = 0;
+ /* Load magic initialization constants.
+ */
+ context->state[0] = 0x67452301;
+ context->state[1] = 0xefcdab89;
+ context->state[2] = 0x98badcfe;
+ context->state[3] = 0x10325476;
+}
+/* }}} */
+
+/* {{{ PHP_MD4Update
+ MD4 block update operation. Continues an MD4 message-digest
+ operation, processing another message block, and updating the
+ context.
+ */
+PHP_HASH_API void PHP_MD4Update(PHP_MD4_CTX * context, const unsigned char *input, unsigned int inputLen)
+{
+ unsigned int i, index, partLen;
+
+ /* Compute number of bytes mod 64 */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3F);
+
+ /* Update number of bits */
+ if ((context->count[0] += ((php_hash_uint32) inputLen << 3))
+ < ((php_hash_uint32) inputLen << 3))
+ context->count[1]++;
+ context->count[1] += ((php_hash_uint32) inputLen >> 29);
+
+ partLen = 64 - index;
+
+ /* Transform as many times as possible.
+ */
+ if (inputLen >= partLen) {
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) input, partLen);
+ MD4Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64) {
+ MD4Transform(context->state, &input[i]);
+ }
+
+ index = 0;
+ } else {
+ i = 0;
+ }
+
+ /* Buffer remaining input */
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) & input[i], inputLen - i);
+}
+/* }}} */
+
+/* {{{ PHP_MD4Final
+ MD4 finalization. Ends an MD4 message-digest operation, writing the
+ the message digest and zeroizing the context.
+ */
+PHP_HASH_API void PHP_MD4Final(unsigned char digest[16], PHP_MD4_CTX * context)
+{
+ unsigned char bits[8];
+ unsigned int index, padLen;
+
+ /* Save number of bits */
+ Encode(bits, context->count, 8);
+
+ /* Pad out to 56 mod 64.
+ */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3f);
+ padLen = (index < 56) ? (56 - index) : (120 - index);
+ PHP_MD4Update(context, PADDING, padLen);
+
+ /* Append length (before padding) */
+ PHP_MD4Update(context, bits, 8);
+
+ /* Store state in digest */
+ Encode(digest, context->state, 16);
+
+ /* Zeroize sensitive information.
+ */
+ memset((unsigned char*) context, 0, sizeof(*context));
+}
+/* }}} */
+
+/* MD2 */
+
+static const unsigned char MD2_S[256] = {
+ 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, 19,
+ 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, 76, 130, 202,
+ 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, 138, 23, 229, 18,
+ 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, 245, 142, 187, 47, 238, 122,
+ 169, 104, 121, 145, 21, 178, 7, 63, 148, 194, 16, 137, 11, 34, 95, 33,
+ 128, 127, 93, 154, 90, 144, 50, 39, 53, 62, 204, 231, 191, 247, 151, 3,
+ 255, 25, 48, 179, 72, 165, 181, 209, 215, 94, 146, 42, 172, 86, 170, 198,
+ 79, 184, 56, 210, 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241,
+ 69, 157, 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2,
+ 27, 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15,
+ 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, 234, 38,
+ 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65, 129, 77, 82,
+ 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123, 8, 12, 189, 177, 74,
+ 120, 136, 149, 139, 227, 99, 232, 109, 233, 203, 213, 254, 59, 0, 29, 57,
+ 242, 239, 183, 14, 102, 88, 208, 228, 166, 119, 114, 248, 235, 117, 75, 10,
+ 49, 68, 80, 180, 143, 237, 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 };
+
+PHP_HASH_API void PHP_MD2Init(PHP_MD2_CTX *context)
+{
+ memset(context, 0, sizeof(PHP_MD2_CTX));
+}
+
+static void MD2_Transform(PHP_MD2_CTX *context, const unsigned char *block)
+{
+ unsigned char i,j,t = 0;
+
+ for(i = 0; i < 16; i++) {
+ context->state[16+i] = block[i];
+ context->state[32+i] = (context->state[16+i] ^ context->state[i]);
+ }
+
+ for(i = 0; i < 18; i++) {
+ for(j = 0; j < 48; j++) {
+ t = context->state[j] = context->state[j] ^ MD2_S[t];
+ }
+ t += i;
+ }
+
+ /* Update checksum -- must be after transform to avoid fouling up last message block */
+ t = context->checksum[15];
+ for(i = 0; i < 16; i++) {
+ t = context->checksum[i] ^= MD2_S[block[i] ^ t];
+ }
+}
+
+PHP_HASH_API void PHP_MD2Update(PHP_MD2_CTX *context, const unsigned char *buf, unsigned int len)
+{
+ const unsigned char *p = buf, *e = buf + len;
+
+ if (context->in_buffer) {
+ if (context->in_buffer + len < 16) {
+ /* Not enough for block, just pass into buffer */
+ memcpy(context->buffer + context->in_buffer, p, len);
+ context->in_buffer += len;
+ return;
+ }
+ /* Put buffered data together with inbound for a single block */
+ memcpy(context->buffer + context->in_buffer, p, 16 - context->in_buffer);
+ MD2_Transform(context, context->buffer);
+ p += 16 - context->in_buffer;
+ context->in_buffer = 0;
+ }
+
+ /* Process as many whole blocks as remain */
+ while ((p + 16) <= e) {
+ MD2_Transform(context, p);
+ p += 16;
+ }
+
+ /* Copy remaining data to buffer */
+ if (p < e) {
+ memcpy(context->buffer, p, e - p);
+ context->in_buffer = e - p;
+ }
+}
+
+PHP_HASH_API void PHP_MD2Final(unsigned char output[16], PHP_MD2_CTX *context)
+{
+ memset(context->buffer + context->in_buffer, 16 - context->in_buffer, 16 - context->in_buffer);
+ MD2_Transform(context, context->buffer);
+ MD2_Transform(context, context->checksum);
+
+ memcpy(output, context->state, 16);
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/hash_ripemd.c b/ext/hash/hash_ripemd.c
new file mode 100644
index 0000000..c7c53c6
--- /dev/null
+++ b/ext/hash/hash_ripemd.c
@@ -0,0 +1,775 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Sara Golemon <pollita@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+/* Heavily borrowed from md5.c & sha1.c of PHP archival fame
+ Note that ripemd laughs in the face of logic and uses
+ little endian byte ordering */
+
+#include "php_hash.h"
+#include "php_hash_ripemd.h"
+
+const php_hash_ops php_hash_ripemd128_ops = {
+ (php_hash_init_func_t) PHP_RIPEMD128Init,
+ (php_hash_update_func_t) PHP_RIPEMD128Update,
+ (php_hash_final_func_t) PHP_RIPEMD128Final,
+ (php_hash_copy_func_t) php_hash_copy,
+ 16,
+ 64,
+ sizeof(PHP_RIPEMD128_CTX)
+};
+
+const php_hash_ops php_hash_ripemd160_ops = {
+ (php_hash_init_func_t) PHP_RIPEMD160Init,
+ (php_hash_update_func_t) PHP_RIPEMD160Update,
+ (php_hash_final_func_t) PHP_RIPEMD160Final,
+ (php_hash_copy_func_t) php_hash_copy,
+ 20,
+ 64,
+ sizeof(PHP_RIPEMD160_CTX)
+};
+
+const php_hash_ops php_hash_ripemd256_ops = {
+ (php_hash_init_func_t) PHP_RIPEMD256Init,
+ (php_hash_update_func_t) PHP_RIPEMD256Update,
+ (php_hash_final_func_t) PHP_RIPEMD256Final,
+ (php_hash_copy_func_t) php_hash_copy,
+ 32,
+ 64,
+ sizeof(PHP_RIPEMD256_CTX)
+};
+
+const php_hash_ops php_hash_ripemd320_ops = {
+ (php_hash_init_func_t) PHP_RIPEMD320Init,
+ (php_hash_update_func_t) PHP_RIPEMD320Update,
+ (php_hash_final_func_t) PHP_RIPEMD320Final,
+ (php_hash_copy_func_t) php_hash_copy,
+ 40,
+ 64,
+ sizeof(PHP_RIPEMD320_CTX)
+};
+
+/* {{{ PHP_RIPEMD128Init
+ * ripemd128 initialization. Begins a ripemd128 operation, writing a new context.
+ */
+PHP_HASH_API void PHP_RIPEMD128Init(PHP_RIPEMD128_CTX * context)
+{
+ context->count[0] = context->count[1] = 0;
+ /* Load magic initialization constants.
+ */
+ context->state[0] = 0x67452301;
+ context->state[1] = 0xEFCDAB89;
+ context->state[2] = 0x98BADCFE;
+ context->state[3] = 0x10325476;
+}
+/* }}} */
+
+/* {{{ PHP_RIPEMD256Init
+ * ripemd256 initialization. Begins a ripemd256 operation, writing a new context.
+ */
+PHP_HASH_API void PHP_RIPEMD256Init(PHP_RIPEMD256_CTX * context)
+{
+ context->count[0] = context->count[1] = 0;
+ /* Load magic initialization constants.
+ */
+ context->state[0] = 0x67452301;
+ context->state[1] = 0xEFCDAB89;
+ context->state[2] = 0x98BADCFE;
+ context->state[3] = 0x10325476;
+ context->state[4] = 0x76543210;
+ context->state[5] = 0xFEDCBA98;
+ context->state[6] = 0x89ABCDEF;
+ context->state[7] = 0x01234567;
+}
+/* }}} */
+
+/* {{{ PHP_RIPEMD160Init
+ * ripemd160 initialization. Begins a ripemd160 operation, writing a new context.
+ */
+PHP_HASH_API void PHP_RIPEMD160Init(PHP_RIPEMD160_CTX * context)
+{
+ context->count[0] = context->count[1] = 0;
+ /* Load magic initialization constants.
+ */
+ context->state[0] = 0x67452301;
+ context->state[1] = 0xEFCDAB89;
+ context->state[2] = 0x98BADCFE;
+ context->state[3] = 0x10325476;
+ context->state[4] = 0xC3D2E1F0;
+}
+/* }}} */
+
+/* {{{ PHP_RIPEMD320Init
+ * ripemd320 initialization. Begins a ripemd320 operation, writing a new context.
+ */
+PHP_HASH_API void PHP_RIPEMD320Init(PHP_RIPEMD320_CTX * context)
+{
+ context->count[0] = context->count[1] = 0;
+ /* Load magic initialization constants.
+ */
+ context->state[0] = 0x67452301;
+ context->state[1] = 0xEFCDAB89;
+ context->state[2] = 0x98BADCFE;
+ context->state[3] = 0x10325476;
+ context->state[4] = 0xC3D2E1F0;
+ context->state[5] = 0x76543210;
+ context->state[6] = 0xFEDCBA98;
+ context->state[7] = 0x89ABCDEF;
+ context->state[8] = 0x01234567;
+ context->state[9] = 0x3C2D1E0F;
+}
+/* }}} */
+
+/* Basic ripemd function */
+#define F0(x,y,z) ((x) ^ (y) ^ (z))
+#define F1(x,y,z) (((x) & (y)) | ((~(x)) & (z)))
+#define F2(x,y,z) (((x) | (~(y))) ^ (z))
+#define F3(x,y,z) (((x) & (z)) | ((y) & (~(z))))
+#define F4(x,y,z) ((x) ^ ((y) | (~(z))))
+
+static const php_hash_uint32 K_values[5] = { 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E }; /* 128, 256, 160, 320 */
+static const php_hash_uint32 KK_values[4] = { 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x00000000 }; /* 128 & 256 */
+static const php_hash_uint32 KK160_values[5] = { 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000 }; /* 160 & 320 */
+
+#define K(n) K_values[ (n) >> 4]
+#define KK(n) KK_values[(n) >> 4]
+#define KK160(n) KK160_values[(n) >> 4]
+
+static const unsigned char R[80] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
+ 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
+ 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
+ 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 };
+
+static const unsigned char RR[80] = {
+ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
+ 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
+ 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
+ 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
+ 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 };
+
+static const unsigned char S[80] = {
+ 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
+ 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
+ 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
+ 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
+ 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 };
+
+static const unsigned char SS[80] = {
+ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
+ 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
+ 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
+ 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
+ 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 };
+
+#define ROLS(j, x) (((x) << S[j]) | ((x) >> (32 - S[j])))
+#define ROLSS(j, x) (((x) << SS[j]) | ((x) >> (32 - SS[j])))
+#define ROL(n, x) (((x) << n) | ((x) >> (32 - n)))
+
+/* {{{ RIPEMDDecode
+ Decodes input (unsigned char) into output (php_hash_uint32). Assumes len is
+ a multiple of 4.
+ */
+static void RIPEMDDecode(php_hash_uint32 *output, const unsigned char *input, unsigned int len)
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4)
+ output[i] = ((php_hash_uint32) input[j + 0]) | (((php_hash_uint32) input[j + 1]) << 8) |
+ (((php_hash_uint32) input[j + 2]) << 16) | (((php_hash_uint32) input[j + 3]) << 24);
+}
+/* }}} */
+
+/* {{{ RIPEMD128Transform
+ * ripemd128 basic transformation. Transforms state based on block.
+ */
+static void RIPEMD128Transform(php_hash_uint32 state[4], const unsigned char block[64])
+{
+ php_hash_uint32 a = state[0], b = state[1], c = state[2], d = state[3];
+ php_hash_uint32 aa = state[0], bb = state[1], cc = state[2], dd = state[3];
+ php_hash_uint32 tmp, x[16];
+ int j;
+
+ RIPEMDDecode(x, block, 64);
+
+ for(j = 0; j < 16; j++) {
+ tmp = ROLS( j, a + F0(b, c, d) + x[R[j]] + K(j));
+ a = d; d = c; c = b; b = tmp;
+ tmp = ROLSS(j, aa + F3(bb, cc, dd) + x[RR[j]] + KK(j));
+ aa = dd; dd = cc; cc = bb; bb = tmp;
+ }
+
+ for(j = 16; j < 32; j++) {
+ tmp = ROLS( j, a + F1(b, c, d) + x[R[j]] + K(j));
+ a = d; d = c; c = b; b = tmp;
+ tmp = ROLSS(j, aa + F2(bb, cc, dd) + x[RR[j]] + KK(j));
+ aa = dd; dd = cc; cc = bb; bb = tmp;
+ }
+
+ for(j = 32; j < 48; j++) {
+ tmp = ROLS( j, a + F2(b, c, d) + x[R[j]] + K(j));
+ a = d; d = c; c = b; b = tmp;
+ tmp = ROLSS(j, aa + F1(bb, cc, dd) + x[RR[j]] + KK(j));
+ aa = dd; dd = cc; cc = bb; bb = tmp;
+ }
+
+ for(j = 48; j < 64; j++) {
+ tmp = ROLS( j, a + F3(b, c, d) + x[R[j]] + K(j));
+ a = d; d = c; c = b; b = tmp;
+ tmp = ROLSS(j, aa + F0(bb, cc, dd) + x[RR[j]] + KK(j));
+ aa = dd; dd = cc; cc = bb; bb = tmp;
+ }
+
+ tmp = state[1] + c + dd;
+ state[1] = state[2] + d + aa;
+ state[2] = state[3] + a + bb;
+ state[3] = state[0] + b + cc;
+ state[0] = tmp;
+
+ tmp = 0;
+ memset(x, 0, sizeof(x));
+}
+/* }}} */
+
+/* {{{ PHP_RIPEMD128Update
+ ripemd128 block update operation. Continues a ripemd128 message-digest
+ operation, processing another message block, and updating the
+ context.
+ */
+PHP_HASH_API void PHP_RIPEMD128Update(PHP_RIPEMD128_CTX * context, const unsigned char *input, unsigned int inputLen)
+{
+ unsigned int i, index, partLen;
+
+ /* Compute number of bytes mod 64 */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3F);
+
+ /* Update number of bits */
+ if ((context->count[0] += ((php_hash_uint32) inputLen << 3)) < ((php_hash_uint32) inputLen << 3)) {
+ context->count[1]++;
+ }
+ context->count[1] += ((php_hash_uint32) inputLen >> 29);
+
+ partLen = 64 - index;
+
+ /* Transform as many times as possible.
+ */
+ if (inputLen >= partLen) {
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) input, partLen);
+ RIPEMD128Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64) {
+ RIPEMD128Transform(context->state, &input[i]);
+ }
+
+ index = 0;
+ } else {
+ i = 0;
+ }
+
+ /* Buffer remaining input */
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) & input[i], inputLen - i);
+}
+/* }}} */
+
+/* {{{ RIPEMD256Transform
+ * ripemd256 basic transformation. Transforms state based on block.
+ */
+static void RIPEMD256Transform(php_hash_uint32 state[8], const unsigned char block[64])
+{
+ php_hash_uint32 a = state[0], b = state[1], c = state[2], d = state[3];
+ php_hash_uint32 aa = state[4], bb = state[5], cc = state[6], dd = state[7];
+ php_hash_uint32 tmp, x[16];
+ int j;
+
+ RIPEMDDecode(x, block, 64);
+
+ for(j = 0; j < 16; j++) {
+ tmp = ROLS( j, a + F0(b, c, d) + x[R[j]] + K(j));
+ a = d; d = c; c = b; b = tmp;
+ tmp = ROLSS(j, aa + F3(bb, cc, dd) + x[RR[j]] + KK(j));
+ aa = dd; dd = cc; cc = bb; bb = tmp;
+ }
+ tmp = a; a = aa; aa = tmp;
+
+ for(j = 16; j < 32; j++) {
+ tmp = ROLS( j, a + F1(b, c, d) + x[R[j]] + K(j));
+ a = d; d = c; c = b; b = tmp;
+ tmp = ROLSS(j, aa + F2(bb, cc, dd) + x[RR[j]] + KK(j));
+ aa = dd; dd = cc; cc = bb; bb = tmp;
+ }
+ tmp = b; b = bb; bb = tmp;
+
+ for(j = 32; j < 48; j++) {
+ tmp = ROLS( j, a + F2(b, c, d) + x[R[j]] + K(j));
+ a = d; d = c; c = b; b = tmp;
+ tmp = ROLSS(j, aa + F1(bb, cc, dd) + x[RR[j]] + KK(j));
+ aa = dd; dd = cc; cc = bb; bb = tmp;
+ }
+ tmp = c; c = cc; cc = tmp;
+
+ for(j = 48; j < 64; j++) {
+ tmp = ROLS( j, a + F3(b, c, d) + x[R[j]] + K(j));
+ a = d; d = c; c = b; b = tmp;
+ tmp = ROLSS(j, aa + F0(bb, cc, dd) + x[RR[j]] + KK(j));
+ aa = dd; dd = cc; cc = bb; bb = tmp;
+ }
+ tmp = d; d = dd; dd = tmp;
+
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+ state[4] += aa;
+ state[5] += bb;
+ state[6] += cc;
+ state[7] += dd;
+
+ tmp = 0;
+ memset(x, 0, sizeof(x));
+}
+/* }}} */
+
+/* {{{ PHP_RIPEMD256Update
+ ripemd256 block update operation. Continues a ripemd256 message-digest
+ operation, processing another message block, and updating the
+ context.
+ */
+PHP_HASH_API void PHP_RIPEMD256Update(PHP_RIPEMD256_CTX * context, const unsigned char *input, unsigned int inputLen)
+{
+ unsigned int i, index, partLen;
+
+ /* Compute number of bytes mod 64 */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3F);
+
+ /* Update number of bits */
+ if ((context->count[0] += ((php_hash_uint32) inputLen << 3)) < ((php_hash_uint32) inputLen << 3)) {
+ context->count[1]++;
+ }
+ context->count[1] += ((php_hash_uint32) inputLen >> 29);
+
+ partLen = 64 - index;
+
+ /* Transform as many times as possible.
+ */
+ if (inputLen >= partLen) {
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) input, partLen);
+ RIPEMD256Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64) {
+ RIPEMD256Transform(context->state, &input[i]);
+ }
+
+ index = 0;
+ } else {
+ i = 0;
+ }
+
+ /* Buffer remaining input */
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) & input[i], inputLen - i);
+}
+/* }}} */
+
+/* {{{ RIPEMD160Transform
+ * ripemd160 basic transformation. Transforms state based on block.
+ */
+static void RIPEMD160Transform(php_hash_uint32 state[5], const unsigned char block[64])
+{
+ php_hash_uint32 a = state[0], b = state[1], c = state[2], d = state[3], e = state[4];
+ php_hash_uint32 aa = state[0], bb = state[1], cc = state[2], dd = state[3], ee = state[4];
+ php_hash_uint32 tmp, x[16];
+ int j;
+
+ RIPEMDDecode(x, block, 64);
+
+ for(j = 0; j < 16; j++) {
+ tmp = ROLS( j, a + F0(b, c, d) + x[R[j]] + K(j)) + e;
+ a = e; e = d; d = ROL(10, c); c = b; b = tmp;
+ tmp = ROLSS(j, aa + F4(bb, cc, dd) + x[RR[j]] + KK160(j)) + ee;
+ aa = ee; ee = dd; dd = ROL(10, cc); cc = bb; bb = tmp;
+ }
+
+ for(j = 16; j < 32; j++) {
+ tmp = ROLS( j, a + F1(b, c, d) + x[R[j]] + K(j)) + e;
+ a = e; e = d; d = ROL(10, c); c = b; b = tmp;
+ tmp = ROLSS(j, aa + F3(bb, cc, dd) + x[RR[j]] + KK160(j)) + ee;
+ aa = ee; ee = dd; dd = ROL(10, cc); cc = bb; bb = tmp;
+ }
+
+ for(j = 32; j < 48; j++) {
+ tmp = ROLS( j, a + F2(b, c, d) + x[R[j]] + K(j)) + e;
+ a = e; e = d; d = ROL(10, c); c = b; b = tmp;
+ tmp = ROLSS(j, aa + F2(bb, cc, dd) + x[RR[j]] + KK160(j)) + ee;
+ aa = ee; ee = dd; dd = ROL(10, cc); cc = bb; bb = tmp;
+ }
+
+ for(j = 48; j < 64; j++) {
+ tmp = ROLS( j, a + F3(b, c, d) + x[R[j]] + K(j)) + e;
+ a = e; e = d; d = ROL(10, c); c = b; b = tmp;
+ tmp = ROLSS(j, aa + F1(bb, cc, dd) + x[RR[j]] + KK160(j)) + ee;
+ aa = ee; ee = dd; dd = ROL(10, cc); cc = bb; bb = tmp;
+ }
+
+ for(j = 64; j < 80; j++) {
+ tmp = ROLS( j, a + F4(b, c, d) + x[R[j]] + K(j)) + e;
+ a = e; e = d; d = ROL(10, c); c = b; b = tmp;
+ tmp = ROLSS(j, aa + F0(bb, cc, dd) + x[RR[j]] + KK160(j)) + ee;
+ aa = ee; ee = dd; dd = ROL(10, cc); cc = bb; bb = tmp;
+ }
+
+ tmp = state[1] + c + dd;
+ state[1] = state[2] + d + ee;
+ state[2] = state[3] + e + aa;
+ state[3] = state[4] + a + bb;
+ state[4] = state[0] + b + cc;
+ state[0] = tmp;
+
+ tmp = 0;
+ memset(x, 0, sizeof(x));
+}
+/* }}} */
+
+/* {{{ PHP_RIPEMD160Update
+ ripemd160 block update operation. Continues a ripemd160 message-digest
+ operation, processing another message block, and updating the
+ context.
+ */
+PHP_HASH_API void PHP_RIPEMD160Update(PHP_RIPEMD160_CTX * context, const unsigned char *input, unsigned int inputLen)
+{
+ unsigned int i, index, partLen;
+
+ /* Compute number of bytes mod 64 */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3F);
+
+ /* Update number of bits */
+ if ((context->count[0] += ((php_hash_uint32) inputLen << 3)) < ((php_hash_uint32) inputLen << 3)) {
+ context->count[1]++;
+ }
+ context->count[1] += ((php_hash_uint32) inputLen >> 29);
+
+ partLen = 64 - index;
+
+ /* Transform as many times as possible.
+ */
+ if (inputLen >= partLen) {
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) input, partLen);
+ RIPEMD160Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64) {
+ RIPEMD160Transform(context->state, &input[i]);
+ }
+
+ index = 0;
+ } else {
+ i = 0;
+ }
+
+ /* Buffer remaining input */
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) & input[i], inputLen - i);
+}
+/* }}} */
+
+/* {{{ RIPEMD320Transform
+ * ripemd320 basic transformation. Transforms state based on block.
+ */
+static void RIPEMD320Transform(php_hash_uint32 state[10], const unsigned char block[64])
+{
+ php_hash_uint32 a = state[0], b = state[1], c = state[2], d = state[3], e = state[4];
+ php_hash_uint32 aa = state[5], bb = state[6], cc = state[7], dd = state[8], ee = state[9];
+ php_hash_uint32 tmp, x[16];
+ int j;
+
+ RIPEMDDecode(x, block, 64);
+
+ for(j = 0; j < 16; j++) {
+ tmp = ROLS( j, a + F0(b, c, d) + x[R[j]] + K(j)) + e;
+ a = e; e = d; d = ROL(10, c); c = b; b = tmp;
+ tmp = ROLSS(j, aa + F4(bb, cc, dd) + x[RR[j]] + KK160(j)) + ee;
+ aa = ee; ee = dd; dd = ROL(10, cc); cc = bb; bb = tmp;
+ }
+ tmp = b; b = bb; bb = tmp;
+
+ for(j = 16; j < 32; j++) {
+ tmp = ROLS( j, a + F1(b, c, d) + x[R[j]] + K(j)) + e;
+ a = e; e = d; d = ROL(10, c); c = b; b = tmp;
+ tmp = ROLSS(j, aa + F3(bb, cc, dd) + x[RR[j]] + KK160(j)) + ee;
+ aa = ee; ee = dd; dd = ROL(10, cc); cc = bb; bb = tmp;
+ }
+ tmp = d; d = dd; dd = tmp;
+
+ for(j = 32; j < 48; j++) {
+ tmp = ROLS( j, a + F2(b, c, d) + x[R[j]] + K(j)) + e;
+ a = e; e = d; d = ROL(10, c); c = b; b = tmp;
+ tmp = ROLSS(j, aa + F2(bb, cc, dd) + x[RR[j]] + KK160(j)) + ee;
+ aa = ee; ee = dd; dd = ROL(10, cc); cc = bb; bb = tmp;
+ }
+ tmp = a; a = aa; aa = tmp;
+
+ for(j = 48; j < 64; j++) {
+ tmp = ROLS( j, a + F3(b, c, d) + x[R[j]] + K(j)) + e;
+ a = e; e = d; d = ROL(10, c); c = b; b = tmp;
+ tmp = ROLSS(j, aa + F1(bb, cc, dd) + x[RR[j]] + KK160(j)) + ee;
+ aa = ee; ee = dd; dd = ROL(10, cc); cc = bb; bb = tmp;
+ }
+ tmp = c; c = cc; cc = tmp;
+
+ for(j = 64; j < 80; j++) {
+ tmp = ROLS( j, a + F4(b, c, d) + x[R[j]] + K(j)) + e;
+ a = e; e = d; d = ROL(10, c); c = b; b = tmp;
+ tmp = ROLSS(j, aa + F0(bb, cc, dd) + x[RR[j]] + KK160(j)) + ee;
+ aa = ee; ee = dd; dd = ROL(10, cc); cc = bb; bb = tmp;
+ }
+ tmp = e; e = ee; ee = tmp;
+
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+ state[4] += e;
+ state[5] += aa;
+ state[6] += bb;
+ state[7] += cc;
+ state[8] += dd;
+ state[9] += ee;
+
+ tmp = 0;
+ memset(x, 0, sizeof(x));
+}
+/* }}} */
+
+/* {{{ PHP_RIPEMD320Update
+ ripemd320 block update operation. Continues a ripemd320 message-digest
+ operation, processing another message block, and updating the
+ context.
+ */
+PHP_HASH_API void PHP_RIPEMD320Update(PHP_RIPEMD320_CTX * context, const unsigned char *input, unsigned int inputLen)
+{
+ unsigned int i, index, partLen;
+
+ /* Compute number of bytes mod 64 */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3F);
+
+ /* Update number of bits */
+ if ((context->count[0] += ((php_hash_uint32) inputLen << 3)) < ((php_hash_uint32) inputLen << 3)) {
+ context->count[1]++;
+ }
+ context->count[1] += ((php_hash_uint32) inputLen >> 29);
+
+ partLen = 64 - index;
+
+ /* Transform as many times as possible.
+ */
+ if (inputLen >= partLen) {
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) input, partLen);
+ RIPEMD320Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64) {
+ RIPEMD320Transform(context->state, &input[i]);
+ }
+
+ index = 0;
+ } else {
+ i = 0;
+ }
+
+ /* Buffer remaining input */
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) & input[i], inputLen - i);
+}
+/* }}} */
+
+static const unsigned char PADDING[64] =
+{
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* {{{ RIPEMDEncode
+ Encodes input (php_hash_uint32) into output (unsigned char). Assumes len is
+ a multiple of 4.
+ */
+static void RIPEMDEncode(unsigned char *output, php_hash_uint32 *input, unsigned int len)
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4) {
+ output[j + 3] = (unsigned char) ((input[i] >> 24) & 0xff);
+ output[j + 2] = (unsigned char) ((input[i] >> 16) & 0xff);
+ output[j + 1] = (unsigned char) ((input[i] >> 8) & 0xff);
+ output[j + 0] = (unsigned char) (input[i] & 0xff);
+ }
+}
+/* }}} */
+
+/* {{{ PHP_RIPEMD128Final
+ ripemd128 finalization. Ends a ripemd128 message-digest operation, writing the
+ the message digest and zeroizing the context.
+ */
+PHP_HASH_API void PHP_RIPEMD128Final(unsigned char digest[16], PHP_RIPEMD128_CTX * context)
+{
+ unsigned char bits[8];
+ unsigned int index, padLen;
+
+ /* Save number of bits */
+ bits[0] = (unsigned char) (context->count[0] & 0xFF);
+ bits[1] = (unsigned char) ((context->count[0] >> 8) & 0xFF);
+ bits[2] = (unsigned char) ((context->count[0] >> 16) & 0xFF);
+ bits[3] = (unsigned char) ((context->count[0] >> 24) & 0xFF);
+ bits[4] = (unsigned char) (context->count[1] & 0xFF);
+ bits[5] = (unsigned char) ((context->count[1] >> 8) & 0xFF);
+ bits[6] = (unsigned char) ((context->count[1] >> 16) & 0xFF);
+ bits[7] = (unsigned char) ((context->count[1] >> 24) & 0xFF);
+
+ /* Pad out to 56 mod 64.
+ */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3f);
+ padLen = (index < 56) ? (56 - index) : (120 - index);
+ PHP_RIPEMD128Update(context, PADDING, padLen);
+
+ /* Append length (before padding) */
+ PHP_RIPEMD128Update(context, bits, 8);
+
+ /* Store state in digest */
+ RIPEMDEncode(digest, context->state, 16);
+
+ /* Zeroize sensitive information.
+ */
+ memset((unsigned char*) context, 0, sizeof(*context));
+}
+/* }}} */
+
+/* {{{ PHP_RIPEMD256Final
+ ripemd256 finalization. Ends a ripemd256 message-digest operation, writing the
+ the message digest and zeroizing the context.
+ */
+PHP_HASH_API void PHP_RIPEMD256Final(unsigned char digest[32], PHP_RIPEMD256_CTX * context)
+{
+ unsigned char bits[8];
+ unsigned int index, padLen;
+
+ /* Save number of bits */
+ bits[0] = (unsigned char) (context->count[0] & 0xFF);
+ bits[1] = (unsigned char) ((context->count[0] >> 8) & 0xFF);
+ bits[2] = (unsigned char) ((context->count[0] >> 16) & 0xFF);
+ bits[3] = (unsigned char) ((context->count[0] >> 24) & 0xFF);
+ bits[4] = (unsigned char) (context->count[1] & 0xFF);
+ bits[5] = (unsigned char) ((context->count[1] >> 8) & 0xFF);
+ bits[6] = (unsigned char) ((context->count[1] >> 16) & 0xFF);
+ bits[7] = (unsigned char) ((context->count[1] >> 24) & 0xFF);
+
+ /* Pad out to 56 mod 64.
+ */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3f);
+ padLen = (index < 56) ? (56 - index) : (120 - index);
+ PHP_RIPEMD256Update(context, PADDING, padLen);
+
+ /* Append length (before padding) */
+ PHP_RIPEMD256Update(context, bits, 8);
+
+ /* Store state in digest */
+ RIPEMDEncode(digest, context->state, 32);
+
+ /* Zeroize sensitive information.
+ */
+ memset((unsigned char*) context, 0, sizeof(*context));
+}
+/* }}} */
+
+/* {{{ PHP_RIPEMD160Final
+ ripemd160 finalization. Ends a ripemd160 message-digest operation, writing the
+ the message digest and zeroizing the context.
+ */
+PHP_HASH_API void PHP_RIPEMD160Final(unsigned char digest[20], PHP_RIPEMD160_CTX * context)
+{
+ unsigned char bits[8];
+ unsigned int index, padLen;
+
+ /* Save number of bits */
+ bits[0] = (unsigned char) (context->count[0] & 0xFF);
+ bits[1] = (unsigned char) ((context->count[0] >> 8) & 0xFF);
+ bits[2] = (unsigned char) ((context->count[0] >> 16) & 0xFF);
+ bits[3] = (unsigned char) ((context->count[0] >> 24) & 0xFF);
+ bits[4] = (unsigned char) (context->count[1] & 0xFF);
+ bits[5] = (unsigned char) ((context->count[1] >> 8) & 0xFF);
+ bits[6] = (unsigned char) ((context->count[1] >> 16) & 0xFF);
+ bits[7] = (unsigned char) ((context->count[1] >> 24) & 0xFF);
+
+ /* Pad out to 56 mod 64.
+ */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3f);
+ padLen = (index < 56) ? (56 - index) : (120 - index);
+ PHP_RIPEMD160Update(context, PADDING, padLen);
+
+ /* Append length (before padding) */
+ PHP_RIPEMD160Update(context, bits, 8);
+
+ /* Store state in digest */
+ RIPEMDEncode(digest, context->state, 20);
+
+ /* Zeroize sensitive information.
+ */
+ memset((unsigned char*) context, 0, sizeof(*context));
+}
+/* }}} */
+
+/* {{{ PHP_RIPEMD320Final
+ ripemd320 finalization. Ends a ripemd320 message-digest operation, writing the
+ the message digest and zeroizing the context.
+ */
+PHP_HASH_API void PHP_RIPEMD320Final(unsigned char digest[40], PHP_RIPEMD320_CTX * context)
+{
+ unsigned char bits[8];
+ unsigned int index, padLen;
+
+ /* Save number of bits */
+ bits[0] = (unsigned char) (context->count[0] & 0xFF);
+ bits[1] = (unsigned char) ((context->count[0] >> 8) & 0xFF);
+ bits[2] = (unsigned char) ((context->count[0] >> 16) & 0xFF);
+ bits[3] = (unsigned char) ((context->count[0] >> 24) & 0xFF);
+ bits[4] = (unsigned char) (context->count[1] & 0xFF);
+ bits[5] = (unsigned char) ((context->count[1] >> 8) & 0xFF);
+ bits[6] = (unsigned char) ((context->count[1] >> 16) & 0xFF);
+ bits[7] = (unsigned char) ((context->count[1] >> 24) & 0xFF);
+
+ /* Pad out to 56 mod 64.
+ */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3f);
+ padLen = (index < 56) ? (56 - index) : (120 - index);
+ PHP_RIPEMD320Update(context, PADDING, padLen);
+
+ /* Append length (before padding) */
+ PHP_RIPEMD320Update(context, bits, 8);
+
+ /* Store state in digest */
+ RIPEMDEncode(digest, context->state, 40);
+
+ /* Zeroize sensitive information.
+ */
+ memset((unsigned char*) context, 0, sizeof(*context));
+}
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/hash_sha.c b/ext/hash/hash_sha.c
new file mode 100644
index 0000000..80d9f1f
--- /dev/null
+++ b/ext/hash/hash_sha.c
@@ -0,0 +1,1044 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Steffan Esser <sesser@php.net> |
+ | Sara Golemon <pollita@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#include "php_hash.h"
+#include "php_hash_sha.h"
+
+static const unsigned char PADDING[128] =
+{
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* {{{ SHAEncode32
+ Encodes input (php_hash_uint32) into output (unsigned char). Assumes len is
+ a multiple of 4.
+ */
+static void SHAEncode32(unsigned char *output, php_hash_uint32 *input, unsigned int len)
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4) {
+ output[j] = (unsigned char) ((input[i] >> 24) & 0xff);
+ output[j + 1] = (unsigned char) ((input[i] >> 16) & 0xff);
+ output[j + 2] = (unsigned char) ((input[i] >> 8) & 0xff);
+ output[j + 3] = (unsigned char) (input[i] & 0xff);
+ }
+}
+/* }}} */
+
+
+/* {{{ SHADecode32
+ Decodes input (unsigned char) into output (php_hash_uint32). Assumes len is
+ a multiple of 4.
+ */
+static void SHADecode32(php_hash_uint32 *output, const unsigned char *input, unsigned int len)
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4)
+ output[i] = ((php_hash_uint32) input[j + 3]) | (((php_hash_uint32) input[j + 2]) << 8) |
+ (((php_hash_uint32) input[j + 1]) << 16) | (((php_hash_uint32) input[j]) << 24);
+}
+/* }}} */
+
+const php_hash_ops php_hash_sha1_ops = {
+ (php_hash_init_func_t) PHP_SHA1Init,
+ (php_hash_update_func_t) PHP_SHA1Update,
+ (php_hash_final_func_t) PHP_SHA1Final,
+ (php_hash_copy_func_t) php_hash_copy,
+ 20,
+ 64,
+ sizeof(PHP_SHA1_CTX)
+};
+
+#ifdef PHP_HASH_SHA1_NOT_IN_CORE
+
+PHP_HASH_API void make_sha1_digest(char *sha1str, unsigned char *digest)
+{
+ php_hash_bin2hex(sha1str, digest, 20);
+ sha1str[40] = '\0';
+}
+
+/* {{{ proto string sha1(string str [, bool raw_output])
+ Calculate the sha1 hash of a string */
+PHP_FUNCTION(sha1)
+{
+ char *arg;
+ int arg_len;
+ zend_bool raw_output = 0;
+ char sha1str[41];
+ PHP_SHA1_CTX context;
+ unsigned char digest[20];
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b", &arg, &arg_len, &raw_output) == FAILURE) {
+ return;
+ }
+
+ sha1str[0] = '\0';
+ PHP_SHA1Init(&context);
+ PHP_SHA1Update(&context, arg, arg_len);
+ PHP_SHA1Final(digest, &context);
+ if (raw_output) {
+ RETURN_STRINGL(digest, 20, 1);
+ } else {
+ make_sha1_digest(sha1str, digest);
+ RETVAL_STRING(sha1str, 1);
+ }
+
+}
+
+/* }}} */
+
+/* {{{ proto string sha1_file(string filename [, bool raw_output])
+ Calculate the sha1 hash of given filename */
+PHP_FUNCTION(sha1_file)
+{
+ char *arg;
+ int arg_len;
+ zend_bool raw_output = 0;
+ char sha1str[41];
+ unsigned char buf[1024];
+ unsigned char digest[20];
+ PHP_SHA1_CTX context;
+ int n;
+ php_stream *stream;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|b", &arg, &arg_len, &raw_output) == FAILURE) {
+ return;
+ }
+
+ stream = php_stream_open_wrapper(arg, "rb", REPORT_ERRORS, NULL);
+ if (!stream) {
+ RETURN_FALSE;
+ }
+
+ PHP_SHA1Init(&context);
+
+ while ((n = php_stream_read(stream, buf, sizeof(buf))) > 0) {
+ PHP_SHA1Update(&context, buf, n);
+ }
+
+ PHP_SHA1Final(digest, &context);
+
+ php_stream_close(stream);
+
+ if (n<0) {
+ RETURN_FALSE;
+ }
+
+ if (raw_output) {
+ RETURN_STRINGL(digest, 20, 1);
+ } else {
+ make_sha1_digest(sha1str, digest);
+ RETVAL_STRING(sha1str, 1);
+ }
+}
+/* }}} */
+
+/* F, G, H and I are basic SHA1 functions.
+ */
+#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
+#define G(x, y, z) ((x) ^ (y) ^ (z))
+#define H(x, y, z) (((x) & (y)) | ((z) & ((x) | (y))))
+#define I(x, y, z) ((x) ^ (y) ^ (z))
+
+/* ROTATE_LEFT rotates x left n bits.
+ */
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+
+/* W[i]
+ */
+#define W(i) ( tmp=x[(i-3)&15]^x[(i-8)&15]^x[(i-14)&15]^x[i&15], \
+ (x[i&15]=ROTATE_LEFT(tmp, 1)) )
+
+/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
+ */
+#define FF(a, b, c, d, e, w) { \
+ (e) += F ((b), (c), (d)) + (w) + (php_hash_uint32)(0x5A827999); \
+ (e) += ROTATE_LEFT ((a), 5); \
+ (b) = ROTATE_LEFT((b), 30); \
+ }
+#define GG(a, b, c, d, e, w) { \
+ (e) += G ((b), (c), (d)) + (w) + (php_hash_uint32)(0x6ED9EBA1); \
+ (e) += ROTATE_LEFT ((a), 5); \
+ (b) = ROTATE_LEFT((b), 30); \
+ }
+#define HH(a, b, c, d, e, w) { \
+ (e) += H ((b), (c), (d)) + (w) + (php_hash_uint32)(0x8F1BBCDC); \
+ (e) += ROTATE_LEFT ((a), 5); \
+ (b) = ROTATE_LEFT((b), 30); \
+ }
+#define II(a, b, c, d, e, w) { \
+ (e) += I ((b), (c), (d)) + (w) + (php_hash_uint32)(0xCA62C1D6); \
+ (e) += ROTATE_LEFT ((a), 5); \
+ (b) = ROTATE_LEFT((b), 30); \
+ }
+
+
+/* {{{ PHP_SHA1Init
+ * SHA1 initialization. Begins an SHA1 operation, writing a new context.
+ */
+PHP_HASH_API void PHP_SHA1Init(PHP_SHA1_CTX * context)
+{
+ context->count[0] = context->count[1] = 0;
+ /* Load magic initialization constants.
+ */
+ context->state[0] = 0x67452301;
+ context->state[1] = 0xefcdab89;
+ context->state[2] = 0x98badcfe;
+ context->state[3] = 0x10325476;
+ context->state[4] = 0xc3d2e1f0;
+}
+/* }}} */
+
+/* {{{ SHA1Transform
+ * SHA1 basic transformation. Transforms state based on block.
+ */
+static void SHA1Transform(php_hash_uint32 state[5], const unsigned char block[64])
+{
+ php_hash_uint32 a = state[0], b = state[1], c = state[2];
+ php_hash_uint32 d = state[3], e = state[4], x[16], tmp;
+
+ SHADecode32(x, block, 64);
+
+ /* Round 1 */
+ FF(a, b, c, d, e, x[0]); /* 1 */
+ FF(e, a, b, c, d, x[1]); /* 2 */
+ FF(d, e, a, b, c, x[2]); /* 3 */
+ FF(c, d, e, a, b, x[3]); /* 4 */
+ FF(b, c, d, e, a, x[4]); /* 5 */
+ FF(a, b, c, d, e, x[5]); /* 6 */
+ FF(e, a, b, c, d, x[6]); /* 7 */
+ FF(d, e, a, b, c, x[7]); /* 8 */
+ FF(c, d, e, a, b, x[8]); /* 9 */
+ FF(b, c, d, e, a, x[9]); /* 10 */
+ FF(a, b, c, d, e, x[10]); /* 11 */
+ FF(e, a, b, c, d, x[11]); /* 12 */
+ FF(d, e, a, b, c, x[12]); /* 13 */
+ FF(c, d, e, a, b, x[13]); /* 14 */
+ FF(b, c, d, e, a, x[14]); /* 15 */
+ FF(a, b, c, d, e, x[15]); /* 16 */
+ FF(e, a, b, c, d, W(16)); /* 17 */
+ FF(d, e, a, b, c, W(17)); /* 18 */
+ FF(c, d, e, a, b, W(18)); /* 19 */
+ FF(b, c, d, e, a, W(19)); /* 20 */
+
+ /* Round 2 */
+ GG(a, b, c, d, e, W(20)); /* 21 */
+ GG(e, a, b, c, d, W(21)); /* 22 */
+ GG(d, e, a, b, c, W(22)); /* 23 */
+ GG(c, d, e, a, b, W(23)); /* 24 */
+ GG(b, c, d, e, a, W(24)); /* 25 */
+ GG(a, b, c, d, e, W(25)); /* 26 */
+ GG(e, a, b, c, d, W(26)); /* 27 */
+ GG(d, e, a, b, c, W(27)); /* 28 */
+ GG(c, d, e, a, b, W(28)); /* 29 */
+ GG(b, c, d, e, a, W(29)); /* 30 */
+ GG(a, b, c, d, e, W(30)); /* 31 */
+ GG(e, a, b, c, d, W(31)); /* 32 */
+ GG(d, e, a, b, c, W(32)); /* 33 */
+ GG(c, d, e, a, b, W(33)); /* 34 */
+ GG(b, c, d, e, a, W(34)); /* 35 */
+ GG(a, b, c, d, e, W(35)); /* 36 */
+ GG(e, a, b, c, d, W(36)); /* 37 */
+ GG(d, e, a, b, c, W(37)); /* 38 */
+ GG(c, d, e, a, b, W(38)); /* 39 */
+ GG(b, c, d, e, a, W(39)); /* 40 */
+
+ /* Round 3 */
+ HH(a, b, c, d, e, W(40)); /* 41 */
+ HH(e, a, b, c, d, W(41)); /* 42 */
+ HH(d, e, a, b, c, W(42)); /* 43 */
+ HH(c, d, e, a, b, W(43)); /* 44 */
+ HH(b, c, d, e, a, W(44)); /* 45 */
+ HH(a, b, c, d, e, W(45)); /* 46 */
+ HH(e, a, b, c, d, W(46)); /* 47 */
+ HH(d, e, a, b, c, W(47)); /* 48 */
+ HH(c, d, e, a, b, W(48)); /* 49 */
+ HH(b, c, d, e, a, W(49)); /* 50 */
+ HH(a, b, c, d, e, W(50)); /* 51 */
+ HH(e, a, b, c, d, W(51)); /* 52 */
+ HH(d, e, a, b, c, W(52)); /* 53 */
+ HH(c, d, e, a, b, W(53)); /* 54 */
+ HH(b, c, d, e, a, W(54)); /* 55 */
+ HH(a, b, c, d, e, W(55)); /* 56 */
+ HH(e, a, b, c, d, W(56)); /* 57 */
+ HH(d, e, a, b, c, W(57)); /* 58 */
+ HH(c, d, e, a, b, W(58)); /* 59 */
+ HH(b, c, d, e, a, W(59)); /* 60 */
+
+ /* Round 4 */
+ II(a, b, c, d, e, W(60)); /* 61 */
+ II(e, a, b, c, d, W(61)); /* 62 */
+ II(d, e, a, b, c, W(62)); /* 63 */
+ II(c, d, e, a, b, W(63)); /* 64 */
+ II(b, c, d, e, a, W(64)); /* 65 */
+ II(a, b, c, d, e, W(65)); /* 66 */
+ II(e, a, b, c, d, W(66)); /* 67 */
+ II(d, e, a, b, c, W(67)); /* 68 */
+ II(c, d, e, a, b, W(68)); /* 69 */
+ II(b, c, d, e, a, W(69)); /* 70 */
+ II(a, b, c, d, e, W(70)); /* 71 */
+ II(e, a, b, c, d, W(71)); /* 72 */
+ II(d, e, a, b, c, W(72)); /* 73 */
+ II(c, d, e, a, b, W(73)); /* 74 */
+ II(b, c, d, e, a, W(74)); /* 75 */
+ II(a, b, c, d, e, W(75)); /* 76 */
+ II(e, a, b, c, d, W(76)); /* 77 */
+ II(d, e, a, b, c, W(77)); /* 78 */
+ II(c, d, e, a, b, W(78)); /* 79 */
+ II(b, c, d, e, a, W(79)); /* 80 */
+
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+ state[4] += e;
+
+ /* Zeroize sensitive information. */
+ memset((unsigned char*) x, 0, sizeof(x));
+}
+/* }}} */
+
+/* {{{ PHP_SHA1Update
+ SHA1 block update operation. Continues an SHA1 message-digest
+ operation, processing another message block, and updating the
+ context.
+ */
+PHP_HASH_API void PHP_SHA1Update(PHP_SHA1_CTX * context, const unsigned char *input,
+ unsigned int inputLen)
+{
+ unsigned int i, index, partLen;
+
+ /* Compute number of bytes mod 64 */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3F);
+
+ /* Update number of bits */
+ if ((context->count[0] += ((php_hash_uint32) inputLen << 3))
+ < ((php_hash_uint32) inputLen << 3))
+ context->count[1]++;
+ context->count[1] += ((php_hash_uint32) inputLen >> 29);
+
+ partLen = 64 - index;
+
+ /* Transform as many times as possible.
+ */
+ if (inputLen >= partLen) {
+ memcpy
+ ((unsigned char*) & context->buffer[index], (unsigned char*) input, partLen);
+ SHA1Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64)
+ SHA1Transform(context->state, &input[i]);
+
+ index = 0;
+ } else
+ i = 0;
+
+ /* Buffer remaining input */
+ memcpy
+ ((unsigned char*) & context->buffer[index], (unsigned char*) & input[i],
+ inputLen - i);
+}
+/* }}} */
+
+/* {{{ PHP_SHA1Final
+ SHA1 finalization. Ends an SHA1 message-digest operation, writing the
+ the message digest and zeroizing the context.
+ */
+PHP_HASH_API void PHP_SHA1Final(unsigned char digest[20], PHP_SHA1_CTX * context)
+{
+ unsigned char bits[8];
+ unsigned int index, padLen;
+
+ /* Save number of bits */
+ bits[7] = context->count[0] & 0xFF;
+ bits[6] = (context->count[0] >> 8) & 0xFF;
+ bits[5] = (context->count[0] >> 16) & 0xFF;
+ bits[4] = (context->count[0] >> 24) & 0xFF;
+ bits[3] = context->count[1] & 0xFF;
+ bits[2] = (context->count[1] >> 8) & 0xFF;
+ bits[1] = (context->count[1] >> 16) & 0xFF;
+ bits[0] = (context->count[1] >> 24) & 0xFF;
+
+ /* Pad out to 56 mod 64.
+ */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3f);
+ padLen = (index < 56) ? (56 - index) : (120 - index);
+ PHP_SHA1Update(context, PADDING, padLen);
+
+ /* Append length (before padding) */
+ PHP_SHA1Update(context, bits, 8);
+
+ /* Store state in digest */
+ SHAEncode32(digest, context->state, 20);
+
+ /* Zeroize sensitive information.
+ */
+ memset((unsigned char*) context, 0, sizeof(*context));
+}
+/* }}} */
+
+#endif /* PHP_HASH_SHA1_NOT_IN_CORE */
+
+/* sha224/sha256 */
+
+const php_hash_ops php_hash_sha256_ops = {
+ (php_hash_init_func_t) PHP_SHA256Init,
+ (php_hash_update_func_t) PHP_SHA256Update,
+ (php_hash_final_func_t) PHP_SHA256Final,
+ (php_hash_copy_func_t) php_hash_copy,
+ 32,
+ 64,
+ sizeof(PHP_SHA256_CTX)
+};
+
+const php_hash_ops php_hash_sha224_ops = {
+ (php_hash_init_func_t) PHP_SHA224Init,
+ (php_hash_update_func_t) PHP_SHA224Update,
+ (php_hash_final_func_t) PHP_SHA224Final,
+ (php_hash_copy_func_t) php_hash_copy,
+ 28,
+ 64,
+ sizeof(PHP_SHA224_CTX)
+};
+
+#define ROTR32(b,x) ((x >> b) | (x << (32 - b)))
+#define ROTR64(b,x) ((x >> b) | (x << (64 - b)))
+#define SHR(b, x) (x >> b)
+
+/* Ch */
+#define SHA256_F0(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
+/* Maj */
+#define SHA256_F1(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
+/* SUM0 */
+#define SHA256_F2(x) (ROTR32( 2,(x)) ^ ROTR32(13,(x)) ^ ROTR32(22,(x)))
+/* SUM1 */
+#define SHA256_F3(x) (ROTR32( 6,(x)) ^ ROTR32(11,(x)) ^ ROTR32(25,(x)))
+/* OM0 */
+#define SHA256_F4(x) (ROTR32( 7,(x)) ^ ROTR32(18,(x)) ^ SHR( 3,(x)))
+/* OM1 */
+#define SHA256_F5(x) (ROTR32(17,(x)) ^ ROTR32(19,(x)) ^ SHR(10,(x)))
+
+static const php_hash_uint32 SHA256_K[64] = {
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 };
+
+/* {{{ PHP_SHA256Init
+ * SHA256 initialization. Begins an SHA256 operation, writing a new context.
+ */
+PHP_HASH_API void PHP_SHA256Init(PHP_SHA256_CTX * context)
+{
+ context->count[0] = context->count[1] = 0;
+ /* Load magic initialization constants.
+ */
+ context->state[0] = 0x6a09e667;
+ context->state[1] = 0xbb67ae85;
+ context->state[2] = 0x3c6ef372;
+ context->state[3] = 0xa54ff53a;
+ context->state[4] = 0x510e527f;
+ context->state[5] = 0x9b05688c;
+ context->state[6] = 0x1f83d9ab;
+ context->state[7] = 0x5be0cd19;
+}
+/* }}} */
+
+/* {{{ SHA256Transform
+ * SHA256 basic transformation. Transforms state based on block.
+ */
+static void SHA256Transform(php_hash_uint32 state[8], const unsigned char block[64])
+{
+ php_hash_uint32 a = state[0], b = state[1], c = state[2], d = state[3];
+ php_hash_uint32 e = state[4], f = state[5], g = state[6], h = state[7];
+ php_hash_uint32 x[16], T1, T2, W[64];
+ int i;
+
+ SHADecode32(x, block, 64);
+
+ /* Schedule */
+ for(i = 0; i < 16; i++) {
+ W[i] = x[i];
+ }
+ for(i = 16; i < 64; i++) {
+ W[i] = SHA256_F5(W[i-2]) + W[i-7] + SHA256_F4(W[i-15]) + W[i-16];
+ }
+
+ for (i = 0; i < 64; i++) {
+ T1 = h + SHA256_F3(e) + SHA256_F0(e,f,g) + SHA256_K[i] + W[i];
+ T2 = SHA256_F2(a) + SHA256_F1(a,b,c);
+ h = g; g = f; f = e; e = d + T1;
+ d = c; c = b; b = a; a = T1 + T2;
+ }
+
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+ state[4] += e;
+ state[5] += f;
+ state[6] += g;
+ state[7] += h;
+
+ /* Zeroize sensitive information. */
+ memset((unsigned char*) x, 0, sizeof(x));
+}
+/* }}} */
+
+/* {{{ PHP_SHA224Init
+ * SHA224 initialization. Begins an SHA224 operation, writing a new context.
+ */
+PHP_HASH_API void PHP_SHA224Init(PHP_SHA224_CTX * context)
+{
+ context->count[0] = context->count[1] = 0;
+ /* Load magic initialization constants.
+ */
+ context->state[0] = 0xc1059ed8;
+ context->state[1] = 0x367cd507;
+ context->state[2] = 0x3070dd17;
+ context->state[3] = 0xf70e5939;
+ context->state[4] = 0xffc00b31;
+ context->state[5] = 0x68581511;
+ context->state[6] = 0x64f98fa7;
+ context->state[7] = 0xbefa4fa4;
+}
+/* }}} */
+
+/* {{{ PHP_SHA224Update
+ SHA224 block update operation. Continues an SHA224 message-digest
+ operation, processing another message block, and updating the
+ context.
+ */
+PHP_HASH_API void PHP_SHA224Update(PHP_SHA224_CTX * context, const unsigned char *input, unsigned int inputLen)
+{
+ unsigned int i, index, partLen;
+
+ /* Compute number of bytes mod 64 */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3F);
+
+ /* Update number of bits */
+ if ((context->count[0] += ((php_hash_uint32) inputLen << 3)) < ((php_hash_uint32) inputLen << 3)) {
+ context->count[1]++;
+ }
+ context->count[1] += ((php_hash_uint32) inputLen >> 29);
+
+ partLen = 64 - index;
+
+ /* Transform as many times as possible.
+ */
+ if (inputLen >= partLen) {
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) input, partLen);
+ SHA256Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64) {
+ SHA256Transform(context->state, &input[i]);
+ }
+
+ index = 0;
+ } else {
+ i = 0;
+ }
+
+ /* Buffer remaining input */
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) & input[i], inputLen - i);
+}
+/* }}} */
+
+/* {{{ PHP_SHA224Final
+ SHA224 finalization. Ends an SHA224 message-digest operation, writing the
+ the message digest and zeroizing the context.
+ */
+PHP_HASH_API void PHP_SHA224Final(unsigned char digest[28], PHP_SHA224_CTX * context)
+{
+ unsigned char bits[8];
+ unsigned int index, padLen;
+
+ /* Save number of bits */
+ bits[7] = (unsigned char) (context->count[0] & 0xFF);
+ bits[6] = (unsigned char) ((context->count[0] >> 8) & 0xFF);
+ bits[5] = (unsigned char) ((context->count[0] >> 16) & 0xFF);
+ bits[4] = (unsigned char) ((context->count[0] >> 24) & 0xFF);
+ bits[3] = (unsigned char) (context->count[1] & 0xFF);
+ bits[2] = (unsigned char) ((context->count[1] >> 8) & 0xFF);
+ bits[1] = (unsigned char) ((context->count[1] >> 16) & 0xFF);
+ bits[0] = (unsigned char) ((context->count[1] >> 24) & 0xFF);
+
+ /* Pad out to 56 mod 64.
+ */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3f);
+ padLen = (index < 56) ? (56 - index) : (120 - index);
+ PHP_SHA224Update(context, PADDING, padLen);
+
+ /* Append length (before padding) */
+ PHP_SHA224Update(context, bits, 8);
+
+ /* Store state in digest */
+ SHAEncode32(digest, context->state, 28);
+
+ /* Zeroize sensitive information.
+ */
+ memset((unsigned char*) context, 0, sizeof(*context));
+}
+/* }}} */
+
+/* {{{ PHP_SHA256Update
+ SHA256 block update operation. Continues an SHA256 message-digest
+ operation, processing another message block, and updating the
+ context.
+ */
+PHP_HASH_API void PHP_SHA256Update(PHP_SHA256_CTX * context, const unsigned char *input, unsigned int inputLen)
+{
+ unsigned int i, index, partLen;
+
+ /* Compute number of bytes mod 64 */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3F);
+
+ /* Update number of bits */
+ if ((context->count[0] += ((php_hash_uint32) inputLen << 3)) < ((php_hash_uint32) inputLen << 3)) {
+ context->count[1]++;
+ }
+ context->count[1] += ((php_hash_uint32) inputLen >> 29);
+
+ partLen = 64 - index;
+
+ /* Transform as many times as possible.
+ */
+ if (inputLen >= partLen) {
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) input, partLen);
+ SHA256Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64) {
+ SHA256Transform(context->state, &input[i]);
+ }
+
+ index = 0;
+ } else {
+ i = 0;
+ }
+
+ /* Buffer remaining input */
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) & input[i], inputLen - i);
+}
+/* }}} */
+
+/* {{{ PHP_SHA256Final
+ SHA256 finalization. Ends an SHA256 message-digest operation, writing the
+ the message digest and zeroizing the context.
+ */
+PHP_HASH_API void PHP_SHA256Final(unsigned char digest[32], PHP_SHA256_CTX * context)
+{
+ unsigned char bits[8];
+ unsigned int index, padLen;
+
+ /* Save number of bits */
+ bits[7] = (unsigned char) (context->count[0] & 0xFF);
+ bits[6] = (unsigned char) ((context->count[0] >> 8) & 0xFF);
+ bits[5] = (unsigned char) ((context->count[0] >> 16) & 0xFF);
+ bits[4] = (unsigned char) ((context->count[0] >> 24) & 0xFF);
+ bits[3] = (unsigned char) (context->count[1] & 0xFF);
+ bits[2] = (unsigned char) ((context->count[1] >> 8) & 0xFF);
+ bits[1] = (unsigned char) ((context->count[1] >> 16) & 0xFF);
+ bits[0] = (unsigned char) ((context->count[1] >> 24) & 0xFF);
+
+ /* Pad out to 56 mod 64.
+ */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3f);
+ padLen = (index < 56) ? (56 - index) : (120 - index);
+ PHP_SHA256Update(context, PADDING, padLen);
+
+ /* Append length (before padding) */
+ PHP_SHA256Update(context, bits, 8);
+
+ /* Store state in digest */
+ SHAEncode32(digest, context->state, 32);
+
+ /* Zeroize sensitive information.
+ */
+ memset((unsigned char*) context, 0, sizeof(*context));
+}
+/* }}} */
+
+/* sha384/sha512 */
+
+/* Ch */
+#define SHA512_F0(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
+/* Maj */
+#define SHA512_F1(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
+/* SUM0 */
+#define SHA512_F2(x) (ROTR64(28, x) ^ ROTR64(34, x) ^ ROTR64(39, x))
+/* SUM1 */
+#define SHA512_F3(x) (ROTR64(14, x) ^ ROTR64(18, x) ^ ROTR64(41, x))
+/* OM0 */
+#define SHA512_F4(x) (ROTR64( 1, x) ^ ROTR64( 8, x) ^ SHR(7, x))
+/* OM1 */
+#define SHA512_F5(x) (ROTR64(19, x) ^ ROTR64(61, x) ^ SHR(6, x))
+
+static const php_hash_uint64 SHA512_K[128] = {
+ L64(0x428a2f98d728ae22), L64(0x7137449123ef65cd), L64(0xb5c0fbcfec4d3b2f), L64(0xe9b5dba58189dbbc),
+ L64(0x3956c25bf348b538), L64(0x59f111f1b605d019), L64(0x923f82a4af194f9b), L64(0xab1c5ed5da6d8118),
+ L64(0xd807aa98a3030242), L64(0x12835b0145706fbe), L64(0x243185be4ee4b28c), L64(0x550c7dc3d5ffb4e2),
+ L64(0x72be5d74f27b896f), L64(0x80deb1fe3b1696b1), L64(0x9bdc06a725c71235), L64(0xc19bf174cf692694),
+ L64(0xe49b69c19ef14ad2), L64(0xefbe4786384f25e3), L64(0x0fc19dc68b8cd5b5), L64(0x240ca1cc77ac9c65),
+ L64(0x2de92c6f592b0275), L64(0x4a7484aa6ea6e483), L64(0x5cb0a9dcbd41fbd4), L64(0x76f988da831153b5),
+ L64(0x983e5152ee66dfab), L64(0xa831c66d2db43210), L64(0xb00327c898fb213f), L64(0xbf597fc7beef0ee4),
+ L64(0xc6e00bf33da88fc2), L64(0xd5a79147930aa725), L64(0x06ca6351e003826f), L64(0x142929670a0e6e70),
+ L64(0x27b70a8546d22ffc), L64(0x2e1b21385c26c926), L64(0x4d2c6dfc5ac42aed), L64(0x53380d139d95b3df),
+ L64(0x650a73548baf63de), L64(0x766a0abb3c77b2a8), L64(0x81c2c92e47edaee6), L64(0x92722c851482353b),
+ L64(0xa2bfe8a14cf10364), L64(0xa81a664bbc423001), L64(0xc24b8b70d0f89791), L64(0xc76c51a30654be30),
+ L64(0xd192e819d6ef5218), L64(0xd69906245565a910), L64(0xf40e35855771202a), L64(0x106aa07032bbd1b8),
+ L64(0x19a4c116b8d2d0c8), L64(0x1e376c085141ab53), L64(0x2748774cdf8eeb99), L64(0x34b0bcb5e19b48a8),
+ L64(0x391c0cb3c5c95a63), L64(0x4ed8aa4ae3418acb), L64(0x5b9cca4f7763e373), L64(0x682e6ff3d6b2b8a3),
+ L64(0x748f82ee5defb2fc), L64(0x78a5636f43172f60), L64(0x84c87814a1f0ab72), L64(0x8cc702081a6439ec),
+ L64(0x90befffa23631e28), L64(0xa4506cebde82bde9), L64(0xbef9a3f7b2c67915), L64(0xc67178f2e372532b),
+ L64(0xca273eceea26619c), L64(0xd186b8c721c0c207), L64(0xeada7dd6cde0eb1e), L64(0xf57d4f7fee6ed178),
+ L64(0x06f067aa72176fba), L64(0x0a637dc5a2c898a6), L64(0x113f9804bef90dae), L64(0x1b710b35131c471b),
+ L64(0x28db77f523047d84), L64(0x32caab7b40c72493), L64(0x3c9ebe0a15c9bebc), L64(0x431d67c49c100d4c),
+ L64(0x4cc5d4becb3e42b6), L64(0x597f299cfc657e2a), L64(0x5fcb6fab3ad6faec), L64(0x6c44198c4a475817) };
+
+/* {{{ SHAEncode64
+ Encodes input (php_hash_uint64) into output (unsigned char). Assumes len is
+ a multiple of 8.
+ */
+static void SHAEncode64(unsigned char *output, php_hash_uint64 *input, unsigned int len)
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 8) {
+ output[j] = (unsigned char) ((input[i] >> 56) & 0xff);
+ output[j + 1] = (unsigned char) ((input[i] >> 48) & 0xff);
+ output[j + 2] = (unsigned char) ((input[i] >> 40) & 0xff);
+ output[j + 3] = (unsigned char) ((input[i] >> 32) & 0xff);
+ output[j + 4] = (unsigned char) ((input[i] >> 24) & 0xff);
+ output[j + 5] = (unsigned char) ((input[i] >> 16) & 0xff);
+ output[j + 6] = (unsigned char) ((input[i] >> 8) & 0xff);
+ output[j + 7] = (unsigned char) (input[i] & 0xff);
+ }
+}
+/* }}} */
+
+
+/* {{{ SHADecode64
+ Decodes input (unsigned char) into output (php_hash_uint64). Assumes len is
+ a multiple of 8.
+ */
+static void SHADecode64(php_hash_uint64 *output, const unsigned char *input, unsigned int len)
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 8)
+ output[i] =
+ ((php_hash_uint64) input[j + 7]) | (((php_hash_uint64) input[j + 6]) << 8) |
+ (((php_hash_uint64) input[j + 5]) << 16) | (((php_hash_uint64) input[j + 4]) << 24) |
+ (((php_hash_uint64) input[j + 3]) << 32) | (((php_hash_uint64) input[j + 2]) << 40) |
+ (((php_hash_uint64) input[j + 1]) << 48) | (((php_hash_uint64) input[j]) << 56);
+}
+/* }}} */
+
+/* {{{ PHP_SHA384Init
+ * SHA384 initialization. Begins an SHA384 operation, writing a new context.
+ */
+PHP_HASH_API void PHP_SHA384Init(PHP_SHA384_CTX * context)
+{
+ context->count[0] = context->count[1] = 0;
+ /* Load magic initialization constants.
+ */
+ context->state[0] = L64(0xcbbb9d5dc1059ed8);
+ context->state[1] = L64(0x629a292a367cd507);
+ context->state[2] = L64(0x9159015a3070dd17);
+ context->state[3] = L64(0x152fecd8f70e5939);
+ context->state[4] = L64(0x67332667ffc00b31);
+ context->state[5] = L64(0x8eb44a8768581511);
+ context->state[6] = L64(0xdb0c2e0d64f98fa7);
+ context->state[7] = L64(0x47b5481dbefa4fa4);
+}
+/* }}} */
+
+/* {{{ SHA512Transform
+ * SHA512 basic transformation. Transforms state based on block.
+ * SHA384 uses the exact same algorithm
+ */
+static void SHA512Transform(php_hash_uint64 state[8], const unsigned char block[128])
+{
+ php_hash_uint64 a = state[0], b = state[1], c = state[2], d = state[3];
+ php_hash_uint64 e = state[4], f = state[5], g = state[6], h = state[7];
+ php_hash_uint64 x[16], T1, T2, W[80];
+ int i;
+
+ SHADecode64(x, block, 128);
+
+ /* Schedule */
+ for(i = 0; i < 16; i++) {
+ W[i] = x[i];
+ }
+ for(i = 16; i < 80; i++) {
+ W[i] = SHA512_F5(W[i-2]) + W[i-7] + SHA512_F4(W[i-15]) + W[i-16];
+ }
+
+ for (i = 0; i < 80; i++) {
+ T1 = h + SHA512_F3(e) + SHA512_F0(e,f,g) + SHA512_K[i] + W[i];
+ T2 = SHA512_F2(a) + SHA512_F1(a,b,c);
+ h = g; g = f; f = e; e = d + T1;
+ d = c; c = b; b = a; a = T1 + T2;
+ }
+
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+ state[4] += e;
+ state[5] += f;
+ state[6] += g;
+ state[7] += h;
+
+ /* Zeroize sensitive information. */
+ memset((unsigned char*) x, 0, sizeof(x));
+}
+/* }}} */
+
+/* {{{ PHP_SHA384Update
+ SHA384 block update operation. Continues an SHA384 message-digest
+ operation, processing another message block, and updating the
+ context.
+ */
+PHP_HASH_API void PHP_SHA384Update(PHP_SHA384_CTX * context, const unsigned char *input, unsigned int inputLen)
+{
+ unsigned int i, index, partLen;
+
+ /* Compute number of bytes mod 128 */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x7F);
+
+ /* Update number of bits */
+ if ((context->count[0] += ((php_hash_uint64) inputLen << 3)) < ((php_hash_uint64) inputLen << 3)) {
+ context->count[1]++;
+ }
+ context->count[1] += ((php_hash_uint64) inputLen >> 61);
+
+ partLen = 128 - index;
+
+ /* Transform as many times as possible.
+ */
+ if (inputLen >= partLen) {
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) input, partLen);
+ SHA512Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 127 < inputLen; i += 128) {
+ SHA512Transform(context->state, &input[i]);
+ }
+
+ index = 0;
+ } else {
+ i = 0;
+ }
+
+ /* Buffer remaining input */
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) & input[i], inputLen - i);
+}
+/* }}} */
+
+/* {{{ PHP_SHA384Final
+ SHA384 finalization. Ends an SHA384 message-digest operation, writing the
+ the message digest and zeroizing the context.
+ */
+PHP_HASH_API void PHP_SHA384Final(unsigned char digest[48], PHP_SHA384_CTX * context)
+{
+ unsigned char bits[16];
+ unsigned int index, padLen;
+
+ /* Save number of bits */
+ bits[15] = (unsigned char) (context->count[0] & 0xFF);
+ bits[14] = (unsigned char) ((context->count[0] >> 8) & 0xFF);
+ bits[13] = (unsigned char) ((context->count[0] >> 16) & 0xFF);
+ bits[12] = (unsigned char) ((context->count[0] >> 24) & 0xFF);
+ bits[11] = (unsigned char) ((context->count[0] >> 32) & 0xFF);
+ bits[10] = (unsigned char) ((context->count[0] >> 40) & 0xFF);
+ bits[9] = (unsigned char) ((context->count[0] >> 48) & 0xFF);
+ bits[8] = (unsigned char) ((context->count[0] >> 56) & 0xFF);
+ bits[7] = (unsigned char) (context->count[1] & 0xFF);
+ bits[6] = (unsigned char) ((context->count[1] >> 8) & 0xFF);
+ bits[5] = (unsigned char) ((context->count[1] >> 16) & 0xFF);
+ bits[4] = (unsigned char) ((context->count[1] >> 24) & 0xFF);
+ bits[3] = (unsigned char) ((context->count[1] >> 32) & 0xFF);
+ bits[2] = (unsigned char) ((context->count[1] >> 40) & 0xFF);
+ bits[1] = (unsigned char) ((context->count[1] >> 48) & 0xFF);
+ bits[0] = (unsigned char) ((context->count[1] >> 56) & 0xFF);
+
+ /* Pad out to 112 mod 128.
+ */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x7f);
+ padLen = (index < 112) ? (112 - index) : (240 - index);
+ PHP_SHA384Update(context, PADDING, padLen);
+
+ /* Append length (before padding) */
+ PHP_SHA384Update(context, bits, 16);
+
+ /* Store state in digest */
+ SHAEncode64(digest, context->state, 48);
+
+ /* Zeroize sensitive information.
+ */
+ memset((unsigned char*) context, 0, sizeof(*context));
+}
+/* }}} */
+
+const php_hash_ops php_hash_sha384_ops = {
+ (php_hash_init_func_t) PHP_SHA384Init,
+ (php_hash_update_func_t) PHP_SHA384Update,
+ (php_hash_final_func_t) PHP_SHA384Final,
+ (php_hash_copy_func_t) php_hash_copy,
+ 48,
+ 128,
+ sizeof(PHP_SHA384_CTX)
+};
+
+/* {{{ PHP_SHA512Init
+ * SHA512 initialization. Begins an SHA512 operation, writing a new context.
+ */
+PHP_HASH_API void PHP_SHA512Init(PHP_SHA512_CTX * context)
+{
+ context->count[0] = context->count[1] = 0;
+ /* Load magic initialization constants.
+ */
+ context->state[0] = L64(0x6a09e667f3bcc908);
+ context->state[1] = L64(0xbb67ae8584caa73b);
+ context->state[2] = L64(0x3c6ef372fe94f82b);
+ context->state[3] = L64(0xa54ff53a5f1d36f1);
+ context->state[4] = L64(0x510e527fade682d1);
+ context->state[5] = L64(0x9b05688c2b3e6c1f);
+ context->state[6] = L64(0x1f83d9abfb41bd6b);
+ context->state[7] = L64(0x5be0cd19137e2179);
+}
+/* }}} */
+
+/* {{{ PHP_SHA512Update
+ SHA512 block update operation. Continues an SHA512 message-digest
+ operation, processing another message block, and updating the
+ context.
+ */
+PHP_HASH_API void PHP_SHA512Update(PHP_SHA512_CTX * context, const unsigned char *input, unsigned int inputLen)
+{
+ unsigned int i, index, partLen;
+
+ /* Compute number of bytes mod 128 */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x7F);
+
+ /* Update number of bits */
+ if ((context->count[0] += ((php_hash_uint64) inputLen << 3)) < ((php_hash_uint64) inputLen << 3)) {
+ context->count[1]++;
+ }
+ context->count[1] += ((php_hash_uint64) inputLen >> 61);
+
+ partLen = 128 - index;
+
+ /* Transform as many times as possible.
+ */
+ if (inputLen >= partLen) {
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) input, partLen);
+ SHA512Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 127 < inputLen; i += 128) {
+ SHA512Transform(context->state, &input[i]);
+ }
+
+ index = 0;
+ } else {
+ i = 0;
+ }
+
+ /* Buffer remaining input */
+ memcpy((unsigned char*) & context->buffer[index], (unsigned char*) & input[i], inputLen - i);
+}
+/* }}} */
+
+/* {{{ PHP_SHA512Final
+ SHA512 finalization. Ends an SHA512 message-digest operation, writing the
+ the message digest and zeroizing the context.
+ */
+PHP_HASH_API void PHP_SHA512Final(unsigned char digest[64], PHP_SHA512_CTX * context)
+{
+ unsigned char bits[16];
+ unsigned int index, padLen;
+
+ /* Save number of bits */
+ bits[15] = (unsigned char) (context->count[0] & 0xFF);
+ bits[14] = (unsigned char) ((context->count[0] >> 8) & 0xFF);
+ bits[13] = (unsigned char) ((context->count[0] >> 16) & 0xFF);
+ bits[12] = (unsigned char) ((context->count[0] >> 24) & 0xFF);
+ bits[11] = (unsigned char) ((context->count[0] >> 32) & 0xFF);
+ bits[10] = (unsigned char) ((context->count[0] >> 40) & 0xFF);
+ bits[9] = (unsigned char) ((context->count[0] >> 48) & 0xFF);
+ bits[8] = (unsigned char) ((context->count[0] >> 56) & 0xFF);
+ bits[7] = (unsigned char) (context->count[1] & 0xFF);
+ bits[6] = (unsigned char) ((context->count[1] >> 8) & 0xFF);
+ bits[5] = (unsigned char) ((context->count[1] >> 16) & 0xFF);
+ bits[4] = (unsigned char) ((context->count[1] >> 24) & 0xFF);
+ bits[3] = (unsigned char) ((context->count[1] >> 32) & 0xFF);
+ bits[2] = (unsigned char) ((context->count[1] >> 40) & 0xFF);
+ bits[1] = (unsigned char) ((context->count[1] >> 48) & 0xFF);
+ bits[0] = (unsigned char) ((context->count[1] >> 56) & 0xFF);
+
+ /* Pad out to 112 mod 128.
+ */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x7f);
+ padLen = (index < 112) ? (112 - index) : (240 - index);
+ PHP_SHA512Update(context, PADDING, padLen);
+
+ /* Append length (before padding) */
+ PHP_SHA512Update(context, bits, 16);
+
+ /* Store state in digest */
+ SHAEncode64(digest, context->state, 64);
+
+ /* Zeroize sensitive information.
+ */
+ memset((unsigned char*) context, 0, sizeof(*context));
+}
+/* }}} */
+
+const php_hash_ops php_hash_sha512_ops = {
+ (php_hash_init_func_t) PHP_SHA512Init,
+ (php_hash_update_func_t) PHP_SHA512Update,
+ (php_hash_final_func_t) PHP_SHA512Final,
+ (php_hash_copy_func_t) php_hash_copy,
+ 64,
+ 128,
+ sizeof(PHP_SHA512_CTX)
+};
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/hash_snefru.c b/ext/hash/hash_snefru.c
new file mode 100644
index 0000000..34101de
--- /dev/null
+++ b/ext/hash/hash_snefru.c
@@ -0,0 +1,213 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Michael Wallner <mike@php.net> |
+ | Sara Golemon <pollita@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#include "php_hash.h"
+#include "php_hash_snefru.h"
+#include "php_hash_snefru_tables.h"
+
+#define round(L, C, N, SB) \
+ SBE = SB[C & 0xff]; \
+ L ^= SBE; \
+ N ^= SBE
+
+#ifndef DBG_SNEFRU
+#define DBG_SNEFRU 0
+#endif
+
+#if DBG_SNEFRU
+void ph(php_hash_uint32 h[16])
+{
+ int i;
+ for (i = 0; i < 16; i++)
+ printf ("%08lx", h[i]); printf("\n");
+}
+#endif
+
+static inline void Snefru(php_hash_uint32 input[16])
+{
+ static int shifts[4] = {16, 8, 16, 24};
+ int b, index, rshift, lshift;
+ const php_hash_uint32 *t0,*t1;
+ php_hash_uint32 SBE,B00,B01,B02,B03,B04,B05,B06,B07,B08,B09,B10,B11,B12,B13,B14,B15;
+
+ B00 = input[0];
+ B01 = input[1];
+ B02 = input[2];
+ B03 = input[3];
+ B04 = input[4];
+ B05 = input[5];
+ B06 = input[6];
+ B07 = input[7];
+ B08 = input[8];
+ B09 = input[9];
+ B10 = input[10];
+ B11 = input[11];
+ B12 = input[12];
+ B13 = input[13];
+ B14 = input[14];
+ B15 = input[15];
+
+ for (index = 0; index < 8; index++) {
+ t0 = tables[2*index+0];
+ t1 = tables[2*index+1];
+ for (b = 0; b < 4; b++) {
+ round(B15, B00, B01, t0);
+ round(B00, B01, B02, t0);
+ round(B01, B02, B03, t1);
+ round(B02, B03, B04, t1);
+ round(B03, B04, B05, t0);
+ round(B04, B05, B06, t0);
+ round(B05, B06, B07, t1);
+ round(B06, B07, B08, t1);
+ round(B07, B08, B09, t0);
+ round(B08, B09, B10, t0);
+ round(B09, B10, B11, t1);
+ round(B10, B11, B12, t1);
+ round(B11, B12, B13, t0);
+ round(B12, B13, B14, t0);
+ round(B13, B14, B15, t1);
+ round(B14, B15, B00, t1);
+
+ rshift = shifts[b];
+ lshift = 32-rshift;
+
+ B00 = (B00 >> rshift) | (B00 << lshift);
+ B01 = (B01 >> rshift) | (B01 << lshift);
+ B02 = (B02 >> rshift) | (B02 << lshift);
+ B03 = (B03 >> rshift) | (B03 << lshift);
+ B04 = (B04 >> rshift) | (B04 << lshift);
+ B05 = (B05 >> rshift) | (B05 << lshift);
+ B06 = (B06 >> rshift) | (B06 << lshift);
+ B07 = (B07 >> rshift) | (B07 << lshift);
+ B08 = (B08 >> rshift) | (B08 << lshift);
+ B09 = (B09 >> rshift) | (B09 << lshift);
+ B10 = (B10 >> rshift) | (B10 << lshift);
+ B11 = (B11 >> rshift) | (B11 << lshift);
+ B12 = (B12 >> rshift) | (B12 << lshift);
+ B13 = (B13 >> rshift) | (B13 << lshift);
+ B14 = (B14 >> rshift) | (B14 << lshift);
+ B15 = (B15 >> rshift) | (B15 << lshift);
+ }
+ }
+ input[0] ^= B15;
+ input[1] ^= B14;
+ input[2] ^= B13;
+ input[3] ^= B12;
+ input[4] ^= B11;
+ input[5] ^= B10;
+ input[6] ^= B09;
+ input[7] ^= B08;
+#if DBG_SNEFRU
+ ph(input);
+#endif
+}
+
+static inline void SnefruTransform(PHP_SNEFRU_CTX *context, const unsigned char input[32])
+{
+ int i, j;
+
+ for (i = 0, j = 0; i < 32; i += 4, ++j) {
+ context->state[8+j] = ((input[i] & 0xff) << 24) | ((input[i+1] & 0xff) << 16) |
+ ((input[i+2] & 0xff) << 8) | (input[i+3] & 0xff);
+ }
+ Snefru(context->state);
+ memset(&context->state[8], 0, sizeof(php_hash_uint32) * 8);
+}
+
+PHP_HASH_API void PHP_SNEFRUInit(PHP_SNEFRU_CTX *context)
+{
+ memset(context, 0, sizeof(*context));
+}
+
+static const php_hash_uint32 MAX32 = 0xffffffffLU;
+
+PHP_HASH_API void PHP_SNEFRUUpdate(PHP_SNEFRU_CTX *context, const unsigned char *input, size_t len)
+{
+ if ((MAX32 - context->count[1]) < (len * 8)) {
+ context->count[0]++;
+ context->count[1] = MAX32 - context->count[1];
+ context->count[1] = (len * 8) - context->count[1];
+ } else {
+ context->count[1] += len * 8;
+ }
+
+ if (context->length + len < 32) {
+ memcpy(&context->buffer[context->length], input, len);
+ context->length += len;
+ } else {
+ size_t i = 0, r = (context->length + len) % 32;
+
+ if (context->length) {
+ i = 32 - context->length;
+ memcpy(&context->buffer[context->length], input, i);
+ SnefruTransform(context, context->buffer);
+ }
+
+ for (; i + 32 <= len; i += 32) {
+ SnefruTransform(context, input + i);
+ }
+
+ memcpy(context->buffer, input + i, r);
+ memset(&context->buffer[r], 0, 32 - r);
+ context->length = r;
+ }
+}
+
+PHP_HASH_API void PHP_SNEFRUFinal(unsigned char digest[32], PHP_SNEFRU_CTX *context)
+{
+ php_hash_uint32 i, j;
+
+ if (context->length) {
+ SnefruTransform(context, context->buffer);
+ }
+
+ context->state[14] = context->count[0];
+ context->state[15] = context->count[1];
+ Snefru(context->state);
+
+ for (i = 0, j = 0; j < 32; i++, j += 4) {
+ digest[j] = (unsigned char) ((context->state[i] >> 24) & 0xff);
+ digest[j + 1] = (unsigned char) ((context->state[i] >> 16) & 0xff);
+ digest[j + 2] = (unsigned char) ((context->state[i] >> 8) & 0xff);
+ digest[j + 3] = (unsigned char) (context->state[i] & 0xff);
+ }
+
+ memset(context, 0, sizeof(*context));
+}
+
+const php_hash_ops php_hash_snefru_ops = {
+ (php_hash_init_func_t) PHP_SNEFRUInit,
+ (php_hash_update_func_t) PHP_SNEFRUUpdate,
+ (php_hash_final_func_t) PHP_SNEFRUFinal,
+ (php_hash_copy_func_t) php_hash_copy,
+ 32,
+ 32,
+ sizeof(PHP_SNEFRU_CTX)
+};
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/hash_tiger.c b/ext/hash/hash_tiger.c
new file mode 100644
index 0000000..e6e2692
--- /dev/null
+++ b/ext/hash/hash_tiger.c
@@ -0,0 +1,271 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Michael Wallner <mike@php.net> |
+ | Sara Golemon <pollita@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#include "php_hash.h"
+#include "php_hash_tiger.h"
+#include "php_hash_tiger_tables.h"
+
+#if (defined(__APPLE__) || defined(__APPLE_CC__)) && (defined(__BIG_ENDIAN__) || defined(__LITTLE_ENDIAN__))
+# if defined(__LITTLE_ENDIAN__)
+# undef WORDS_BIGENDIAN
+# else
+# if defined(__BIG_ENDIAN__)
+# define WORDS_BIGENDIAN
+# endif
+# endif
+#endif
+
+/* {{{ */
+#define save_abc \
+ aa = a; \
+ bb = b; \
+ cc = c;
+
+#define round(a,b,c,x,mul) \
+ c ^= x; \
+ a -= t1[(unsigned char)(c)] ^ \
+ t2[(unsigned char)(((php_hash_uint32)(c))>>(2*8))] ^ \
+ t3[(unsigned char)((c)>>(4*8))] ^ \
+ t4[(unsigned char)(((php_hash_uint32)((c)>>(4*8)))>>(2*8))] ; \
+ b += t4[(unsigned char)(((php_hash_uint32)(c))>>(1*8))] ^ \
+ t3[(unsigned char)(((php_hash_uint32)(c))>>(3*8))] ^ \
+ t2[(unsigned char)(((php_hash_uint32)((c)>>(4*8)))>>(1*8))] ^ \
+ t1[(unsigned char)(((php_hash_uint32)((c)>>(4*8)))>>(3*8))]; \
+ b *= mul;
+
+#define pass(a,b,c,mul) \
+ round(a,b,c,x0,mul) \
+ round(b,c,a,x1,mul) \
+ round(c,a,b,x2,mul) \
+ round(a,b,c,x3,mul) \
+ round(b,c,a,x4,mul) \
+ round(c,a,b,x5,mul) \
+ round(a,b,c,x6,mul) \
+ round(b,c,a,x7,mul)
+
+#define key_schedule \
+ x0 -= x7 ^ L64(0xA5A5A5A5A5A5A5A5); \
+ x1 ^= x0; \
+ x2 += x1; \
+ x3 -= x2 ^ ((~x1)<<19); \
+ x4 ^= x3; \
+ x5 += x4; \
+ x6 -= x5 ^ ((~x4)>>23); \
+ x7 ^= x6; \
+ x0 += x7; \
+ x1 -= x0 ^ ((~x7)<<19); \
+ x2 ^= x1; \
+ x3 += x2; \
+ x4 -= x3 ^ ((~x2)>>23); \
+ x5 ^= x4; \
+ x6 += x5; \
+ x7 -= x6 ^ L64(0x0123456789ABCDEF);
+
+#define feedforward \
+ a ^= aa; \
+ b -= bb; \
+ c += cc;
+
+#define compress(passes) \
+ save_abc \
+ pass(a,b,c,5) \
+ key_schedule \
+ pass(c,a,b,7) \
+ key_schedule \
+ pass(b,c,a,9) \
+ for(pass_no=0; pass_no<passes; pass_no++) { \
+ key_schedule \
+ pass(a,b,c,9) \
+ tmpa=a; a=c; c=b; b=tmpa; \
+ } \
+ feedforward
+
+#define split_ex(str) \
+ x0=str[0]; x1=str[1]; x2=str[2]; x3=str[3]; \
+ x4=str[4]; x5=str[5]; x6=str[6]; x7=str[7];
+#ifdef WORDS_BIGENDIAN
+# define split(str) \
+ { \
+ int i; \
+ php_hash_uint64 tmp[8]; \
+ \
+ for (i = 0; i < 64; ++i) { \
+ ((unsigned char *) tmp)[i^7] = ((unsigned char *) str)[i]; \
+ } \
+ split_ex(tmp); \
+ }
+#else
+# define split split_ex
+#endif
+
+#define tiger_compress(passes, str, state) \
+{ \
+ register php_hash_uint64 a, b, c, tmpa, x0, x1, x2, x3, x4, x5, x6, x7; \
+ php_hash_uint64 aa, bb, cc; \
+ unsigned int pass_no; \
+ \
+ a = state[0]; \
+ b = state[1]; \
+ c = state[2]; \
+ \
+ split(str); \
+ \
+ compress(passes); \
+ \
+ state[0] = a; \
+ state[1] = b; \
+ state[2] = c; \
+}
+/* }}} */
+
+static inline void TigerFinalize(PHP_TIGER_CTX *context)
+{
+ context->passed += (php_hash_uint64) context->length << 3;
+
+ context->buffer[context->length++] = 0x1;
+ if (context->length % 8) {
+ memset(&context->buffer[context->length], 0, 8-context->length%8);
+ context->length += 8-context->length%8;
+ }
+
+ if (context->length > 56) {
+ memset(&context->buffer[context->length], 0, 64 - context->length);
+ tiger_compress(context->passes, ((php_hash_uint64 *) context->buffer), context->state);
+ memset(context->buffer, 0, 56);
+ } else {
+ memset(&context->buffer[context->length], 0, 56 - context->length);
+ }
+
+#ifndef WORDS_BIGENDIAN
+ memcpy(&context->buffer[56], &context->passed, sizeof(php_hash_uint64));
+#else
+ context->buffer[56] = (unsigned char) (context->passed & 0xff);
+ context->buffer[57] = (unsigned char) ((context->passed >> 8) & 0xff);
+ context->buffer[58] = (unsigned char) ((context->passed >> 16) & 0xff);
+ context->buffer[59] = (unsigned char) ((context->passed >> 24) & 0xff);
+ context->buffer[60] = (unsigned char) ((context->passed >> 32) & 0xff);
+ context->buffer[61] = (unsigned char) ((context->passed >> 40) & 0xff);
+ context->buffer[62] = (unsigned char) ((context->passed >> 48) & 0xff);
+ context->buffer[63] = (unsigned char) ((context->passed >> 56) & 0xff);
+#endif
+ tiger_compress(context->passes, ((php_hash_uint64 *) context->buffer), context->state);
+}
+
+static inline void TigerDigest(unsigned char *digest_str, unsigned int digest_len, PHP_TIGER_CTX *context)
+{
+ unsigned int i;
+
+ for (i = 0; i < digest_len; ++i) {
+ digest_str[i] = (unsigned char) ((context->state[i/8] >> (8 * (i%8))) & 0xff);
+ }
+}
+
+PHP_HASH_API void PHP_3TIGERInit(PHP_TIGER_CTX *context)
+{
+ memset(context, 0, sizeof(*context));
+ context->state[0] = L64(0x0123456789ABCDEF);
+ context->state[1] = L64(0xFEDCBA9876543210);
+ context->state[2] = L64(0xF096A5B4C3B2E187);
+}
+
+PHP_HASH_API void PHP_4TIGERInit(PHP_TIGER_CTX *context)
+{
+ memset(context, 0, sizeof(*context));
+ context->passes = 1;
+ context->state[0] = L64(0x0123456789ABCDEF);
+ context->state[1] = L64(0xFEDCBA9876543210);
+ context->state[2] = L64(0xF096A5B4C3B2E187);
+}
+
+PHP_HASH_API void PHP_TIGERUpdate(PHP_TIGER_CTX *context, const unsigned char *input, size_t len)
+{
+ if (context->length + len < 64) {
+ memcpy(&context->buffer[context->length], input, len);
+ context->length += len;
+ } else {
+ size_t i = 0, r = (context->length + len) % 64;
+
+ if (context->length) {
+ i = 64 - context->length;
+ memcpy(&context->buffer[context->length], input, i);
+ tiger_compress(context->passes, ((const php_hash_uint64 *) context->buffer), context->state);
+ memset(context->buffer, 0, 64);
+ context->passed += 512;
+ }
+
+ for (; i + 64 <= len; i += 64) {
+ memcpy(context->buffer, &input[i], 64);
+ tiger_compress(context->passes, ((const php_hash_uint64 *) context->buffer), context->state);
+ context->passed += 512;
+ }
+ memset(&context->buffer[r], 0, 64-r);
+ memcpy(context->buffer, &input[i], r);
+ context->length = r;
+ }
+}
+
+PHP_HASH_API void PHP_TIGER128Final(unsigned char digest[16], PHP_TIGER_CTX *context)
+{
+ TigerFinalize(context);
+ TigerDigest(digest, 16, context);
+ memset(context, 0, sizeof(*context));
+}
+
+PHP_HASH_API void PHP_TIGER160Final(unsigned char digest[20], PHP_TIGER_CTX *context)
+{
+ TigerFinalize(context);
+ TigerDigest(digest, 20, context);
+ memset(context, 0, sizeof(*context));
+}
+
+PHP_HASH_API void PHP_TIGER192Final(unsigned char digest[24], PHP_TIGER_CTX *context)
+{
+ TigerFinalize(context);
+ TigerDigest(digest, 24, context);
+ memset(context, 0, sizeof(*context));
+}
+
+#define PHP_HASH_TIGER_OPS(p, b) \
+ const php_hash_ops php_hash_##p##tiger##b##_ops = { \
+ (php_hash_init_func_t) PHP_##p##TIGERInit, \
+ (php_hash_update_func_t) PHP_TIGERUpdate, \
+ (php_hash_final_func_t) PHP_TIGER##b##Final, \
+ (php_hash_copy_func_t) php_hash_copy, \
+ b/8, \
+ 64, \
+ sizeof(PHP_TIGER_CTX) \
+ }
+
+PHP_HASH_TIGER_OPS(3, 128);
+PHP_HASH_TIGER_OPS(3, 160);
+PHP_HASH_TIGER_OPS(3, 192);
+PHP_HASH_TIGER_OPS(4, 128);
+PHP_HASH_TIGER_OPS(4, 160);
+PHP_HASH_TIGER_OPS(4, 192);
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/hash_whirlpool.c b/ext/hash/hash_whirlpool.c
new file mode 100644
index 0000000..6fde452
--- /dev/null
+++ b/ext/hash/hash_whirlpool.c
@@ -0,0 +1,453 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Michael Wallner <mike@php.net> |
+ | Sara Golemon <pollita@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#include "php_hash.h"
+
+/*
+ * TODO: simplify Update and Final, those look ridiculously complex
+ * Mike, 2005-11-23
+ */
+
+#include "php_hash_whirlpool.h"
+#include "php_hash_whirlpool_tables.h"
+
+#define DIGESTBYTES 64
+#define DIGESTBITS (8*DIGESTBYTES) /* 512 */
+
+#define WBLOCKBYTES 64
+#define WBLOCKBITS (8*WBLOCKBYTES) /* 512 */
+
+#define LENGTHBYTES 32
+#define LENGTHBITS (8*LENGTHBYTES) /* 256 */
+
+static void WhirlpoolTransform(PHP_WHIRLPOOL_CTX *context)
+{
+ int i, r;
+ php_hash_uint64 K[8]; /* the round key */
+ php_hash_uint64 block[8]; /* mu(buffer) */
+ php_hash_uint64 state[8]; /* the cipher state */
+ php_hash_uint64 L[8];
+ unsigned char *buffer = context->buffer.data;
+
+ /*
+ * map the buffer to a block:
+ */
+ for (i = 0; i < 8; i++, buffer += 8) {
+ block[i] =
+ (((php_hash_uint64)buffer[0] ) << 56) ^
+ (((php_hash_uint64)buffer[1] & 0xffL) << 48) ^
+ (((php_hash_uint64)buffer[2] & 0xffL) << 40) ^
+ (((php_hash_uint64)buffer[3] & 0xffL) << 32) ^
+ (((php_hash_uint64)buffer[4] & 0xffL) << 24) ^
+ (((php_hash_uint64)buffer[5] & 0xffL) << 16) ^
+ (((php_hash_uint64)buffer[6] & 0xffL) << 8) ^
+ (((php_hash_uint64)buffer[7] & 0xffL) );
+ }
+ /*
+ * compute and apply K^0 to the cipher state:
+ */
+ state[0] = block[0] ^ (K[0] = context->state[0]);
+ state[1] = block[1] ^ (K[1] = context->state[1]);
+ state[2] = block[2] ^ (K[2] = context->state[2]);
+ state[3] = block[3] ^ (K[3] = context->state[3]);
+ state[4] = block[4] ^ (K[4] = context->state[4]);
+ state[5] = block[5] ^ (K[5] = context->state[5]);
+ state[6] = block[6] ^ (K[6] = context->state[6]);
+ state[7] = block[7] ^ (K[7] = context->state[7]);
+ /*
+ * iterate over all rounds:
+ */
+ for (r = 1; r <= R; r++) {
+ /*
+ * compute K^r from K^{r-1}:
+ */
+ L[0] =
+ C0[(int)(K[0] >> 56) ] ^
+ C1[(int)(K[7] >> 48) & 0xff] ^
+ C2[(int)(K[6] >> 40) & 0xff] ^
+ C3[(int)(K[5] >> 32) & 0xff] ^
+ C4[(int)(K[4] >> 24) & 0xff] ^
+ C5[(int)(K[3] >> 16) & 0xff] ^
+ C6[(int)(K[2] >> 8) & 0xff] ^
+ C7[(int)(K[1] ) & 0xff] ^
+ rc[r];
+ L[1] =
+ C0[(int)(K[1] >> 56) ] ^
+ C1[(int)(K[0] >> 48) & 0xff] ^
+ C2[(int)(K[7] >> 40) & 0xff] ^
+ C3[(int)(K[6] >> 32) & 0xff] ^
+ C4[(int)(K[5] >> 24) & 0xff] ^
+ C5[(int)(K[4] >> 16) & 0xff] ^
+ C6[(int)(K[3] >> 8) & 0xff] ^
+ C7[(int)(K[2] ) & 0xff];
+ L[2] =
+ C0[(int)(K[2] >> 56) ] ^
+ C1[(int)(K[1] >> 48) & 0xff] ^
+ C2[(int)(K[0] >> 40) & 0xff] ^
+ C3[(int)(K[7] >> 32) & 0xff] ^
+ C4[(int)(K[6] >> 24) & 0xff] ^
+ C5[(int)(K[5] >> 16) & 0xff] ^
+ C6[(int)(K[4] >> 8) & 0xff] ^
+ C7[(int)(K[3] ) & 0xff];
+ L[3] =
+ C0[(int)(K[3] >> 56) ] ^
+ C1[(int)(K[2] >> 48) & 0xff] ^
+ C2[(int)(K[1] >> 40) & 0xff] ^
+ C3[(int)(K[0] >> 32) & 0xff] ^
+ C4[(int)(K[7] >> 24) & 0xff] ^
+ C5[(int)(K[6] >> 16) & 0xff] ^
+ C6[(int)(K[5] >> 8) & 0xff] ^
+ C7[(int)(K[4] ) & 0xff];
+ L[4] =
+ C0[(int)(K[4] >> 56) ] ^
+ C1[(int)(K[3] >> 48) & 0xff] ^
+ C2[(int)(K[2] >> 40) & 0xff] ^
+ C3[(int)(K[1] >> 32) & 0xff] ^
+ C4[(int)(K[0] >> 24) & 0xff] ^
+ C5[(int)(K[7] >> 16) & 0xff] ^
+ C6[(int)(K[6] >> 8) & 0xff] ^
+ C7[(int)(K[5] ) & 0xff];
+ L[5] =
+ C0[(int)(K[5] >> 56) ] ^
+ C1[(int)(K[4] >> 48) & 0xff] ^
+ C2[(int)(K[3] >> 40) & 0xff] ^
+ C3[(int)(K[2] >> 32) & 0xff] ^
+ C4[(int)(K[1] >> 24) & 0xff] ^
+ C5[(int)(K[0] >> 16) & 0xff] ^
+ C6[(int)(K[7] >> 8) & 0xff] ^
+ C7[(int)(K[6] ) & 0xff];
+ L[6] =
+ C0[(int)(K[6] >> 56) ] ^
+ C1[(int)(K[5] >> 48) & 0xff] ^
+ C2[(int)(K[4] >> 40) & 0xff] ^
+ C3[(int)(K[3] >> 32) & 0xff] ^
+ C4[(int)(K[2] >> 24) & 0xff] ^
+ C5[(int)(K[1] >> 16) & 0xff] ^
+ C6[(int)(K[0] >> 8) & 0xff] ^
+ C7[(int)(K[7] ) & 0xff];
+ L[7] =
+ C0[(int)(K[7] >> 56) ] ^
+ C1[(int)(K[6] >> 48) & 0xff] ^
+ C2[(int)(K[5] >> 40) & 0xff] ^
+ C3[(int)(K[4] >> 32) & 0xff] ^
+ C4[(int)(K[3] >> 24) & 0xff] ^
+ C5[(int)(K[2] >> 16) & 0xff] ^
+ C6[(int)(K[1] >> 8) & 0xff] ^
+ C7[(int)(K[0] ) & 0xff];
+ K[0] = L[0];
+ K[1] = L[1];
+ K[2] = L[2];
+ K[3] = L[3];
+ K[4] = L[4];
+ K[5] = L[5];
+ K[6] = L[6];
+ K[7] = L[7];
+ /*
+ * apply the r-th round transformation:
+ */
+ L[0] =
+ C0[(int)(state[0] >> 56) ] ^
+ C1[(int)(state[7] >> 48) & 0xff] ^
+ C2[(int)(state[6] >> 40) & 0xff] ^
+ C3[(int)(state[5] >> 32) & 0xff] ^
+ C4[(int)(state[4] >> 24) & 0xff] ^
+ C5[(int)(state[3] >> 16) & 0xff] ^
+ C6[(int)(state[2] >> 8) & 0xff] ^
+ C7[(int)(state[1] ) & 0xff] ^
+ K[0];
+ L[1] =
+ C0[(int)(state[1] >> 56) ] ^
+ C1[(int)(state[0] >> 48) & 0xff] ^
+ C2[(int)(state[7] >> 40) & 0xff] ^
+ C3[(int)(state[6] >> 32) & 0xff] ^
+ C4[(int)(state[5] >> 24) & 0xff] ^
+ C5[(int)(state[4] >> 16) & 0xff] ^
+ C6[(int)(state[3] >> 8) & 0xff] ^
+ C7[(int)(state[2] ) & 0xff] ^
+ K[1];
+ L[2] =
+ C0[(int)(state[2] >> 56) ] ^
+ C1[(int)(state[1] >> 48) & 0xff] ^
+ C2[(int)(state[0] >> 40) & 0xff] ^
+ C3[(int)(state[7] >> 32) & 0xff] ^
+ C4[(int)(state[6] >> 24) & 0xff] ^
+ C5[(int)(state[5] >> 16) & 0xff] ^
+ C6[(int)(state[4] >> 8) & 0xff] ^
+ C7[(int)(state[3] ) & 0xff] ^
+ K[2];
+ L[3] =
+ C0[(int)(state[3] >> 56) ] ^
+ C1[(int)(state[2] >> 48) & 0xff] ^
+ C2[(int)(state[1] >> 40) & 0xff] ^
+ C3[(int)(state[0] >> 32) & 0xff] ^
+ C4[(int)(state[7] >> 24) & 0xff] ^
+ C5[(int)(state[6] >> 16) & 0xff] ^
+ C6[(int)(state[5] >> 8) & 0xff] ^
+ C7[(int)(state[4] ) & 0xff] ^
+ K[3];
+ L[4] =
+ C0[(int)(state[4] >> 56) ] ^
+ C1[(int)(state[3] >> 48) & 0xff] ^
+ C2[(int)(state[2] >> 40) & 0xff] ^
+ C3[(int)(state[1] >> 32) & 0xff] ^
+ C4[(int)(state[0] >> 24) & 0xff] ^
+ C5[(int)(state[7] >> 16) & 0xff] ^
+ C6[(int)(state[6] >> 8) & 0xff] ^
+ C7[(int)(state[5] ) & 0xff] ^
+ K[4];
+ L[5] =
+ C0[(int)(state[5] >> 56) ] ^
+ C1[(int)(state[4] >> 48) & 0xff] ^
+ C2[(int)(state[3] >> 40) & 0xff] ^
+ C3[(int)(state[2] >> 32) & 0xff] ^
+ C4[(int)(state[1] >> 24) & 0xff] ^
+ C5[(int)(state[0] >> 16) & 0xff] ^
+ C6[(int)(state[7] >> 8) & 0xff] ^
+ C7[(int)(state[6] ) & 0xff] ^
+ K[5];
+ L[6] =
+ C0[(int)(state[6] >> 56) ] ^
+ C1[(int)(state[5] >> 48) & 0xff] ^
+ C2[(int)(state[4] >> 40) & 0xff] ^
+ C3[(int)(state[3] >> 32) & 0xff] ^
+ C4[(int)(state[2] >> 24) & 0xff] ^
+ C5[(int)(state[1] >> 16) & 0xff] ^
+ C6[(int)(state[0] >> 8) & 0xff] ^
+ C7[(int)(state[7] ) & 0xff] ^
+ K[6];
+ L[7] =
+ C0[(int)(state[7] >> 56) ] ^
+ C1[(int)(state[6] >> 48) & 0xff] ^
+ C2[(int)(state[5] >> 40) & 0xff] ^
+ C3[(int)(state[4] >> 32) & 0xff] ^
+ C4[(int)(state[3] >> 24) & 0xff] ^
+ C5[(int)(state[2] >> 16) & 0xff] ^
+ C6[(int)(state[1] >> 8) & 0xff] ^
+ C7[(int)(state[0] ) & 0xff] ^
+ K[7];
+ state[0] = L[0];
+ state[1] = L[1];
+ state[2] = L[2];
+ state[3] = L[3];
+ state[4] = L[4];
+ state[5] = L[5];
+ state[6] = L[6];
+ state[7] = L[7];
+ }
+ /*
+ * apply the Miyaguchi-Preneel compression function:
+ */
+ context->state[0] ^= state[0] ^ block[0];
+ context->state[1] ^= state[1] ^ block[1];
+ context->state[2] ^= state[2] ^ block[2];
+ context->state[3] ^= state[3] ^ block[3];
+ context->state[4] ^= state[4] ^ block[4];
+ context->state[5] ^= state[5] ^ block[5];
+ context->state[6] ^= state[6] ^ block[6];
+ context->state[7] ^= state[7] ^ block[7];
+
+ memset(state, 0, sizeof(state));
+}
+
+PHP_HASH_API void PHP_WHIRLPOOLInit(PHP_WHIRLPOOL_CTX *context)
+{
+ memset(context, 0, sizeof(*context));
+}
+
+PHP_HASH_API void PHP_WHIRLPOOLUpdate(PHP_WHIRLPOOL_CTX *context, const unsigned char *input, size_t len)
+{
+ php_hash_uint64 sourceBits = len * 8;
+ int sourcePos = 0; /* index of leftmost source unsigned char containing data (1 to 8 bits). */
+ int sourceGap = (8 - ((int)sourceBits & 7)) & 7; /* space on source[sourcePos]. */
+ int bufferRem = context->buffer.bits & 7; /* occupied bits on buffer[bufferPos]. */
+ const unsigned char *source = input;
+ unsigned char *buffer = context->buffer.data;
+ unsigned char *bitLength = context->bitlength;
+ int bufferBits = context->buffer.bits;
+ int bufferPos = context->buffer.pos;
+ php_hash_uint32 b, carry;
+ int i;
+
+ /*
+ * tally the length of the added data:
+ */
+ php_hash_uint64 value = sourceBits;
+ for (i = 31, carry = 0; i >= 0 && (carry != 0 || value != L64(0)); i--) {
+ carry += bitLength[i] + ((php_hash_uint32)value & 0xff);
+ bitLength[i] = (unsigned char)carry;
+ carry >>= 8;
+ value >>= 8;
+ }
+ /*
+ * process data in chunks of 8 bits (a more efficient approach would be to take whole-word chunks):
+ */
+ while (sourceBits > 8) {
+ /* N.B. at least source[sourcePos] and source[sourcePos+1] contain data. */
+ /*
+ * take a byte from the source:
+ */
+ b = ((source[sourcePos] << sourceGap) & 0xff) |
+ ((source[sourcePos + 1] & 0xff) >> (8 - sourceGap));
+ /*
+ * process this byte:
+ */
+ buffer[bufferPos++] |= (unsigned char)(b >> bufferRem);
+ bufferBits += 8 - bufferRem; /* bufferBits = 8*bufferPos; */
+ if (bufferBits == DIGESTBITS) {
+ /*
+ * process data block:
+ */
+ WhirlpoolTransform(context);
+ /*
+ * reset buffer:
+ */
+ bufferBits = bufferPos = 0;
+ }
+ buffer[bufferPos] = (unsigned char) (b << (8 - bufferRem));
+ bufferBits += bufferRem;
+ /*
+ * proceed to remaining data:
+ */
+ sourceBits -= 8;
+ sourcePos++;
+ }
+ /* now 0 <= sourceBits <= 8;
+ * furthermore, all data (if any is left) is in source[sourcePos].
+ */
+ if (sourceBits > 0) {
+ b = (source[sourcePos] << sourceGap) & 0xff; /* bits are left-justified on b. */
+ /*
+ * process the remaining bits:
+ */
+ buffer[bufferPos] |= b >> bufferRem;
+ } else {
+ b = 0;
+ }
+ if (bufferRem + sourceBits < 8) {
+ /*
+ * all remaining data fits on buffer[bufferPos],
+ * and there still remains some space.
+ */
+ bufferBits += (int) sourceBits;
+ } else {
+ /*
+ * buffer[bufferPos] is full:
+ */
+ bufferPos++;
+ bufferBits += 8 - bufferRem; /* bufferBits = 8*bufferPos; */
+ sourceBits -= 8 - bufferRem;
+ /* now 0 <= sourceBits < 8;
+ * furthermore, all data (if any is left) is in source[sourcePos].
+ */
+ if (bufferBits == DIGESTBITS) {
+ /*
+ * process data block:
+ */
+ WhirlpoolTransform(context);
+ /*
+ * reset buffer:
+ */
+ bufferBits = bufferPos = 0;
+ }
+ buffer[bufferPos] = (unsigned char) (b << (8 - bufferRem));
+ bufferBits += (int)sourceBits;
+ }
+ context->buffer.bits = bufferBits;
+ context->buffer.pos = bufferPos;
+}
+
+PHP_HASH_API void PHP_WHIRLPOOLFinal(unsigned char digest[64], PHP_WHIRLPOOL_CTX *context)
+{
+ int i;
+ unsigned char *buffer = context->buffer.data;
+ unsigned char *bitLength = context->bitlength;
+ int bufferBits = context->buffer.bits;
+ int bufferPos = context->buffer.pos;
+
+ /*
+ * append a '1'-bit:
+ */
+ buffer[bufferPos] |= 0x80U >> (bufferBits & 7);
+ bufferPos++; /* all remaining bits on the current unsigned char are set to zero. */
+ /*
+ * pad with zero bits to complete (N*WBLOCKBITS - LENGTHBITS) bits:
+ */
+ if (bufferPos > WBLOCKBYTES - LENGTHBYTES) {
+ if (bufferPos < WBLOCKBYTES) {
+ memset(&buffer[bufferPos], 0, WBLOCKBYTES - bufferPos);
+ }
+ /*
+ * process data block:
+ */
+ WhirlpoolTransform(context);
+ /*
+ * reset buffer:
+ */
+ bufferPos = 0;
+ }
+ if (bufferPos < WBLOCKBYTES - LENGTHBYTES) {
+ memset(&buffer[bufferPos], 0, (WBLOCKBYTES - LENGTHBYTES) - bufferPos);
+ }
+ bufferPos = WBLOCKBYTES - LENGTHBYTES;
+ /*
+ * append bit length of hashed data:
+ */
+ memcpy(&buffer[WBLOCKBYTES - LENGTHBYTES], bitLength, LENGTHBYTES);
+ /*
+ * process data block:
+ */
+ WhirlpoolTransform(context);
+ /*
+ * return the completed message digest:
+ */
+ for (i = 0; i < DIGESTBYTES/8; i++) {
+ digest[0] = (unsigned char)(context->state[i] >> 56);
+ digest[1] = (unsigned char)(context->state[i] >> 48);
+ digest[2] = (unsigned char)(context->state[i] >> 40);
+ digest[3] = (unsigned char)(context->state[i] >> 32);
+ digest[4] = (unsigned char)(context->state[i] >> 24);
+ digest[5] = (unsigned char)(context->state[i] >> 16);
+ digest[6] = (unsigned char)(context->state[i] >> 8);
+ digest[7] = (unsigned char)(context->state[i] );
+ digest += 8;
+ }
+
+ memset(context, 0, sizeof(*context));
+}
+
+const php_hash_ops php_hash_whirlpool_ops = {
+ (php_hash_init_func_t) PHP_WHIRLPOOLInit,
+ (php_hash_update_func_t) PHP_WHIRLPOOLUpdate,
+ (php_hash_final_func_t) PHP_WHIRLPOOLFinal,
+ (php_hash_copy_func_t) php_hash_copy,
+ 64,
+ 64,
+ sizeof(PHP_WHIRLPOOL_CTX)
+};
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/package.xml b/ext/hash/package.xml
new file mode 100644
index 0000000..119cdd6
--- /dev/null
+++ b/ext/hash/package.xml
@@ -0,0 +1,95 @@
+<package version="1.0">
+ <name>hash</name>
+ <summary>pHASH Message Digest Framework</summary>
+ <description>
+ Native implementations of common message digest algorithms using a generic factory method
+ </description>
+ <license>PHP</license>
+ <maintainers>
+ <maintainer>
+ <user>pollita</user>
+ <name>Sara Golemon</name>
+ <email>pollita@php.net</email>
+ <role>lead</role>
+ </maintainer>
+ <maintainer>
+ <user>mike</user>
+ <name>Michael Wallner</name>
+ <email>mike@php.net</email>
+ <role>lead</role>
+ </maintainer>
+ </maintainers>
+
+ <release>
+ <version>1.1</version>
+ <state>stable</state>
+ <date>2005-12-00</date>
+ <notes>
+Fixed PECL bug #6183 - haval source file entries missing in package.xml
+
+Supported Algorithms:
+ * md4, md5
+ * sha1, sha256, sha384, sha512
+ * ripemd128, ripemd160
+ * tiger128, tiger160, tiger192 (3 and 4 passes)
+ * haval128, haval160, haval192, haval224, haval256 (3, 4 and 5 passes)
+ * crc32, crc32b, adler32, gost, snefru, whirlpool
+ </notes>
+ </release>
+
+ <filelist>
+ <file role="src" name="config.m4"/>
+ <file role="src" name="config.w32"/>
+ <file role="src" name="hash.c"/>
+ <file role="src" name="php_hash.h"/>
+ <file role="src" name="php_hash_types.h"/>
+ <file role="src" name="hash_md.c"/>
+ <file role="src" name="php_hash_md.h"/>
+ <file role="src" name="hash_sha.c"/>
+ <file role="src" name="php_hash_sha.h"/>
+ <file role="src" name="hash_ripemd.c"/>
+ <file role="src" name="php_hash_ripemd.h"/>
+ <file role="src" name="hash_whirlpool.c"/>
+ <file role="src" name="php_hash_whirlpool.h"/>
+ <file role="src" name="php_hash_whirlpool_tables.h"/>
+ <file role="src" name="hash_tiger.c"/>
+ <file role="src" name="php_hash_tiger.h"/>
+ <file role="src" name="php_hash_tiger_tables.h"/>
+ <file role="src" name="hash_snefru.c"/>
+ <file role="src" name="php_hash_snefru.h"/>
+ <file role="src" name="php_hash_snefru_tables.h"/>
+ <file role="src" name="hash_gost.c"/>
+ <file role="src" name="php_hash_gost.h"/>
+ <file role="src" name="php_hash_gost_tables.h"/>
+ <file role="src" name="hash_adler32.c"/>
+ <file role="src" name="php_hash_adler32.h"/>
+ <file role="src" name="hash_crc32.c"/>
+ <file role="src" name="php_hash_crc32.h"/>
+ <file role="src" name="php_hash_crc32_tables.h"/>
+ <file role="src" name="hash_haval.c"/>
+ <file role="src" name="php_hash_haval.h"/>
+ <file role="doc" name="README"/>
+ <dir role="test" name="tests">
+ <file role="test" name="hmac-md5.phpt"/>
+ <file role="test" name="md4.phpt"/>
+ <file role="test" name="md5.phpt"/>
+ <file role="test" name="sha1.phpt"/>
+ <file role="test" name="sha256.phpt"/>
+ <file role="test" name="sha384.phpt"/>
+ <file role="test" name="sha512.phpt"/>
+ <file role="test" name="ripemd128.phpt"/>
+ <file role="test" name="ripemd160.phpt"/>
+ <file role="test" name="haval.phpt"/>
+ <file role="test" name="tiger.phpt"/>
+ <file role="test" name="whirlpool.phpt"/>
+ <file role="test" name="gost.phpt"/>
+ <file role="test" name="snefru.phpt"/>
+ <file role="test" name="crc32.phpt"/>
+ <file role="test" name="adler32.phpt"/>
+ </dir>
+ </filelist>
+
+</package>
+<!--
+vim: et ts=1 sw=1
+-->
diff --git a/ext/hash/php_hash.h b/ext/hash/php_hash.h
new file mode 100644
index 0000000..4acf4a4
--- /dev/null
+++ b/ext/hash/php_hash.h
@@ -0,0 +1,156 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Sara Golemon <pollita@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_HASH_H
+#define PHP_HASH_H
+
+#include "php.h"
+#include "php_hash_types.h"
+
+#define PHP_HASH_EXTNAME "hash"
+#define PHP_HASH_EXTVER "1.0"
+#define PHP_HASH_RESNAME "Hash Context"
+
+#define PHP_HASH_HMAC 0x0001
+
+typedef void (*php_hash_init_func_t)(void *context);
+typedef void (*php_hash_update_func_t)(void *context, const unsigned char *buf, unsigned int count);
+typedef void (*php_hash_final_func_t)(unsigned char *digest, void *context);
+typedef int (*php_hash_copy_func_t)(const void *ops, void *orig_context, void *dest_context);
+
+typedef struct _php_hash_ops {
+ php_hash_init_func_t hash_init;
+ php_hash_update_func_t hash_update;
+ php_hash_final_func_t hash_final;
+ php_hash_copy_func_t hash_copy;
+
+ int digest_size;
+ int block_size;
+ int context_size;
+} php_hash_ops;
+
+typedef struct _php_hash_data {
+ const php_hash_ops *ops;
+ void *context;
+
+ long options;
+ unsigned char *key;
+} php_hash_data;
+
+extern const php_hash_ops php_hash_md2_ops;
+extern const php_hash_ops php_hash_md4_ops;
+extern const php_hash_ops php_hash_md5_ops;
+extern const php_hash_ops php_hash_sha1_ops;
+extern const php_hash_ops php_hash_sha224_ops;
+extern const php_hash_ops php_hash_sha256_ops;
+extern const php_hash_ops php_hash_sha384_ops;
+extern const php_hash_ops php_hash_sha512_ops;
+extern const php_hash_ops php_hash_ripemd128_ops;
+extern const php_hash_ops php_hash_ripemd160_ops;
+extern const php_hash_ops php_hash_ripemd256_ops;
+extern const php_hash_ops php_hash_ripemd320_ops;
+extern const php_hash_ops php_hash_whirlpool_ops;
+extern const php_hash_ops php_hash_3tiger128_ops;
+extern const php_hash_ops php_hash_3tiger160_ops;
+extern const php_hash_ops php_hash_3tiger192_ops;
+extern const php_hash_ops php_hash_4tiger128_ops;
+extern const php_hash_ops php_hash_4tiger160_ops;
+extern const php_hash_ops php_hash_4tiger192_ops;
+extern const php_hash_ops php_hash_snefru_ops;
+extern const php_hash_ops php_hash_gost_ops;
+extern const php_hash_ops php_hash_adler32_ops;
+extern const php_hash_ops php_hash_crc32_ops;
+extern const php_hash_ops php_hash_crc32b_ops;
+extern const php_hash_ops php_hash_fnv132_ops;
+extern const php_hash_ops php_hash_fnv164_ops;
+extern const php_hash_ops php_hash_joaat_ops;
+
+#define PHP_HASH_HAVAL_OPS(p,b) extern const php_hash_ops php_hash_##p##haval##b##_ops;
+
+PHP_HASH_HAVAL_OPS(3,128)
+PHP_HASH_HAVAL_OPS(3,160)
+PHP_HASH_HAVAL_OPS(3,192)
+PHP_HASH_HAVAL_OPS(3,224)
+PHP_HASH_HAVAL_OPS(3,256)
+
+PHP_HASH_HAVAL_OPS(4,128)
+PHP_HASH_HAVAL_OPS(4,160)
+PHP_HASH_HAVAL_OPS(4,192)
+PHP_HASH_HAVAL_OPS(4,224)
+PHP_HASH_HAVAL_OPS(4,256)
+
+PHP_HASH_HAVAL_OPS(5,128)
+PHP_HASH_HAVAL_OPS(5,160)
+PHP_HASH_HAVAL_OPS(5,192)
+PHP_HASH_HAVAL_OPS(5,224)
+PHP_HASH_HAVAL_OPS(5,256)
+
+extern zend_module_entry hash_module_entry;
+#define phpext_hash_ptr &hash_module_entry
+
+#ifdef PHP_WIN32
+# define PHP_HASH_API __declspec(dllexport)
+#elif defined(__GNUC__) && __GNUC__ >= 4
+# define PHP_HASH_API __attribute__ ((visibility("default")))
+#else
+# define PHP_HASH_API
+#endif
+
+#ifdef ZTS
+#include "TSRM.h"
+#endif
+
+PHP_FUNCTION(hash);
+PHP_FUNCTION(hash_file);
+PHP_FUNCTION(hash_hmac);
+PHP_FUNCTION(hash_hmac_file);
+PHP_FUNCTION(hash_init);
+PHP_FUNCTION(hash_update);
+PHP_FUNCTION(hash_update_stream);
+PHP_FUNCTION(hash_update_file);
+PHP_FUNCTION(hash_final);
+PHP_FUNCTION(hash_algos);
+
+PHP_HASH_API const php_hash_ops *php_hash_fetch_ops(const char *algo, int algo_len);
+PHP_HASH_API void php_hash_register_algo(const char *algo, const php_hash_ops *ops);
+PHP_HASH_API int php_hash_copy(const void *ops, void *orig_context, void *dest_context);
+
+static inline void php_hash_bin2hex(char *out, const unsigned char *in, int in_len)
+{
+ static const char hexits[17] = "0123456789abcdef";
+ int i;
+
+ for(i = 0; i < in_len; i++) {
+ out[i * 2] = hexits[in[i] >> 4];
+ out[(i * 2) + 1] = hexits[in[i] & 0x0F];
+ }
+}
+
+#endif /* PHP_HASH_H */
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/hash/php_hash_adler32.h b/ext/hash/php_hash_adler32.h
new file mode 100644
index 0000000..789cf18
--- /dev/null
+++ b/ext/hash/php_hash_adler32.h
@@ -0,0 +1,44 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Michael Wallner <mike@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_HASH_ADLER32_H
+#define PHP_HASH_ADLER32_H
+
+#include "ext/standard/basic_functions.h"
+
+typedef struct {
+ php_hash_uint32 state;
+} PHP_ADLER32_CTX;
+
+PHP_HASH_API void PHP_ADLER32Init(PHP_ADLER32_CTX *context);
+PHP_HASH_API void PHP_ADLER32Update(PHP_ADLER32_CTX *context, const unsigned char *input, size_t len);
+PHP_HASH_API void PHP_ADLER32Final(unsigned char digest[4], PHP_ADLER32_CTX *context);
+PHP_HASH_API int PHP_ADLER32Copy(const php_hash_ops *ops, PHP_ADLER32_CTX *orig_context, PHP_ADLER32_CTX *copy_context);
+
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/php_hash_crc32.h b/ext/hash/php_hash_crc32.h
new file mode 100644
index 0000000..111a12f
--- /dev/null
+++ b/ext/hash/php_hash_crc32.h
@@ -0,0 +1,45 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Michael Wallner <mike@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_HASH_CRC32_H
+#define PHP_HASH_CRC32_H
+
+#include "ext/standard/basic_functions.h"
+
+typedef struct {
+ php_hash_uint32 state;
+} PHP_CRC32_CTX;
+
+PHP_HASH_API void PHP_CRC32Init(PHP_CRC32_CTX *context);
+PHP_HASH_API void PHP_CRC32Update(PHP_CRC32_CTX *context, const unsigned char *input, size_t len);
+PHP_HASH_API void PHP_CRC32BUpdate(PHP_CRC32_CTX *context, const unsigned char *input, size_t len);
+PHP_HASH_API void PHP_CRC32Final(unsigned char digest[4], PHP_CRC32_CTX *context);
+PHP_HASH_API int PHP_CRC32Copy(const php_hash_ops *ops, PHP_CRC32_CTX *orig_context, PHP_CRC32_CTX *copy_context);
+
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/php_hash_crc32_tables.h b/ext/hash/php_hash_crc32_tables.h
new file mode 100644
index 0000000..8424a23
--- /dev/null
+++ b/ext/hash/php_hash_crc32_tables.h
@@ -0,0 +1,149 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Michael Wallner <mike@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+static const php_hash_uint32 crc32_table[] = { 0x0,
+ 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
+ 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6,
+ 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
+ 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac,
+ 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f,
+ 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a,
+ 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
+ 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58,
+ 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033,
+ 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe,
+ 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
+ 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4,
+ 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
+ 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5,
+ 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
+ 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07,
+ 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c,
+ 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1,
+ 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
+ 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b,
+ 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698,
+ 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d,
+ 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
+ 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f,
+ 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
+ 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80,
+ 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
+ 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a,
+ 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629,
+ 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c,
+ 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
+ 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e,
+ 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65,
+ 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8,
+ 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
+ 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2,
+ 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
+ 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74,
+ 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
+ 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21,
+ 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a,
+ 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087,
+ 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
+ 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d,
+ 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce,
+ 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb,
+ 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
+ 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09,
+ 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
+ 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf,
+ 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
+};
+
+static const php_hash_uint32 crc32b_table[] = {
+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
+ 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
+ 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
+ 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
+ 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
+ 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
+ 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
+ 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
+ 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
+ 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
+ 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
+ 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
+ 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
+ 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
+ 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
+ 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
+ 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
+ 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
+ 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
+ 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
+ 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
+ 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
+ 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
+ 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
+ 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
+ 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
+ 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
+ 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
+ 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
+ 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
+ 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
+ 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
+ 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
+ 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
+ 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
+ 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
+ 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
+ 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
+ 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
+ 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
+ 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
+ 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
+ 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
+};
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/php_hash_fnv.h b/ext/hash/php_hash_fnv.h
new file mode 100644
index 0000000..3eeb046
--- /dev/null
+++ b/ext/hash/php_hash_fnv.h
@@ -0,0 +1,79 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Michael Maclean <mgdm@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_HASH_FNV_H
+#define PHP_HASH_FNV_H
+
+#define PHP_FNV1_32_INIT ((php_hash_uint32)0x811c9dc5)
+#define PHP_FNV1_32A_INIT PHP_FNV1_32_INIT
+
+#define PHP_FNV_32_PRIME ((php_hash_uint32)0x01000193)
+
+#define PHP_FNV1_64_INIT ((php_hash_uint64)0xcbf29ce484222325ULL)
+#define PHP_FNV1A_64_INIT FNV1_64_INIT
+
+#define PHP_FNV_64_PRIME ((php_hash_uint64)0x100000001b3ULL)
+
+
+/*
+ * hash types
+ */
+enum php_fnv_type {
+ PHP_FNV_NONE = 0, /* invalid FNV hash type */
+ PHP_FNV0_32 = 1, /* FNV-0 32 bit hash */
+ PHP_FNV1_32 = 2, /* FNV-1 32 bit hash */
+ PHP_FNV1a_32 = 3, /* FNV-1a 32 bit hash */
+ PHP_FNV0_64 = 4, /* FNV-0 64 bit hash */
+ PHP_FNV1_64 = 5, /* FNV-1 64 bit hash */
+ PHP_FNV1a_64 = 6, /* FNV-1a 64 bit hash */
+};
+
+typedef struct {
+ php_hash_uint32 state;
+} PHP_FNV132_CTX;
+
+typedef struct {
+ php_hash_uint64 state;
+} PHP_FNV164_CTX;
+
+
+PHP_HASH_API void PHP_FNV132Init(PHP_FNV132_CTX *context);
+PHP_HASH_API void PHP_FNV132Update(PHP_FNV132_CTX *context, const unsigned char *input, unsigned int inputLen);
+PHP_HASH_API void PHP_FNV1a32Update(PHP_FNV132_CTX *context, const unsigned char *input, unsigned int inputLen);
+PHP_HASH_API void PHP_FNV132Final(unsigned char digest[16], PHP_FNV132_CTX * context);
+
+PHP_HASH_API void PHP_FNV164Init(PHP_FNV164_CTX *context);
+PHP_HASH_API void PHP_FNV164Update(PHP_FNV164_CTX *context, const unsigned char *input, unsigned int inputLen);
+PHP_HASH_API void PHP_FNV1a64Update(PHP_FNV164_CTX *context, const unsigned char *input, unsigned int inputLen);
+PHP_HASH_API void PHP_FNV164Final(unsigned char digest[16], PHP_FNV164_CTX * context);
+
+static php_hash_uint32 fnv_32_buf(void *buf, size_t len, php_hash_uint32 hval, int alternate);
+static php_hash_uint64 fnv_64_buf(void *buf, size_t len, php_hash_uint64 hval, int alternate);
+
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/hash/php_hash_gost.h b/ext/hash/php_hash_gost.h
new file mode 100644
index 0000000..6a4af31
--- /dev/null
+++ b/ext/hash/php_hash_gost.h
@@ -0,0 +1,47 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Michael Wallner <mike@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_HASH_GOST_H
+#define PHP_HASH_GOST_H
+
+#include "ext/standard/basic_functions.h"
+
+/* GOST context */
+typedef struct {
+ php_hash_uint32 state[16];
+ php_hash_uint32 count[2];
+ unsigned char length;
+ unsigned char buffer[32];
+} PHP_GOST_CTX;
+
+PHP_HASH_API void PHP_GOSTInit(PHP_GOST_CTX *);
+PHP_HASH_API void PHP_GOSTUpdate(PHP_GOST_CTX *, const unsigned char *, size_t);
+PHP_HASH_API void PHP_GOSTFinal(unsigned char[64], PHP_GOST_CTX *);
+
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/php_hash_gost_tables.h b/ext/hash/php_hash_gost_tables.h
new file mode 100644
index 0000000..5d05e59
--- /dev/null
+++ b/ext/hash/php_hash_gost_tables.h
@@ -0,0 +1,138 @@
+static const php_hash_uint32 tables[4][256] = {
+ { /* table 1 */
+ 0x00072000LU, 0x00075000LU, 0x00074800LU, 0x00071000LU, 0x00076800LU, 0x00074000LU, 0x00070000LU, 0x00077000LU,
+ 0x00073000LU, 0x00075800LU, 0x00070800LU, 0x00076000LU, 0x00073800LU, 0x00077800LU, 0x00072800LU, 0x00071800LU,
+ 0x0005A000LU, 0x0005D000LU, 0x0005C800LU, 0x00059000LU, 0x0005E800LU, 0x0005C000LU, 0x00058000LU, 0x0005F000LU,
+ 0x0005B000LU, 0x0005D800LU, 0x00058800LU, 0x0005E000LU, 0x0005B800LU, 0x0005F800LU, 0x0005A800LU, 0x00059800LU,
+ 0x00022000LU, 0x00025000LU, 0x00024800LU, 0x00021000LU, 0x00026800LU, 0x00024000LU, 0x00020000LU, 0x00027000LU,
+ 0x00023000LU, 0x00025800LU, 0x00020800LU, 0x00026000LU, 0x00023800LU, 0x00027800LU, 0x00022800LU, 0x00021800LU,
+ 0x00062000LU, 0x00065000LU, 0x00064800LU, 0x00061000LU, 0x00066800LU, 0x00064000LU, 0x00060000LU, 0x00067000LU,
+ 0x00063000LU, 0x00065800LU, 0x00060800LU, 0x00066000LU, 0x00063800LU, 0x00067800LU, 0x00062800LU, 0x00061800LU,
+ 0x00032000LU, 0x00035000LU, 0x00034800LU, 0x00031000LU, 0x00036800LU, 0x00034000LU, 0x00030000LU, 0x00037000LU,
+ 0x00033000LU, 0x00035800LU, 0x00030800LU, 0x00036000LU, 0x00033800LU, 0x00037800LU, 0x00032800LU, 0x00031800LU,
+ 0x0006A000LU, 0x0006D000LU, 0x0006C800LU, 0x00069000LU, 0x0006E800LU, 0x0006C000LU, 0x00068000LU, 0x0006F000LU,
+ 0x0006B000LU, 0x0006D800LU, 0x00068800LU, 0x0006E000LU, 0x0006B800LU, 0x0006F800LU, 0x0006A800LU, 0x00069800LU,
+ 0x0007A000LU, 0x0007D000LU, 0x0007C800LU, 0x00079000LU, 0x0007E800LU, 0x0007C000LU, 0x00078000LU, 0x0007F000LU,
+ 0x0007B000LU, 0x0007D800LU, 0x00078800LU, 0x0007E000LU, 0x0007B800LU, 0x0007F800LU, 0x0007A800LU, 0x00079800LU,
+ 0x00052000LU, 0x00055000LU, 0x00054800LU, 0x00051000LU, 0x00056800LU, 0x00054000LU, 0x00050000LU, 0x00057000LU,
+ 0x00053000LU, 0x00055800LU, 0x00050800LU, 0x00056000LU, 0x00053800LU, 0x00057800LU, 0x00052800LU, 0x00051800LU,
+ 0x00012000LU, 0x00015000LU, 0x00014800LU, 0x00011000LU, 0x00016800LU, 0x00014000LU, 0x00010000LU, 0x00017000LU,
+ 0x00013000LU, 0x00015800LU, 0x00010800LU, 0x00016000LU, 0x00013800LU, 0x00017800LU, 0x00012800LU, 0x00011800LU,
+ 0x0001A000LU, 0x0001D000LU, 0x0001C800LU, 0x00019000LU, 0x0001E800LU, 0x0001C000LU, 0x00018000LU, 0x0001F000LU,
+ 0x0001B000LU, 0x0001D800LU, 0x00018800LU, 0x0001E000LU, 0x0001B800LU, 0x0001F800LU, 0x0001A800LU, 0x00019800LU,
+ 0x00042000LU, 0x00045000LU, 0x00044800LU, 0x00041000LU, 0x00046800LU, 0x00044000LU, 0x00040000LU, 0x00047000LU,
+ 0x00043000LU, 0x00045800LU, 0x00040800LU, 0x00046000LU, 0x00043800LU, 0x00047800LU, 0x00042800LU, 0x00041800LU,
+ 0x0000A000LU, 0x0000D000LU, 0x0000C800LU, 0x00009000LU, 0x0000E800LU, 0x0000C000LU, 0x00008000LU, 0x0000F000LU,
+ 0x0000B000LU, 0x0000D800LU, 0x00008800LU, 0x0000E000LU, 0x0000B800LU, 0x0000F800LU, 0x0000A800LU, 0x00009800LU,
+ 0x00002000LU, 0x00005000LU, 0x00004800LU, 0x00001000LU, 0x00006800LU, 0x00004000LU, 0x00000000LU, 0x00007000LU,
+ 0x00003000LU, 0x00005800LU, 0x00000800LU, 0x00006000LU, 0x00003800LU, 0x00007800LU, 0x00002800LU, 0x00001800LU,
+ 0x0003A000LU, 0x0003D000LU, 0x0003C800LU, 0x00039000LU, 0x0003E800LU, 0x0003C000LU, 0x00038000LU, 0x0003F000LU,
+ 0x0003B000LU, 0x0003D800LU, 0x00038800LU, 0x0003E000LU, 0x0003B800LU, 0x0003F800LU, 0x0003A800LU, 0x00039800LU,
+ 0x0002A000LU, 0x0002D000LU, 0x0002C800LU, 0x00029000LU, 0x0002E800LU, 0x0002C000LU, 0x00028000LU, 0x0002F000LU,
+ 0x0002B000LU, 0x0002D800LU, 0x00028800LU, 0x0002E000LU, 0x0002B800LU, 0x0002F800LU, 0x0002A800LU, 0x00029800LU,
+ 0x0004A000LU, 0x0004D000LU, 0x0004C800LU, 0x00049000LU, 0x0004E800LU, 0x0004C000LU, 0x00048000LU, 0x0004F000LU,
+ 0x0004B000LU, 0x0004D800LU, 0x00048800LU, 0x0004E000LU, 0x0004B800LU, 0x0004F800LU, 0x0004A800LU, 0x00049800LU,
+ },
+ { /* table 2 */
+ 0x03A80000LU, 0x03C00000LU, 0x03880000LU, 0x03E80000LU, 0x03D00000LU, 0x03980000LU, 0x03A00000LU, 0x03900000LU,
+ 0x03F00000LU, 0x03F80000LU, 0x03E00000LU, 0x03B80000LU, 0x03B00000LU, 0x03800000LU, 0x03C80000LU, 0x03D80000LU,
+ 0x06A80000LU, 0x06C00000LU, 0x06880000LU, 0x06E80000LU, 0x06D00000LU, 0x06980000LU, 0x06A00000LU, 0x06900000LU,
+ 0x06F00000LU, 0x06F80000LU, 0x06E00000LU, 0x06B80000LU, 0x06B00000LU, 0x06800000LU, 0x06C80000LU, 0x06D80000LU,
+ 0x05280000LU, 0x05400000LU, 0x05080000LU, 0x05680000LU, 0x05500000LU, 0x05180000LU, 0x05200000LU, 0x05100000LU,
+ 0x05700000LU, 0x05780000LU, 0x05600000LU, 0x05380000LU, 0x05300000LU, 0x05000000LU, 0x05480000LU, 0x05580000LU,
+ 0x00A80000LU, 0x00C00000LU, 0x00880000LU, 0x00E80000LU, 0x00D00000LU, 0x00980000LU, 0x00A00000LU, 0x00900000LU,
+ 0x00F00000LU, 0x00F80000LU, 0x00E00000LU, 0x00B80000LU, 0x00B00000LU, 0x00800000LU, 0x00C80000LU, 0x00D80000LU,
+ 0x00280000LU, 0x00400000LU, 0x00080000LU, 0x00680000LU, 0x00500000LU, 0x00180000LU, 0x00200000LU, 0x00100000LU,
+ 0x00700000LU, 0x00780000LU, 0x00600000LU, 0x00380000LU, 0x00300000LU, 0x00000000LU, 0x00480000LU, 0x00580000LU,
+ 0x04280000LU, 0x04400000LU, 0x04080000LU, 0x04680000LU, 0x04500000LU, 0x04180000LU, 0x04200000LU, 0x04100000LU,
+ 0x04700000LU, 0x04780000LU, 0x04600000LU, 0x04380000LU, 0x04300000LU, 0x04000000LU, 0x04480000LU, 0x04580000LU,
+ 0x04A80000LU, 0x04C00000LU, 0x04880000LU, 0x04E80000LU, 0x04D00000LU, 0x04980000LU, 0x04A00000LU, 0x04900000LU,
+ 0x04F00000LU, 0x04F80000LU, 0x04E00000LU, 0x04B80000LU, 0x04B00000LU, 0x04800000LU, 0x04C80000LU, 0x04D80000LU,
+ 0x07A80000LU, 0x07C00000LU, 0x07880000LU, 0x07E80000LU, 0x07D00000LU, 0x07980000LU, 0x07A00000LU, 0x07900000LU,
+ 0x07F00000LU, 0x07F80000LU, 0x07E00000LU, 0x07B80000LU, 0x07B00000LU, 0x07800000LU, 0x07C80000LU, 0x07D80000LU,
+ 0x07280000LU, 0x07400000LU, 0x07080000LU, 0x07680000LU, 0x07500000LU, 0x07180000LU, 0x07200000LU, 0x07100000LU,
+ 0x07700000LU, 0x07780000LU, 0x07600000LU, 0x07380000LU, 0x07300000LU, 0x07000000LU, 0x07480000LU, 0x07580000LU,
+ 0x02280000LU, 0x02400000LU, 0x02080000LU, 0x02680000LU, 0x02500000LU, 0x02180000LU, 0x02200000LU, 0x02100000LU,
+ 0x02700000LU, 0x02780000LU, 0x02600000LU, 0x02380000LU, 0x02300000LU, 0x02000000LU, 0x02480000LU, 0x02580000LU,
+ 0x03280000LU, 0x03400000LU, 0x03080000LU, 0x03680000LU, 0x03500000LU, 0x03180000LU, 0x03200000LU, 0x03100000LU,
+ 0x03700000LU, 0x03780000LU, 0x03600000LU, 0x03380000LU, 0x03300000LU, 0x03000000LU, 0x03480000LU, 0x03580000LU,
+ 0x06280000LU, 0x06400000LU, 0x06080000LU, 0x06680000LU, 0x06500000LU, 0x06180000LU, 0x06200000LU, 0x06100000LU,
+ 0x06700000LU, 0x06780000LU, 0x06600000LU, 0x06380000LU, 0x06300000LU, 0x06000000LU, 0x06480000LU, 0x06580000LU,
+ 0x05A80000LU, 0x05C00000LU, 0x05880000LU, 0x05E80000LU, 0x05D00000LU, 0x05980000LU, 0x05A00000LU, 0x05900000LU,
+ 0x05F00000LU, 0x05F80000LU, 0x05E00000LU, 0x05B80000LU, 0x05B00000LU, 0x05800000LU, 0x05C80000LU, 0x05D80000LU,
+ 0x01280000LU, 0x01400000LU, 0x01080000LU, 0x01680000LU, 0x01500000LU, 0x01180000LU, 0x01200000LU, 0x01100000LU,
+ 0x01700000LU, 0x01780000LU, 0x01600000LU, 0x01380000LU, 0x01300000LU, 0x01000000LU, 0x01480000LU, 0x01580000LU,
+ 0x02A80000LU, 0x02C00000LU, 0x02880000LU, 0x02E80000LU, 0x02D00000LU, 0x02980000LU, 0x02A00000LU, 0x02900000LU,
+ 0x02F00000LU, 0x02F80000LU, 0x02E00000LU, 0x02B80000LU, 0x02B00000LU, 0x02800000LU, 0x02C80000LU, 0x02D80000LU,
+ 0x01A80000LU, 0x01C00000LU, 0x01880000LU, 0x01E80000LU, 0x01D00000LU, 0x01980000LU, 0x01A00000LU, 0x01900000LU,
+ 0x01F00000LU, 0x01F80000LU, 0x01E00000LU, 0x01B80000LU, 0x01B00000LU, 0x01800000LU, 0x01C80000LU, 0x01D80000LU,
+ },
+ { /* table 3 */
+ 0x30000002LU, 0x60000002LU, 0x38000002LU, 0x08000002LU, 0x28000002LU, 0x78000002LU, 0x68000002LU, 0x40000002LU,
+ 0x20000002LU, 0x50000002LU, 0x48000002LU, 0x70000002LU, 0x00000002LU, 0x18000002LU, 0x58000002LU, 0x10000002LU,
+ 0xB0000005LU, 0xE0000005LU, 0xB8000005LU, 0x88000005LU, 0xA8000005LU, 0xF8000005LU, 0xE8000005LU, 0xC0000005LU,
+ 0xA0000005LU, 0xD0000005LU, 0xC8000005LU, 0xF0000005LU, 0x80000005LU, 0x98000005LU, 0xD8000005LU, 0x90000005LU,
+ 0x30000005LU, 0x60000005LU, 0x38000005LU, 0x08000005LU, 0x28000005LU, 0x78000005LU, 0x68000005LU, 0x40000005LU,
+ 0x20000005LU, 0x50000005LU, 0x48000005LU, 0x70000005LU, 0x00000005LU, 0x18000005LU, 0x58000005LU, 0x10000005LU,
+ 0x30000000LU, 0x60000000LU, 0x38000000LU, 0x08000000LU, 0x28000000LU, 0x78000000LU, 0x68000000LU, 0x40000000LU,
+ 0x20000000LU, 0x50000000LU, 0x48000000LU, 0x70000000LU, 0x00000000LU, 0x18000000LU, 0x58000000LU, 0x10000000LU,
+ 0xB0000003LU, 0xE0000003LU, 0xB8000003LU, 0x88000003LU, 0xA8000003LU, 0xF8000003LU, 0xE8000003LU, 0xC0000003LU,
+ 0xA0000003LU, 0xD0000003LU, 0xC8000003LU, 0xF0000003LU, 0x80000003LU, 0x98000003LU, 0xD8000003LU, 0x90000003LU,
+ 0x30000001LU, 0x60000001LU, 0x38000001LU, 0x08000001LU, 0x28000001LU, 0x78000001LU, 0x68000001LU, 0x40000001LU,
+ 0x20000001LU, 0x50000001LU, 0x48000001LU, 0x70000001LU, 0x00000001LU, 0x18000001LU, 0x58000001LU, 0x10000001LU,
+ 0xB0000000LU, 0xE0000000LU, 0xB8000000LU, 0x88000000LU, 0xA8000000LU, 0xF8000000LU, 0xE8000000LU, 0xC0000000LU,
+ 0xA0000000LU, 0xD0000000LU, 0xC8000000LU, 0xF0000000LU, 0x80000000LU, 0x98000000LU, 0xD8000000LU, 0x90000000LU,
+ 0xB0000006LU, 0xE0000006LU, 0xB8000006LU, 0x88000006LU, 0xA8000006LU, 0xF8000006LU, 0xE8000006LU, 0xC0000006LU,
+ 0xA0000006LU, 0xD0000006LU, 0xC8000006LU, 0xF0000006LU, 0x80000006LU, 0x98000006LU, 0xD8000006LU, 0x90000006LU,
+ 0xB0000001LU, 0xE0000001LU, 0xB8000001LU, 0x88000001LU, 0xA8000001LU, 0xF8000001LU, 0xE8000001LU, 0xC0000001LU,
+ 0xA0000001LU, 0xD0000001LU, 0xC8000001LU, 0xF0000001LU, 0x80000001LU, 0x98000001LU, 0xD8000001LU, 0x90000001LU,
+ 0x30000003LU, 0x60000003LU, 0x38000003LU, 0x08000003LU, 0x28000003LU, 0x78000003LU, 0x68000003LU, 0x40000003LU,
+ 0x20000003LU, 0x50000003LU, 0x48000003LU, 0x70000003LU, 0x00000003LU, 0x18000003LU, 0x58000003LU, 0x10000003LU,
+ 0x30000004LU, 0x60000004LU, 0x38000004LU, 0x08000004LU, 0x28000004LU, 0x78000004LU, 0x68000004LU, 0x40000004LU,
+ 0x20000004LU, 0x50000004LU, 0x48000004LU, 0x70000004LU, 0x00000004LU, 0x18000004LU, 0x58000004LU, 0x10000004LU,
+ 0xB0000002LU, 0xE0000002LU, 0xB8000002LU, 0x88000002LU, 0xA8000002LU, 0xF8000002LU, 0xE8000002LU, 0xC0000002LU,
+ 0xA0000002LU, 0xD0000002LU, 0xC8000002LU, 0xF0000002LU, 0x80000002LU, 0x98000002LU, 0xD8000002LU, 0x90000002LU,
+ 0xB0000004LU, 0xE0000004LU, 0xB8000004LU, 0x88000004LU, 0xA8000004LU, 0xF8000004LU, 0xE8000004LU, 0xC0000004LU,
+ 0xA0000004LU, 0xD0000004LU, 0xC8000004LU, 0xF0000004LU, 0x80000004LU, 0x98000004LU, 0xD8000004LU, 0x90000004LU,
+ 0x30000006LU, 0x60000006LU, 0x38000006LU, 0x08000006LU, 0x28000006LU, 0x78000006LU, 0x68000006LU, 0x40000006LU,
+ 0x20000006LU, 0x50000006LU, 0x48000006LU, 0x70000006LU, 0x00000006LU, 0x18000006LU, 0x58000006LU, 0x10000006LU,
+ 0xB0000007LU, 0xE0000007LU, 0xB8000007LU, 0x88000007LU, 0xA8000007LU, 0xF8000007LU, 0xE8000007LU, 0xC0000007LU,
+ 0xA0000007LU, 0xD0000007LU, 0xC8000007LU, 0xF0000007LU, 0x80000007LU, 0x98000007LU, 0xD8000007LU, 0x90000007LU,
+ 0x30000007LU, 0x60000007LU, 0x38000007LU, 0x08000007LU, 0x28000007LU, 0x78000007LU, 0x68000007LU, 0x40000007LU,
+ 0x20000007LU, 0x50000007LU, 0x48000007LU, 0x70000007LU, 0x00000007LU, 0x18000007LU, 0x58000007LU, 0x10000007LU,
+ },
+ { /* table 4 */
+ 0x000000E8LU, 0x000000D8LU, 0x000000A0LU, 0x00000088LU, 0x00000098LU, 0x000000F8LU, 0x000000A8LU, 0x000000C8LU,
+ 0x00000080LU, 0x000000D0LU, 0x000000F0LU, 0x000000B8LU, 0x000000B0LU, 0x000000C0LU, 0x00000090LU, 0x000000E0LU,
+ 0x000007E8LU, 0x000007D8LU, 0x000007A0LU, 0x00000788LU, 0x00000798LU, 0x000007F8LU, 0x000007A8LU, 0x000007C8LU,
+ 0x00000780LU, 0x000007D0LU, 0x000007F0LU, 0x000007B8LU, 0x000007B0LU, 0x000007C0LU, 0x00000790LU, 0x000007E0LU,
+ 0x000006E8LU, 0x000006D8LU, 0x000006A0LU, 0x00000688LU, 0x00000698LU, 0x000006F8LU, 0x000006A8LU, 0x000006C8LU,
+ 0x00000680LU, 0x000006D0LU, 0x000006F0LU, 0x000006B8LU, 0x000006B0LU, 0x000006C0LU, 0x00000690LU, 0x000006E0LU,
+ 0x00000068LU, 0x00000058LU, 0x00000020LU, 0x00000008LU, 0x00000018LU, 0x00000078LU, 0x00000028LU, 0x00000048LU,
+ 0x00000000LU, 0x00000050LU, 0x00000070LU, 0x00000038LU, 0x00000030LU, 0x00000040LU, 0x00000010LU, 0x00000060LU,
+ 0x000002E8LU, 0x000002D8LU, 0x000002A0LU, 0x00000288LU, 0x00000298LU, 0x000002F8LU, 0x000002A8LU, 0x000002C8LU,
+ 0x00000280LU, 0x000002D0LU, 0x000002F0LU, 0x000002B8LU, 0x000002B0LU, 0x000002C0LU, 0x00000290LU, 0x000002E0LU,
+ 0x000003E8LU, 0x000003D8LU, 0x000003A0LU, 0x00000388LU, 0x00000398LU, 0x000003F8LU, 0x000003A8LU, 0x000003C8LU,
+ 0x00000380LU, 0x000003D0LU, 0x000003F0LU, 0x000003B8LU, 0x000003B0LU, 0x000003C0LU, 0x00000390LU, 0x000003E0LU,
+ 0x00000568LU, 0x00000558LU, 0x00000520LU, 0x00000508LU, 0x00000518LU, 0x00000578LU, 0x00000528LU, 0x00000548LU,
+ 0x00000500LU, 0x00000550LU, 0x00000570LU, 0x00000538LU, 0x00000530LU, 0x00000540LU, 0x00000510LU, 0x00000560LU,
+ 0x00000268LU, 0x00000258LU, 0x00000220LU, 0x00000208LU, 0x00000218LU, 0x00000278LU, 0x00000228LU, 0x00000248LU,
+ 0x00000200LU, 0x00000250LU, 0x00000270LU, 0x00000238LU, 0x00000230LU, 0x00000240LU, 0x00000210LU, 0x00000260LU,
+ 0x000004E8LU, 0x000004D8LU, 0x000004A0LU, 0x00000488LU, 0x00000498LU, 0x000004F8LU, 0x000004A8LU, 0x000004C8LU,
+ 0x00000480LU, 0x000004D0LU, 0x000004F0LU, 0x000004B8LU, 0x000004B0LU, 0x000004C0LU, 0x00000490LU, 0x000004E0LU,
+ 0x00000168LU, 0x00000158LU, 0x00000120LU, 0x00000108LU, 0x00000118LU, 0x00000178LU, 0x00000128LU, 0x00000148LU,
+ 0x00000100LU, 0x00000150LU, 0x00000170LU, 0x00000138LU, 0x00000130LU, 0x00000140LU, 0x00000110LU, 0x00000160LU,
+ 0x000001E8LU, 0x000001D8LU, 0x000001A0LU, 0x00000188LU, 0x00000198LU, 0x000001F8LU, 0x000001A8LU, 0x000001C8LU,
+ 0x00000180LU, 0x000001D0LU, 0x000001F0LU, 0x000001B8LU, 0x000001B0LU, 0x000001C0LU, 0x00000190LU, 0x000001E0LU,
+ 0x00000768LU, 0x00000758LU, 0x00000720LU, 0x00000708LU, 0x00000718LU, 0x00000778LU, 0x00000728LU, 0x00000748LU,
+ 0x00000700LU, 0x00000750LU, 0x00000770LU, 0x00000738LU, 0x00000730LU, 0x00000740LU, 0x00000710LU, 0x00000760LU,
+ 0x00000368LU, 0x00000358LU, 0x00000320LU, 0x00000308LU, 0x00000318LU, 0x00000378LU, 0x00000328LU, 0x00000348LU,
+ 0x00000300LU, 0x00000350LU, 0x00000370LU, 0x00000338LU, 0x00000330LU, 0x00000340LU, 0x00000310LU, 0x00000360LU,
+ 0x000005E8LU, 0x000005D8LU, 0x000005A0LU, 0x00000588LU, 0x00000598LU, 0x000005F8LU, 0x000005A8LU, 0x000005C8LU,
+ 0x00000580LU, 0x000005D0LU, 0x000005F0LU, 0x000005B8LU, 0x000005B0LU, 0x000005C0LU, 0x00000590LU, 0x000005E0LU,
+ 0x00000468LU, 0x00000458LU, 0x00000420LU, 0x00000408LU, 0x00000418LU, 0x00000478LU, 0x00000428LU, 0x00000448LU,
+ 0x00000400LU, 0x00000450LU, 0x00000470LU, 0x00000438LU, 0x00000430LU, 0x00000440LU, 0x00000410LU, 0x00000460LU,
+ 0x00000668LU, 0x00000658LU, 0x00000620LU, 0x00000608LU, 0x00000618LU, 0x00000678LU, 0x00000628LU, 0x00000648LU,
+ 0x00000600LU, 0x00000650LU, 0x00000670LU, 0x00000638LU, 0x00000630LU, 0x00000640LU, 0x00000610LU, 0x00000660LU,
+ },
+};
diff --git a/ext/hash/php_hash_haval.h b/ext/hash/php_hash_haval.h
new file mode 100644
index 0000000..0e62f23
--- /dev/null
+++ b/ext/hash/php_hash_haval.h
@@ -0,0 +1,59 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Sara Golemon <pollita@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_HASH_HAVAL_H
+#define PHP_HASH_HAVAL_H
+
+#include "ext/standard/basic_functions.h"
+/* HAVAL context. */
+typedef struct {
+ php_hash_uint32 state[8];
+ php_hash_uint32 count[2];
+ unsigned char buffer[128];
+
+ char passes;
+ short output;
+ void (*Transform)(php_hash_uint32 state[8], const unsigned char block[128]);
+} PHP_HAVAL_CTX;
+
+#define PHP_HASH_HAVAL_INIT_DECL(p,b) PHP_HASH_API void PHP_##p##HAVAL##b##Init(PHP_HAVAL_CTX *); \
+ PHP_HASH_API void PHP_HAVAL##b##Final(unsigned char*, PHP_HAVAL_CTX *);
+
+PHP_HASH_API void PHP_HAVALUpdate(PHP_HAVAL_CTX *, const unsigned char *, unsigned int);
+
+PHP_HASH_HAVAL_INIT_DECL(3,128)
+PHP_HASH_HAVAL_INIT_DECL(3,160)
+PHP_HASH_HAVAL_INIT_DECL(3,192)
+PHP_HASH_HAVAL_INIT_DECL(3,224)
+PHP_HASH_HAVAL_INIT_DECL(3,256)
+
+PHP_HASH_HAVAL_INIT_DECL(4,128)
+PHP_HASH_HAVAL_INIT_DECL(4,160)
+PHP_HASH_HAVAL_INIT_DECL(4,192)
+PHP_HASH_HAVAL_INIT_DECL(4,224)
+PHP_HASH_HAVAL_INIT_DECL(4,256)
+
+PHP_HASH_HAVAL_INIT_DECL(5,128)
+PHP_HASH_HAVAL_INIT_DECL(5,160)
+PHP_HASH_HAVAL_INIT_DECL(5,192)
+PHP_HASH_HAVAL_INIT_DECL(5,224)
+PHP_HASH_HAVAL_INIT_DECL(5,256)
+
+#endif
diff --git a/ext/hash/php_hash_joaat.h b/ext/hash/php_hash_joaat.h
new file mode 100644
index 0000000..d4eacd9
--- /dev/null
+++ b/ext/hash/php_hash_joaat.h
@@ -0,0 +1,43 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Martin Jansen <mj@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id*/
+
+#ifndef PHP_HASH_JOAAT_H
+#define PHP_HASH_JOAAT_H
+
+typedef struct {
+ php_hash_uint32 state;
+} PHP_JOAAT_CTX;
+
+PHP_HASH_API void PHP_JOAATInit(PHP_JOAAT_CTX *context);
+PHP_HASH_API void PHP_JOAATUpdate(PHP_JOAAT_CTX *context, const unsigned char *input, unsigned int inputLen);
+PHP_HASH_API void PHP_JOAATFinal(unsigned char digest[16], PHP_JOAAT_CTX * context);
+
+static php_hash_uint32 joaat_buf(void *buf, size_t len, php_hash_uint32 hval);
+
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
diff --git a/ext/hash/php_hash_md.h b/ext/hash/php_hash_md.h
new file mode 100644
index 0000000..10b6f12
--- /dev/null
+++ b/ext/hash/php_hash_md.h
@@ -0,0 +1,100 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Original Author: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ | Modified for pHASH by: Sara Golemon <pollita@php.net>
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_HASH_MD_H
+#define PHP_HASH_MD_H
+
+/* When SHA is removed from Core,
+ the ext/standard/sha1.c file can be removed
+ and the ext/standard/sha1.h file can be reduced to:
+ #define PHP_HASH_SHA1_NOT_IN_CORE
+ #include "ext/hash/php_hash_sha.h"
+ Don't forget to remove md5() and md5_file() entries from basic_functions.c
+ */
+
+#include "ext/standard/md5.h"
+
+#ifdef PHP_HASH_MD5_NOT_IN_CORE
+/* MD5.H - header file for MD5C.C
+ */
+
+/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+ rights reserved.
+
+ License to copy and use this software is granted provided that it
+ is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+ Algorithm" in all material mentioning or referencing this software
+ or this function.
+
+ License is also granted to make and use derivative works provided
+ that such works are identified as "derived from the RSA Data
+ Security, Inc. MD5 Message-Digest Algorithm" in all material
+ mentioning or referencing the derived work.
+
+ RSA Data Security, Inc. makes no representations concerning either
+ the merchantability of this software or the suitability of this
+ software for any particular purpose. It is provided "as is"
+ without express or implied warranty of any kind.
+
+ These notices must be retained in any copies of any part of this
+ documentation and/or software.
+ */
+
+/* MD5 context. */
+typedef struct {
+ php_hash_uint32 state[4]; /* state (ABCD) */
+ php_hash_uint32 count[2]; /* number of bits, modulo 2^64 (lsb first) */
+ unsigned char buffer[64]; /* input buffer */
+} PHP_MD5_CTX;
+
+PHP_HASH_API void make_digest(char *md5str, unsigned char *digest);
+PHP_HASH_API void PHP_MD5Init(PHP_MD5_CTX *);
+PHP_HASH_API void PHP_MD5Update(PHP_MD5_CTX *, const unsigned char *, unsigned int);
+PHP_HASH_API void PHP_MD5Final(unsigned char[16], PHP_MD5_CTX *);
+
+PHP_NAMED_FUNCTION(php_if_md5);
+PHP_NAMED_FUNCTION(php_if_md5_file);
+#endif /* PHP_HASH_MD5_NOT_IN_CORE */
+
+/* MD4 context */
+typedef struct {
+ php_hash_uint32 state[4];
+ php_hash_uint32 count[2];
+ unsigned char buffer[64];
+} PHP_MD4_CTX;
+
+PHP_HASH_API void PHP_MD4Init(PHP_MD4_CTX *);
+PHP_HASH_API void PHP_MD4Update(PHP_MD4_CTX *context, const unsigned char *, unsigned int);
+PHP_HASH_API void PHP_MD4Final(unsigned char[16], PHP_MD4_CTX *);
+
+/* MD2 context */
+typedef struct {
+ unsigned char state[48];
+ unsigned char checksum[16];
+ unsigned char buffer[16];
+ char in_buffer;
+} PHP_MD2_CTX;
+
+PHP_HASH_API void PHP_MD2Init(PHP_MD2_CTX *context);
+PHP_HASH_API void PHP_MD2Update(PHP_MD2_CTX *context, const unsigned char *, unsigned int);
+PHP_HASH_API void PHP_MD2Final(unsigned char[16], PHP_MD2_CTX *);
+
+#endif
diff --git a/ext/hash/php_hash_ripemd.h b/ext/hash/php_hash_ripemd.h
new file mode 100644
index 0000000..fde5c0f
--- /dev/null
+++ b/ext/hash/php_hash_ripemd.h
@@ -0,0 +1,66 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Sara Golemon <pollita@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_HASH_RIPEMD_H
+#define PHP_HASH_RIPEMD_H
+#include "ext/standard/basic_functions.h"
+
+/* RIPEMD context. */
+typedef struct {
+ php_hash_uint32 state[4]; /* state (ABCD) */
+ php_hash_uint32 count[2]; /* number of bits, modulo 2^64 (lsb first) */
+ unsigned char buffer[64]; /* input buffer */
+} PHP_RIPEMD128_CTX;
+
+typedef struct {
+ php_hash_uint32 state[5]; /* state (ABCD) */
+ php_hash_uint32 count[2]; /* number of bits, modulo 2^64 (lsb first) */
+ unsigned char buffer[64]; /* input buffer */
+} PHP_RIPEMD160_CTX;
+
+typedef struct {
+ php_hash_uint32 state[8]; /* state (ABCD) */
+ php_hash_uint32 count[2]; /* number of bits, modulo 2^64 (lsb first) */
+ unsigned char buffer[64]; /* input buffer */
+} PHP_RIPEMD256_CTX;
+
+typedef struct {
+ php_hash_uint32 state[10]; /* state (ABCD) */
+ php_hash_uint32 count[2]; /* number of bits, modulo 2^64 (lsb first) */
+ unsigned char buffer[64]; /* input buffer */
+} PHP_RIPEMD320_CTX;
+
+PHP_HASH_API void PHP_RIPEMD128Init(PHP_RIPEMD128_CTX *);
+PHP_HASH_API void PHP_RIPEMD128Update(PHP_RIPEMD128_CTX *, const unsigned char *, unsigned int);
+PHP_HASH_API void PHP_RIPEMD128Final(unsigned char[16], PHP_RIPEMD128_CTX *);
+
+PHP_HASH_API void PHP_RIPEMD160Init(PHP_RIPEMD160_CTX *);
+PHP_HASH_API void PHP_RIPEMD160Update(PHP_RIPEMD160_CTX *, const unsigned char *, unsigned int);
+PHP_HASH_API void PHP_RIPEMD160Final(unsigned char[20], PHP_RIPEMD160_CTX *);
+
+PHP_HASH_API void PHP_RIPEMD256Init(PHP_RIPEMD256_CTX *);
+PHP_HASH_API void PHP_RIPEMD256Update(PHP_RIPEMD256_CTX *, const unsigned char *, unsigned int);
+PHP_HASH_API void PHP_RIPEMD256Final(unsigned char[32], PHP_RIPEMD256_CTX *);
+
+PHP_HASH_API void PHP_RIPEMD320Init(PHP_RIPEMD320_CTX *);
+PHP_HASH_API void PHP_RIPEMD320Update(PHP_RIPEMD320_CTX *, const unsigned char *, unsigned int);
+PHP_HASH_API void PHP_RIPEMD320Final(unsigned char[40], PHP_RIPEMD320_CTX *);
+
+#endif /* PHP_HASH_RIPEMD_H */
diff --git a/ext/hash/php_hash_sha.h b/ext/hash/php_hash_sha.h
new file mode 100644
index 0000000..bae7cf3
--- /dev/null
+++ b/ext/hash/php_hash_sha.h
@@ -0,0 +1,97 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | SHA1 Author: Stefan Esser <sesser@php.net> |
+ | SHA256 Author: Sara Golemon <pollita@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_HASH_SHA_H
+#define PHP_HASH_SHA_H
+
+/* When SHA is removed from Core,
+ the ext/standard/sha1.c file can be removed
+ and the ext/standard/sha1.h file can be reduced to:
+ #define PHP_HASH_SHA1_NOT_IN_CORE
+ #include "ext/hash/php_hash_sha.h"
+ Don't forget to remove sha1() and sha1_file() from basic_functions.c
+ */
+#include "ext/standard/sha1.h"
+#include "ext/standard/basic_functions.h"
+
+#ifdef PHP_HASH_SHA1_NOT_IN_CORE
+
+/* SHA1 context. */
+typedef struct {
+ php_hash_uint32 state[5]; /* state (ABCD) */
+ php_hash_uint32 count[2]; /* number of bits, modulo 2^64 */
+ unsigned char buffer[64]; /* input buffer */
+} PHP_SHA1_CTX;
+
+PHP_HASH_API void PHP_SHA1Init(PHP_SHA1_CTX *);
+PHP_HASH_API void PHP_SHA1Update(PHP_SHA1_CTX *, const unsigned char *, unsigned int);
+PHP_HASH_API void PHP_SHA1Final(unsigned char[20], PHP_SHA1_CTX *);
+
+PHP_FUNCTION(sha1);
+PHP_FUNCTION(sha1_file);
+
+#endif /* PHP_HASH_SHA1_NOT_IN_CORE */
+
+/* SHA224 context. */
+typedef struct {
+ php_hash_uint32 state[8]; /* state */
+ php_hash_uint32 count[2]; /* number of bits, modulo 2^64 */
+ unsigned char buffer[64]; /* input buffer */
+} PHP_SHA224_CTX;
+
+PHP_HASH_API void PHP_SHA224Init(PHP_SHA224_CTX *);
+PHP_HASH_API void PHP_SHA224Update(PHP_SHA224_CTX *, const unsigned char *, unsigned int);
+PHP_HASH_API void PHP_SHA224Final(unsigned char[28], PHP_SHA224_CTX *);
+
+/* SHA256 context. */
+typedef struct {
+ php_hash_uint32 state[8]; /* state */
+ php_hash_uint32 count[2]; /* number of bits, modulo 2^64 */
+ unsigned char buffer[64]; /* input buffer */
+} PHP_SHA256_CTX;
+
+PHP_HASH_API void PHP_SHA256Init(PHP_SHA256_CTX *);
+PHP_HASH_API void PHP_SHA256Update(PHP_SHA256_CTX *, const unsigned char *, unsigned int);
+PHP_HASH_API void PHP_SHA256Final(unsigned char[32], PHP_SHA256_CTX *);
+
+/* SHA384 context */
+typedef struct {
+ php_hash_uint64 state[8]; /* state */
+ php_hash_uint64 count[2]; /* number of bits, modulo 2^128 */
+ unsigned char buffer[128]; /* input buffer */
+} PHP_SHA384_CTX;
+
+PHP_HASH_API void PHP_SHA384Init(PHP_SHA384_CTX *);
+PHP_HASH_API void PHP_SHA384Update(PHP_SHA384_CTX *, const unsigned char *, unsigned int);
+PHP_HASH_API void PHP_SHA384Final(unsigned char[48], PHP_SHA384_CTX *);
+
+/* SHA512 context */
+typedef struct {
+ php_hash_uint64 state[8]; /* state */
+ php_hash_uint64 count[2]; /* number of bits, modulo 2^128 */
+ unsigned char buffer[128]; /* input buffer */
+} PHP_SHA512_CTX;
+
+PHP_HASH_API void PHP_SHA512Init(PHP_SHA512_CTX *);
+PHP_HASH_API void PHP_SHA512Update(PHP_SHA512_CTX *, const unsigned char *, unsigned int);
+PHP_HASH_API void PHP_SHA512Final(unsigned char[64], PHP_SHA512_CTX *);
+
+#endif /* PHP_HASH_SHA_H */
diff --git a/ext/hash/php_hash_snefru.h b/ext/hash/php_hash_snefru.h
new file mode 100644
index 0000000..87e3c53
--- /dev/null
+++ b/ext/hash/php_hash_snefru.h
@@ -0,0 +1,51 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Michael Wallner <mike@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_HASH_SNEFRU_H
+#define PHP_HASH_SNEFRU_H
+
+/* SNEFRU-2.5a with 8 passes and 256 bit hash output
+ * AKA "Xerox Secure Hash Function"
+ */
+
+#include "ext/standard/basic_functions.h"
+
+/* SNEFRU context */
+typedef struct {
+ php_hash_uint32 state[16];
+ php_hash_uint32 count[2];
+ unsigned char length;
+ unsigned char buffer[32];
+} PHP_SNEFRU_CTX;
+
+PHP_HASH_API void PHP_SNEFRUInit(PHP_SNEFRU_CTX *);
+PHP_HASH_API void PHP_SNEFRUUpdate(PHP_SNEFRU_CTX *, const unsigned char *, size_t);
+PHP_HASH_API void PHP_SNEFRUFinal(unsigned char[32], PHP_SNEFRU_CTX *);
+
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/php_hash_snefru_tables.h b/ext/hash/php_hash_snefru_tables.h
new file mode 100644
index 0000000..1956e9e
--- /dev/null
+++ b/ext/hash/php_hash_snefru_tables.h
@@ -0,0 +1,942 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Michael Wallner <mike@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+static const php_hash_uint32 tables[16][256]= {
+
+ { /* Start of S Box 0 */
+
+/* 0*/ 0x64f9001bL,0xfeddcdf6L,0x7c8ff1e2L,0x11d71514L,0x8b8c18d3L,
+/* 5*/ 0xdddf881eL,0x6eab5056L,0x88ced8e1L,0x49148959L,0x69c56fd5L,
+/* 10*/ 0xb7994f03L,0x0fbcee3eL,0x3c264940L,0x21557e58L,0xe14b3fc2L,
+/* 15*/ 0x2e5cf591L,0xdceff8ceL,0x092a1648L,0xbe812936L,0xff7b0c6aL,
+/* 20*/ 0xd5251037L,0xafa448f1L,0x7dafc95aL,0x1ea69c3fL,0xa417abe7L,
+/* 25*/ 0x5890e423L,0xb0cb70c0L,0xc85025f7L,0x244d97e3L,0x1ff3595fL,
+/* 30*/ 0xc4ec6396L,0x59181e17L,0xe635b477L,0x354e7dbfL,0x796f7753L,
+/* 35*/ 0x66eb52ccL,0x77c3f995L,0x32e3a927L,0x80ccaed6L,0x4e2be89dL,
+/* 40*/ 0x375bbd28L,0xad1a3d05L,0x2b1b42b3L,0x16c44c71L,0x4d54bfa8L,
+/* 45*/ 0xe57ddc7aL,0xec6d8144L,0x5a71046bL,0xd8229650L,0x87fc8f24L,
+/* 50*/ 0xcbc60e09L,0xb6390366L,0xd9f76092L,0xd393a70bL,0x1d31a08aL,
+/* 55*/ 0x9cd971c9L,0x5c1ef445L,0x86fab694L,0xfdb44165L,0x8eaafcbeL,
+/* 60*/ 0x4bcac6ebL,0xfb7a94e5L,0x5789d04eL,0xfa13cf35L,0x236b8da9L,
+/* 65*/ 0x4133f000L,0x6224261cL,0xf412f23bL,0xe75e56a4L,0x30022116L,
+/* 70*/ 0xbaf17f1fL,0xd09872f9L,0xc1a3699cL,0xf1e802aaL,0x0dd145dcL,
+/* 75*/ 0x4fdce093L,0x8d8412f0L,0x6cd0f376L,0x3de6b73dL,0x84ba737fL,
+/* 80*/ 0xb43a30f2L,0x44569f69L,0x00e4eacaL,0xb58de3b0L,0x959113c8L,
+/* 85*/ 0xd62efee9L,0x90861f83L,0xced69874L,0x2f793ceeL,0xe8571c30L,
+/* 90*/ 0x483665d1L,0xab07b031L,0x914c844fL,0x15bf3be8L,0x2c3f2a9aL,
+/* 95*/ 0x9eb95fd4L,0x92e7472dL,0x2297cc5bL,0xee5f2782L,0x5377b562L,
+/* 100*/ 0xdb8ebbcfL,0xf961deddL,0xc59b5c60L,0x1bd3910dL,0x26d206adL,
+/* 105*/ 0xb28514d8L,0x5ecf6b52L,0x7fea78bbL,0x504879acL,0xed34a884L,
+/* 110*/ 0x36e51d3cL,0x1753741dL,0x8c47caedL,0x9d0a40efL,0x3145e221L,
+/* 115*/ 0xda27eb70L,0xdf730ba3L,0x183c8789L,0x739ac0a6L,0x9a58dfc6L,
+/* 120*/ 0x54b134c1L,0xac3e242eL,0xcc493902L,0x7b2dda99L,0x8f15bc01L,
+/* 125*/ 0x29fd38c7L,0x27d5318fL,0x604aaff5L,0xf29c6818L,0xc38aa2ecL,
+/* 130*/ 0x1019d4c3L,0xa8fb936eL,0x20ed7b39L,0x0b686119L,0x89a0906fL,
+/* 135*/ 0x1cc7829eL,0x9952ef4bL,0x850e9e8cL,0xcd063a90L,0x67002f8eL,
+/* 140*/ 0xcfac8cb7L,0xeaa24b11L,0x988b4e6cL,0x46f066dfL,0xca7eec08L,
+/* 145*/ 0xc7bba664L,0x831d17bdL,0x63f575e6L,0x9764350eL,0x47870d42L,
+/* 150*/ 0x026ca4a2L,0x8167d587L,0x61b6adabL,0xaa6564d2L,0x70da237bL,
+/* 155*/ 0x25e1c74aL,0xa1c901a0L,0x0eb0a5daL,0x7670f741L,0x51c05aeaL,
+/* 160*/ 0x933dfa32L,0x0759ff1aL,0x56010ab8L,0x5fdecb78L,0x3f32edf8L,
+/* 165*/ 0xaebedbb9L,0x39f8326dL,0xd20858c5L,0x9b638be4L,0xa572c80aL,
+/* 170*/ 0x28e0a19fL,0x432099fcL,0x3a37c3cdL,0xbf95c585L,0xb392c12aL,
+/* 175*/ 0x6aa707d7L,0x52f66a61L,0x12d483b1L,0x96435b5eL,0x3e75802bL,
+/* 180*/ 0x3ba52b33L,0xa99f51a5L,0xbda1e157L,0x78c2e70cL,0xfcae7ce0L,
+/* 185*/ 0xd1602267L,0x2affac4dL,0x4a510947L,0x0ab2b83aL,0x7a04e579L,
+/* 190*/ 0x340dfd80L,0xb916e922L,0xe29d5e9bL,0xf5624af4L,0x4ca9d9afL,
+/* 195*/ 0x6bbd2cfeL,0xe3b7f620L,0xc2746e07L,0x5b42b9b6L,0xa06919bcL,
+/* 200*/ 0xf0f2c40fL,0x72217ab5L,0x14c19df3L,0xf3802daeL,0xe094beb4L,
+/* 205*/ 0xa2101affL,0x0529575dL,0x55cdb27cL,0xa33bddb2L,0x6528b37dL,
+/* 210*/ 0x740c05dbL,0xe96a62c4L,0x40782846L,0x6d30d706L,0xbbf48e2cL,
+/* 215*/ 0xbce2d3deL,0x049e37faL,0x01b5e634L,0x2d886d8dL,0x7e5a2e7eL,
+/* 220*/ 0xd7412013L,0x06e90f97L,0xe45d3ebaL,0xb8ad3386L,0x13051b25L,
+/* 225*/ 0x0c035354L,0x71c89b75L,0xc638fbd0L,0x197f11a1L,0xef0f08fbL,
+/* 230*/ 0xf8448651L,0x38409563L,0x452f4443L,0x5d464d55L,0x03d8764cL,
+/* 235*/ 0xb1b8d638L,0xa70bba2fL,0x94b3d210L,0xeb6692a7L,0xd409c2d9L,
+/* 240*/ 0x68838526L,0xa6db8a15L,0x751f6c98L,0xde769a88L,0xc9ee4668L,
+/* 245*/ 0x1a82a373L,0x0896aa49L,0x42233681L,0xf62c55cbL,0x9f1c5404L,
+/* 250*/ 0xf74fb15cL,0xc06e4312L,0x6ffe5d72L,0x8aa8678bL,0x337cd129L,
+/* 255*/ 0x8211cefdL
+ /* End of S Box 0 */ },
+
+
+ { /* Start of S Box 1 */
+
+/* 0*/ 0x074a1d09L,0x52a10e5aL,0x9275a3f8L,0x4b82506cL,0x37df7e1bL,
+/* 5*/ 0x4c78b3c5L,0xcefab1daL,0xf472267eL,0xb63045f6L,0xd66a1fc0L,
+/* 10*/ 0x400298e3L,0x27e60c94L,0x87d2f1b8L,0xdf9e56ccL,0x45cd1803L,
+/* 15*/ 0x1d35e098L,0xcce7c736L,0x03483bf1L,0x1f7307d7L,0xc6e8f948L,
+/* 20*/ 0xe613c111L,0x3955c6ffL,0x1170ed7cL,0x8e95da41L,0x99c31bf4L,
+/* 25*/ 0xa4da8021L,0x7b5f94fbL,0xdd0da51fL,0x6562aa77L,0x556bcb23L,
+/* 30*/ 0xdb1bacc6L,0x798040b9L,0xbfe5378fL,0x731d55e6L,0xdaa5bfeeL,
+/* 35*/ 0x389bbc60L,0x1b33fba4L,0x9c567204L,0x36c26c68L,0x77ee9d69L,
+/* 40*/ 0x8aeb3e88L,0x2d50b5ceL,0x9579e790L,0x42b13cfcL,0x33fbd32bL,
+/* 45*/ 0xee0503a7L,0xb5862824L,0x15e41eadL,0xc8412ef7L,0x9d441275L,
+/* 50*/ 0x2fcec582L,0x5ff483b7L,0x8f3931dfL,0x2e5d2a7bL,0x49467bf9L,
+/* 55*/ 0x0653dea9L,0x2684ce35L,0x7e655e5cL,0xf12771d8L,0xbb15cc67L,
+/* 60*/ 0xab097ca1L,0x983dcf52L,0x10ddf026L,0x21267f57L,0x2c58f6b4L,
+/* 65*/ 0x31043265L,0x0bab8c01L,0xd5492099L,0xacaae619L,0x944ce54aL,
+/* 70*/ 0xf2d13d39L,0xadd3fc32L,0xcda08a40L,0xe2b0d451L,0x9efe08aeL,
+/* 75*/ 0xb9d50fd2L,0xea5cd7fdL,0xc9a749ddL,0x13ea2253L,0x832debaaL,
+/* 80*/ 0x24be640fL,0xe03e926aL,0x29e01cdeL,0x8bf59f18L,0x0f9d00b6L,
+/* 85*/ 0xe1238b46L,0x1e7d8e34L,0x93619adbL,0x76b32f9fL,0xbd972cecL,
+/* 90*/ 0xe31fa976L,0xa68fbb10L,0xfb3ba49dL,0x8587c41dL,0xa5add1d0L,
+/* 95*/ 0xf3cf84bfL,0xd4e11150L,0xd9ffa6bcL,0xc3f6018cL,0xaef10572L,
+/* 100*/ 0x74a64b2fL,0xe7dc9559L,0x2aae35d5L,0x5b6f587fL,0xa9e353feL,
+/* 105*/ 0xca4fb674L,0x04ba24a8L,0xe5c6875fL,0xdcbc6266L,0x6bc5c03fL,
+/* 110*/ 0x661eef02L,0xed740babL,0x058e34e4L,0xb7e946cfL,0x88698125L,
+/* 115*/ 0x72ec48edL,0xb11073a3L,0xa13485ebL,0xa2a2429cL,0xfa407547L,
+/* 120*/ 0x50b76713L,0x5418c37dL,0x96192da5L,0x170bb04bL,0x518a021eL,
+/* 125*/ 0xb0ac13d1L,0x0963fa2aL,0x4a6e10e1L,0x58472bdcL,0xf7f8d962L,
+/* 130*/ 0x979139eaL,0x8d856538L,0xc0997042L,0x48324d7aL,0x447623cbL,
+/* 135*/ 0x8cbbe364L,0x6e0c6b0eL,0xd36d63b0L,0x3f244c84L,0x3542c971L,
+/* 140*/ 0x2b228dc1L,0xcb0325bbL,0xf8c0d6e9L,0xde11066bL,0xa8649327L,
+/* 145*/ 0xfc31f83eL,0x7dd80406L,0xf916dd61L,0xd89f79d3L,0x615144c2L,
+/* 150*/ 0xebb45d31L,0x28002958L,0x56890a37L,0xf05b3808L,0x123ae844L,
+/* 155*/ 0x86839e16L,0x914b0d83L,0xc506b43cL,0xcf3cba5eL,0x7c60f5c9L,
+/* 160*/ 0x22deb2a0L,0x5d9c2715L,0xc77ba0efL,0x4f45360bL,0xc1017d8bL,
+/* 165*/ 0xe45adc29L,0xa759909bL,0x412cd293L,0xd7d796b1L,0x00c8ff30L,
+/* 170*/ 0x23a34a80L,0x4ec15c91L,0x714e78b5L,0x47b9e42eL,0x78f3ea4dL,
+/* 175*/ 0x7f078f5bL,0x346c593aL,0xa3a87a1aL,0x9bcbfe12L,0x3d439963L,
+/* 180*/ 0xb2ef6d8eL,0xb8d46028L,0x6c2fd5caL,0x62675256L,0x01f2a2f3L,
+/* 185*/ 0xbc96ae0aL,0x709a8920L,0xb4146e87L,0x6308b9e2L,0x64bda7baL,
+/* 190*/ 0xafed6892L,0x6037f2a2L,0xf52969e0L,0x0adb43a6L,0x82811400L,
+/* 195*/ 0x90d0bdf0L,0x19c9549eL,0x203f6a73L,0x1accaf4fL,0x89714e6dL,
+/* 200*/ 0x164d4705L,0x67665f07L,0xec206170L,0x0c2182b2L,0xa02b9c81L,
+/* 205*/ 0x53289722L,0xf6a97686L,0x140e4179L,0x9f778849L,0x9a88e15dL,
+/* 210*/ 0x25cadb54L,0xd157f36fL,0x32a421c3L,0xb368e98aL,0x5a92cd0dL,
+/* 215*/ 0x757aa8d4L,0xc20ac278L,0x08b551c7L,0x849491e8L,0x4dc75ad6L,
+/* 220*/ 0x697c33beL,0xbaf0ca33L,0x46125b4eL,0x59d677b3L,0x30d9c8f2L,
+/* 225*/ 0xd0af860cL,0x1c7fd0faL,0xfe0ff72cL,0x5c8d6f43L,0x57fdec3bL,
+/* 230*/ 0x6ab6ad97L,0xd22adf89L,0x18171785L,0x02bfe22dL,0x6db80917L,
+/* 235*/ 0x80b216afL,0xe85e4f9aL,0x7a1c306eL,0x6fc49bf5L,0x3af7a11cL,
+/* 240*/ 0x81e215e7L,0x68363fcdL,0x3e9357c8L,0xef52fd55L,0x3b8bab4cL,
+/* 245*/ 0x3c8cf495L,0xbefceebdL,0xfd25b714L,0xc498d83dL,0x0d2e1a8dL,
+/* 250*/ 0xe9f966acL,0x0e387445L,0x435419e5L,0x5e7ebec4L,0xaa90b8d9L,
+/* 255*/ 0xff1a3a96L
+ /* End of S Box 1 */ },
+
+
+ { /* Start of S Box 2 */
+
+/* 0*/ 0x4a8fe4e3L,0xf27d99cdL,0xd04a40caL,0xcb5ff194L,0x3668275aL,
+/* 5*/ 0xff4816beL,0xa78b394cL,0x4c6be9dbL,0x4eec38d2L,0x4296ec80L,
+/* 10*/ 0xcdce96f8L,0x888c2f38L,0xe75508f5L,0x7b916414L,0x060aa14aL,
+/* 15*/ 0xa214f327L,0xbe608dafL,0x1ebbdec2L,0x61f98ce9L,0xe92156feL,
+/* 20*/ 0x4f22d7a3L,0x3f76a8d9L,0x559a4b33L,0x38ad2959L,0xf3f17e9eL,
+/* 25*/ 0x85e1ba91L,0xe5eba6fbL,0x73dcd48cL,0xf5c3ff78L,0x481b6058L,
+/* 30*/ 0x8a3297f7L,0x8f1f3bf4L,0x93785ab2L,0x477a4a5bL,0x6334eb5dL,
+/* 35*/ 0x6d251b2eL,0x74a9102dL,0x07e38ffaL,0x915c9c62L,0xccc275eaL,
+/* 40*/ 0x6be273ecL,0x3ebddd70L,0xd895796cL,0xdc54a91bL,0xc9afdf81L,
+/* 45*/ 0x23633f73L,0x275119b4L,0xb19f6b67L,0x50756e22L,0x2bb152e2L,
+/* 50*/ 0x76ea46a2L,0xa353e232L,0x2f596ad6L,0x0b1edb0bL,0x02d3d9a4L,
+/* 55*/ 0x78b47843L,0x64893e90L,0x40f0caadL,0xf68d3ad7L,0x46fd1707L,
+/* 60*/ 0x1c9c67efL,0xb5e086deL,0x96ee6ca6L,0x9aa34774L,0x1ba4f48aL,
+/* 65*/ 0x8d01abfdL,0x183ee1f6L,0x5ff8aa7aL,0x17e4faaeL,0x303983b0L,
+/* 70*/ 0x6c08668bL,0xd4ac4382L,0xe6c5849fL,0x92fefb53L,0xc1cac4ceL,
+/* 75*/ 0x43501388L,0x441118cfL,0xec4fb308L,0x53a08e86L,0x9e0fe0c5L,
+/* 80*/ 0xf91c1525L,0xac45be05L,0xd7987cb5L,0x49ba1487L,0x57938940L,
+/* 85*/ 0xd5877648L,0xa958727fL,0x58dfe3c3L,0xf436cf77L,0x399e4d11L,
+/* 90*/ 0xf0a5bfa9L,0xef61a33bL,0xa64cac60L,0x04a8d0baL,0x030dd572L,
+/* 95*/ 0xb83d320fL,0xcab23045L,0xe366f2f0L,0x815d008dL,0xc897a43aL,
+/* 100*/ 0x1d352df3L,0xb9cc571dL,0x8bf38744L,0x72209092L,0xeba124ebL,
+/* 105*/ 0xfb99ce5eL,0x3bb94293L,0x28da549cL,0xaab8a228L,0xa4197785L,
+/* 110*/ 0x33c70296L,0x25f6259bL,0x5c85da21L,0xdf15bdeeL,0x15b7c7e8L,
+/* 115*/ 0xe2abef75L,0xfcc19bc1L,0x417ff868L,0x14884434L,0x62825179L,
+/* 120*/ 0xc6d5c11cL,0x0e4705dcL,0x22700de0L,0xd3d2af18L,0x9be822a0L,
+/* 125*/ 0x35b669f1L,0xc42bb55cL,0x0a801252L,0x115bf0fcL,0x3cd7d856L,
+/* 130*/ 0xb43f5f9dL,0xc2306516L,0xa1231c47L,0xf149207eL,0x5209a795L,
+/* 135*/ 0x34b3ccd8L,0x67aefe54L,0x2c83924eL,0x6662cbacL,0x5eedd161L,
+/* 140*/ 0x84e681aaL,0x5d57d26bL,0xfa465cc4L,0x7e3ac3a8L,0xbf7c0cc6L,
+/* 145*/ 0xe18a9aa1L,0xc32f0a6fL,0xb22cc00dL,0x3d280369L,0x994e554fL,
+/* 150*/ 0x68f480d3L,0xadcff5e6L,0x3a8eb265L,0x83269831L,0xbd568a09L,
+/* 155*/ 0x4bc8ae6aL,0x69f56d2bL,0x0f17eac8L,0x772eb6c7L,0x9f41343cL,
+/* 160*/ 0xab1d0742L,0x826a6f50L,0xfea2097cL,0x1912c283L,0xce185899L,
+/* 165*/ 0xe4444839L,0x2d8635d5L,0x65d0b1ffL,0x865a7f17L,0x326d9fb1L,
+/* 170*/ 0x59e52820L,0x0090ade1L,0x753c7149L,0x9ddd8b98L,0xa5a691daL,
+/* 175*/ 0x0d0382bbL,0x8904c930L,0x086cb000L,0x6e69d3bdL,0x24d4e7a7L,
+/* 180*/ 0x05244fd0L,0x101a5e0cL,0x6a947dcbL,0xe840f77bL,0x7d0c5003L,
+/* 185*/ 0x7c370f1fL,0x805245edL,0xe05e3d3fL,0x7906880eL,0xbabfcd35L,
+/* 190*/ 0x1a7ec697L,0x8c052324L,0x0c6ec8dfL,0xd129a589L,0xc7a75b02L,
+/* 195*/ 0x12d81de7L,0xd9be2a66L,0x1f4263abL,0xde73fdb6L,0x2a00680aL,
+/* 200*/ 0x56649e36L,0x3133ed55L,0x90fa0bf2L,0x2910a02aL,0x949d9d46L,
+/* 205*/ 0xa0d1dcddL,0xcfc9b7d4L,0xd2677be5L,0x95cb36b3L,0x13cd9410L,
+/* 210*/ 0xdbf73313L,0xb7c6e8c0L,0xf781414bL,0x510b016dL,0xb0de1157L,
+/* 215*/ 0xd6b0f62cL,0xbb074eccL,0x7f1395b7L,0xee792cf9L,0xea6fd63eL,
+/* 220*/ 0x5bd6938eL,0xaf02fc64L,0xdab57ab8L,0x8edb3784L,0x8716318fL,
+/* 225*/ 0x164d1a01L,0x26f26141L,0xb372e6b9L,0xf8fc2b06L,0x7ac00e04L,
+/* 230*/ 0x3727b89aL,0x97e9bca5L,0x9c2a742fL,0xbc3b1f7dL,0x7165b471L,
+/* 235*/ 0x609b4c29L,0x20925351L,0x5ae72112L,0x454be5d1L,0xc0ffb95fL,
+/* 240*/ 0xdd0ef919L,0x6f2d70c9L,0x0974c5bfL,0x98aa6263L,0x01d91e4dL,
+/* 245*/ 0x2184bb6eL,0x70c43c1eL,0x4d435915L,0xae7b8523L,0xb6fb06bcL,
+/* 250*/ 0x5431ee76L,0xfdbc5d26L,0xed77493dL,0xc5712ee4L,0xa8380437L,
+/* 255*/ 0x2eef261aL
+ /* End of S Box 2 */ },
+
+
+ { /* Start of S Box 3 */
+
+/* 0*/ 0x5a79392bL,0xb8af32c2L,0x41f7720aL,0x833a61ecL,0x13dfedacL,
+/* 5*/ 0xc4990bc4L,0xdc0f54bcL,0xfedd5e88L,0x80da1881L,0x4dea1afdL,
+/* 10*/ 0xfd402cc6L,0xae67cc7aL,0xc5238525L,0x8ea01254L,0xb56b9bd5L,
+/* 15*/ 0x862fbd6dL,0xac8575d3L,0x6fba3714L,0xda7ebf46L,0x59cd5238L,
+/* 20*/ 0x8ac9dbfeL,0x353729fcL,0xe497d7f2L,0xc3ab84e0L,0xf05a114bL,
+/* 25*/ 0x7b887a75L,0xedc603ddL,0x5e6fe680L,0x2c84b399L,0x884eb1daL,
+/* 30*/ 0x1cb8c8bfL,0xaa51098aL,0xc862231cL,0x8bac2221L,0x21b387e5L,
+/* 35*/ 0x208a430dL,0x2a3f0f8bL,0xa5ff9cd2L,0x6012a2eaL,0x147a9ee7L,
+/* 40*/ 0xf62a501dL,0xb4b2e51aL,0x3ef3484cL,0xc0253c59L,0x2b82b536L,
+/* 45*/ 0x0aa9696bL,0xbe0c109bL,0xc70b7929L,0xce3e8a19L,0x2f66950eL,
+/* 50*/ 0x459f1c2cL,0xe68fb93dL,0xa3c3ff3eL,0x62b45c62L,0x300991cbL,
+/* 55*/ 0x01914c57L,0x7f7bc06aL,0x182831f5L,0xe7b74bcaL,0xfa50f6d0L,
+/* 60*/ 0x523caa61L,0xe3a7cf05L,0xe9e41311L,0x280a21d1L,0x6a4297e1L,
+/* 65*/ 0xf24dc67eL,0xfc3189e6L,0xb72bf34fL,0x4b1e67afL,0x543402ceL,
+/* 70*/ 0x79a59867L,0x0648e02aL,0x00a3ac17L,0xc6208d35L,0x6e7f5f76L,
+/* 75*/ 0xa45bb4beL,0xf168fa63L,0x3f4125f3L,0xf311406fL,0x02706565L,
+/* 80*/ 0xbfe58022L,0x0cfcfdd9L,0x0735a7f7L,0x8f049092L,0xd98edc27L,
+/* 85*/ 0xf5c5d55cL,0xe0f201dbL,0x0dcafc9aL,0x7727fb79L,0xaf43abf4L,
+/* 90*/ 0x26e938c1L,0x401b26a6L,0x900720faL,0x2752d97bL,0xcff1d1b3L,
+/* 95*/ 0xa9d9e424L,0x42db99abL,0x6cf8be5fL,0xe82cebe3L,0x3afb733bL,
+/* 100*/ 0x6b734eb6L,0x1036414aL,0x975f667cL,0x049d6377L,0xba587c60L,
+/* 105*/ 0xb1d10483L,0xde1aefccL,0x1129d055L,0x72051e91L,0x6946d623L,
+/* 110*/ 0xf9e86ea7L,0x48768c00L,0xb0166c93L,0x9956bbf0L,0x1f1f6d84L,
+/* 115*/ 0xfb15e18eL,0x033b495dL,0x56e3362eL,0x4f44c53cL,0x747cba51L,
+/* 120*/ 0x89d37872L,0x5d9c331bL,0xd2ef9fa8L,0x254917f8L,0x1b106f47L,
+/* 125*/ 0x37d75553L,0xb3f053b0L,0x7dccd8efL,0xd30eb802L,0x5889f42dL,
+/* 130*/ 0x610206d7L,0x1a7d34a1L,0x92d87dd8L,0xe5f4a315L,0xd1cf0e71L,
+/* 135*/ 0xb22dfe45L,0xb901e8ebL,0x0fc0ce5eL,0x2efa60c9L,0x2de74290L,
+/* 140*/ 0x36d0c906L,0x381c70e4L,0x4c6da5b5L,0x3d81a682L,0x7e381f34L,
+/* 145*/ 0x396c4f52L,0x95ad5901L,0x1db50c5aL,0x29982e9eL,0x1557689fL,
+/* 150*/ 0x3471ee42L,0xd7e2f7c0L,0x8795a1e2L,0xbc324d8dL,0xe224c3c8L,
+/* 155*/ 0x12837e39L,0xcdee3d74L,0x7ad2143fL,0x0e13d40cL,0x78bd4a68L,
+/* 160*/ 0xa2eb194dL,0xdb9451f9L,0x859b71dcL,0x5c4f5b89L,0xca14a8a4L,
+/* 165*/ 0xef92f003L,0x16741d98L,0x33aa4444L,0x9e967fbbL,0x092e3020L,
+/* 170*/ 0xd86a35b8L,0x8cc17b10L,0xe1bf08aeL,0x55693fc5L,0x7680ad13L,
+/* 175*/ 0x1e6546e8L,0x23b6e7b9L,0xee77a4b2L,0x08ed0533L,0x44fd2895L,
+/* 180*/ 0xb6393b69L,0x05d6cacfL,0x9819b209L,0xecbbb72fL,0x9a75779cL,
+/* 185*/ 0xeaec0749L,0x94a65aeeL,0xbdf52dc3L,0xd6a25d04L,0x82008e4eL,
+/* 190*/ 0xa6de160fL,0x9b036afbL,0x228b3a66L,0x5fb10a70L,0xcc338b58L,
+/* 195*/ 0x5378a9dfL,0xc908bca9L,0x4959e25bL,0x46909a97L,0x66ae8f6eL,
+/* 200*/ 0xdd0683e9L,0x65f994b4L,0x6426cda5L,0xc24b8840L,0x32539da0L,
+/* 205*/ 0x63175650L,0xd0c815ffL,0x50cbc41eL,0xf7c774a3L,0x31b0c231L,
+/* 210*/ 0x8d0d8116L,0x24bef16cL,0xd555d256L,0xdf47ea8cL,0x6d21eccdL,
+/* 215*/ 0xa887a012L,0x84542aedL,0xa7b9c1bdL,0x914c1bb1L,0xa0d5b67dL,
+/* 220*/ 0x438ce937L,0x7030f873L,0x71f6b0c7L,0x574576baL,0xf8bc4541L,
+/* 225*/ 0x9c61d348L,0x1960579dL,0x17c4daadL,0x96a4cb0bL,0xc193f2f6L,
+/* 230*/ 0x756eafa2L,0x7c1d2f94L,0xf4fe2b43L,0xcb86e33aL,0xebd4c728L,
+/* 235*/ 0x9d18ae64L,0x9fe13e30L,0x3ce0f5deL,0xaba1f985L,0xaddc2718L,
+/* 240*/ 0x68ce6278L,0xd45e241fL,0xa15c82b7L,0x3b2293d4L,0x739edd32L,
+/* 245*/ 0x674a6bf1L,0x5b5d587fL,0x4772deaaL,0x4a63968fL,0x0be68686L,
+/* 250*/ 0x513d6426L,0x939a4787L,0xbba89296L,0x4ec20007L,0x818d0d08L,
+/* 255*/ 0xff64dfd6L
+ /* End of S Box 3 */ },
+
+
+ { /* Start of S Box 4 */
+
+/* 0*/ 0xcb2297cbL,0xdb48a144L,0xa16cbe4bL,0xbbea1d6cL,0x5af6b6b7L,
+/* 5*/ 0x8a8110b6L,0xf9236ef9L,0xc98f83e6L,0x0f9c65b8L,0x252d4a89L,
+/* 10*/ 0xa497f068L,0xa5d7ed2dL,0x94c22845L,0x9da1c8c4L,0xe27c2e2eL,
+/* 15*/ 0x6e8ba2b4L,0xc3dd17fbL,0x498cd482L,0x0dfe6a9fL,0xb0705829L,
+/* 20*/ 0x9a1e6dc1L,0xf829717cL,0x07bb8e3aL,0xda3c0b02L,0x1af82fc7L,
+/* 25*/ 0x73b70955L,0x7a04379cL,0x5ee20a28L,0x83712ae5L,0xf4c47c6dL,
+/* 30*/ 0xdf72ba56L,0xd794858dL,0x8c0cf709L,0x18f0f390L,0xb6c69b35L,
+/* 35*/ 0xbf2f01dbL,0x2fa74dcaL,0xd0cd9127L,0xbde66cecL,0x3deebd46L,
+/* 40*/ 0x57c88fc3L,0xcee1406fL,0x0066385aL,0xf3c3444fL,0x3a79d5d5L,
+/* 45*/ 0x75751eb9L,0x3e7f8185L,0x521c2605L,0xe1aaab6eL,0x38ebb80fL,
+/* 50*/ 0xbee7e904L,0x61cb9647L,0xea54904eL,0x05ae00e4L,0x2d7ac65fL,
+/* 55*/ 0x087751a1L,0xdcd82915L,0x0921ee16L,0xdd86d33bL,0xd6bd491aL,
+/* 60*/ 0x40fbadf0L,0x4232cbd2L,0x33808d10L,0x39098c42L,0x193f3199L,
+/* 65*/ 0x0bc1e47aL,0x4a82b149L,0x02b65a8aL,0x104cdc8eL,0x24a8f52cL,
+/* 70*/ 0x685c6077L,0xc79f95c9L,0x1d11fe50L,0xc08dafcdL,0x7b1a9a03L,
+/* 75*/ 0x1c1f11d8L,0x84250e7fL,0x979db248L,0xebdc0501L,0xb9553395L,
+/* 80*/ 0xe3c05ea8L,0xb1e51c4cL,0x13b0e681L,0x3b407766L,0x36db3087L,
+/* 85*/ 0xee17c9fcL,0x6c53ecf2L,0xadccc58fL,0xc427660bL,0xefd5867dL,
+/* 90*/ 0x9b6d54a5L,0x6ff1aeffL,0x8e787952L,0x9e2bffe0L,0x8761d034L,
+/* 95*/ 0xe00bdbadL,0xae99a8d3L,0xcc03f6e2L,0xfd0ed807L,0x0e508ae3L,
+/* 100*/ 0xb74182abL,0x4349245dL,0xd120a465L,0xb246a641L,0xaf3b7ab0L,
+/* 105*/ 0x2a6488bbL,0x4b3a0d1fL,0xe7c7e58cL,0x3faff2ebL,0x90445ffdL,
+/* 110*/ 0xcf38c393L,0x995d07e7L,0xf24f1b36L,0x356f6891L,0x6d6ebcbeL,
+/* 115*/ 0x8da9e262L,0x50fd520eL,0x5bca9e1eL,0x37472cf3L,0x69075057L,
+/* 120*/ 0x7ec5fdedL,0x0cab892aL,0xfb2412baL,0x1728debfL,0xa000a988L,
+/* 125*/ 0xd843ce79L,0x042e20ddL,0x4fe8f853L,0x56659c3cL,0x2739d119L,
+/* 130*/ 0xa78a6120L,0x80960375L,0x70420611L,0x85e09f78L,0xabd17e96L,
+/* 135*/ 0x1b513eafL,0x1e01eb63L,0x26ad2133L,0xa890c094L,0x7613cf60L,
+/* 140*/ 0x817e781bL,0xa39113d7L,0xe957fa58L,0x4131b99eL,0x28b1efdaL,
+/* 145*/ 0x66acfba7L,0xff68944aL,0x77a44fd1L,0x7f331522L,0x59ffb3faL,
+/* 150*/ 0xa6df935bL,0xfa12d9dfL,0xc6bf6f3fL,0x89520cf6L,0x659edd6aL,
+/* 155*/ 0x544da739L,0x8b052538L,0x7c30ea21L,0xc2345525L,0x15927fb2L,
+/* 160*/ 0x144a436bL,0xba107b8bL,0x1219ac97L,0x06730432L,0x31831ab3L,
+/* 165*/ 0xc55a5c24L,0xaa0fcd3eL,0xe5606be8L,0x5c88f19bL,0x4c0841eeL,
+/* 170*/ 0x1fe37267L,0x11f9c4f4L,0x9f1b9daeL,0x864e76d0L,0xe637c731L,
+/* 175*/ 0xd97d23a6L,0x32f53d5cL,0xb8161980L,0x93fa0f84L,0xcaef0870L,
+/* 180*/ 0x8874487eL,0x98f2cc73L,0x645fb5c6L,0xcd853659L,0x2062470dL,
+/* 185*/ 0x16ede8e9L,0x6b06dab5L,0x78b43900L,0xfc95b786L,0x5d8e7de1L,
+/* 190*/ 0x465b5954L,0xfe7ba014L,0xf7d23f7bL,0x92bc8b18L,0x03593592L,
+/* 195*/ 0x55cef4f7L,0x74b27317L,0x79de1fc2L,0xc8a0bfbdL,0x229398ccL,
+/* 200*/ 0x62a602ceL,0xbcb94661L,0x5336d206L,0xd2a375feL,0x6a6ab483L,
+/* 205*/ 0x4702a5a4L,0xa2e9d73dL,0x23a2e0f1L,0x9189140aL,0x581d18dcL,
+/* 210*/ 0xb39a922bL,0x82356212L,0xd5f432a9L,0xd356c2a3L,0x5f765b4dL,
+/* 215*/ 0x450afcc8L,0x4415e137L,0xe8ecdfbcL,0xed0de3eaL,0x60d42b13L,
+/* 220*/ 0xf13df971L,0x71fc5da2L,0xc1455340L,0xf087742fL,0xf55e5751L,
+/* 225*/ 0x67b3c1f8L,0xac6b8774L,0x7dcfaaacL,0x95983bc0L,0x489bb0b1L,
+/* 230*/ 0x2c184223L,0x964b6726L,0x2bd3271cL,0x72266472L,0xded64530L,
+/* 235*/ 0x0a2aa343L,0xd4f716a0L,0xb4dad6d9L,0x2184345eL,0x512c990cL,
+/* 240*/ 0x29d92d08L,0x2ebe709aL,0x01144c69L,0x34584b9dL,0xe4634ed6L,
+/* 245*/ 0xecc963cfL,0x3c6984aaL,0x4ed056efL,0x9ca56976L,0x8f3e80d4L,
+/* 250*/ 0xb5bae7c5L,0x30b5caf5L,0x63f33a64L,0xa9e4bbdeL,0xf6b82298L,
+/* 255*/ 0x4d673c1dL
+ /* End of S Box 4 */ },
+
+
+ { /* Start of S Box 5 */
+
+/* 0*/ 0x4b4f1121L,0xba183081L,0xc784f41fL,0xd17d0bacL,0x083d2267L,
+/* 5*/ 0x37b1361eL,0x3581ad05L,0xfda2f6bcL,0x1e892cddL,0xb56d3c3aL,
+/* 10*/ 0x32140e46L,0x138d8aabL,0xe14773d4L,0x5b0e71dfL,0x5d1fe055L,
+/* 15*/ 0x3fb991d3L,0xf1f46c71L,0xa325988cL,0x10f66e80L,0xb1006348L,
+/* 20*/ 0x726a9f60L,0x3b67f8baL,0x4e114ef4L,0x05c52115L,0x4c5ca11cL,
+/* 25*/ 0x99e1efd8L,0x471b83b3L,0xcbf7e524L,0x43ad82f5L,0x690ca93bL,
+/* 30*/ 0xfaa61bb2L,0x12a832b5L,0xb734f943L,0xbd22aea7L,0x88fec626L,
+/* 35*/ 0x5e80c3e7L,0xbe3eaf5eL,0x44617652L,0xa5724475L,0xbb3b9695L,
+/* 40*/ 0x7f3fee8fL,0x964e7debL,0x518c052dL,0x2a0bbc2bL,0xc2175f5cL,
+/* 45*/ 0x9a7b3889L,0xa70d8d0cL,0xeaccdd29L,0xcccd6658L,0x34bb25e6L,
+/* 50*/ 0xb8391090L,0xf651356fL,0x52987c9eL,0x0c16c1cdL,0x8e372d3cL,
+/* 55*/ 0x2fc6ebbdL,0x6e5da3e3L,0xb0e27239L,0x5f685738L,0x45411786L,
+/* 60*/ 0x067f65f8L,0x61778b40L,0x81ab2e65L,0x14c8f0f9L,0xa6b7b4ceL,
+/* 65*/ 0x4036eaecL,0xbf62b00aL,0xecfd5e02L,0x045449a6L,0xb20afd28L,
+/* 70*/ 0x2166d273L,0x0d13a863L,0x89508756L,0xd51a7530L,0x2d653f7aL,
+/* 75*/ 0x3cdbdbc3L,0x80c9df4fL,0x3d5812d9L,0x53fbb1f3L,0xc0f185c0L,
+/* 80*/ 0x7a3c3d7eL,0x68646410L,0x857607a0L,0x1d12622eL,0x97f33466L,
+/* 85*/ 0xdb4c9917L,0x6469607cL,0x566e043dL,0x79ef1edbL,0x2c05898dL,
+/* 90*/ 0xc9578e25L,0xcd380101L,0x46e04377L,0x7d1cc7a9L,0x6552b837L,
+/* 95*/ 0x20192608L,0xb97500c5L,0xed296b44L,0x368648b4L,0x62995cd5L,
+/* 100*/ 0x82731400L,0xf9aebd8bL,0x3844c0c7L,0x7c2de794L,0x33a1a770L,
+/* 105*/ 0x8ae528c2L,0x5a2be812L,0x1f8f4a07L,0x2b5ed7caL,0x937eb564L,
+/* 110*/ 0x6fda7e11L,0xe49b5d6cL,0xb4b3244eL,0x18aa53a4L,0x3a061334L,
+/* 115*/ 0x4d6067a3L,0x83ba5868L,0x9bdf4dfeL,0x7449f261L,0x709f8450L,
+/* 120*/ 0xcad133cbL,0xde941c3fL,0xf52ae484L,0x781d77edL,0x7e4395f0L,
+/* 125*/ 0xae103b59L,0x922331bbL,0x42ce50c8L,0xe6f08153L,0xe7d941d0L,
+/* 130*/ 0x5028ed6bL,0xb3d2c49bL,0xad4d9c3eL,0xd201fb6eL,0xa45bd5beL,
+/* 135*/ 0xffcb7f4bL,0x579d7806L,0xf821bb5bL,0x59d592adL,0xd0be0c31L,
+/* 140*/ 0xd4e3b676L,0x0107165aL,0x0fe939d2L,0x49bcaafdL,0x55ffcfe5L,
+/* 145*/ 0x2ec1f783L,0xf39a09a5L,0x3eb42772L,0x19b55a5dL,0x024a0679L,
+/* 150*/ 0x8c83b3f7L,0x8642ba1dL,0xacacd9eaL,0x87d352c4L,0x60931f45L,
+/* 155*/ 0xa05f97d7L,0x1cecd42cL,0xe2fcc87bL,0xb60f94e2L,0x67a34b0bL,
+/* 160*/ 0xfcdd40c9L,0x0b150a27L,0xd3ee9e04L,0x582e29e9L,0x4ac22b41L,
+/* 165*/ 0x6ac4e1b8L,0xbccaa51aL,0x237af30eL,0xebc3b709L,0xc4a59d19L,
+/* 170*/ 0x284bc98aL,0xe9d41a93L,0x6bfa2018L,0x73b2d651L,0x11f9a2faL,
+/* 175*/ 0xce09bff1L,0x41a470aaL,0x25888f22L,0x77e754e8L,0xf7330d8eL,
+/* 180*/ 0x158eab16L,0xc5d68842L,0xc685a6f6L,0xe5b82fdeL,0x09ea3a96L,
+/* 185*/ 0x6dde1536L,0x4fa919daL,0x26c0be9fL,0x9eed6f69L,0xf05555f2L,
+/* 190*/ 0xe06fc285L,0x9cd76d23L,0xaf452a92L,0xefc74cb7L,0x9d6b4732L,
+/* 195*/ 0x8be408eeL,0x22401d0dL,0xee6c459dL,0x7587cb82L,0xe8746862L,
+/* 200*/ 0x5cbdde87L,0x98794278L,0x31afb94dL,0xc11e0f2fL,0x30e8fc2aL,
+/* 205*/ 0xcf3261efL,0x1a3023e1L,0xaa2f86cfL,0xf202e24aL,0x8d08dcffL,
+/* 210*/ 0x764837c6L,0xa26374ccL,0x9f7c3e88L,0x949cc57dL,0xdd26a07fL,
+/* 215*/ 0xc39efab0L,0xc8f879a1L,0xdce67bb9L,0xf4b0a435L,0x912c9ae0L,
+/* 220*/ 0xd85603e4L,0x953a9bbfL,0xfb8290d6L,0x0aebcd5fL,0x16206a9aL,
+/* 225*/ 0x6c787a14L,0xd9a0f16aL,0x29bf4f74L,0x8f8bce91L,0x0e5a9354L,
+/* 230*/ 0xab038cb1L,0x1b8ad11bL,0xe327ff49L,0x0053da20L,0x90cf51dcL,
+/* 235*/ 0xda92fe6dL,0x0390ca47L,0xa8958097L,0xa9dc5bafL,0x3931e3c1L,
+/* 240*/ 0x840446b6L,0x63d069fbL,0xd7460299L,0x7124ecd1L,0x0791e613L,
+/* 245*/ 0x485918fcL,0xd635d04cL,0xdf96ac33L,0x66f2d303L,0x247056aeL,
+/* 250*/ 0xa1a7b2a8L,0x27d8cc9cL,0x17b6e998L,0x7bf5590fL,0xfe97f557L,
+/* 255*/ 0x5471d8a2L
+ /* End of S Box 5 */ },
+
+
+ { /* Start of S Box 6 */
+
+/* 0*/ 0x83a327a1L,0x9f379f51L,0x40a7d007L,0x11307423L,0x224587c1L,
+/* 5*/ 0xac27d63bL,0x3b7e64eaL,0x2e1cbfa6L,0x09996000L,0x03bc0e2cL,
+/* 10*/ 0xd4c4478aL,0x4542e0abL,0xfeda26d4L,0xc1d10fcbL,0x8252f596L,
+/* 15*/ 0x4494eb5cL,0xa362f314L,0xf5ba81fdL,0x75c3a376L,0x4ca214caL,
+/* 20*/ 0xe164deddL,0x5088fa97L,0x4b0930e0L,0x2fcfb7e8L,0x33a6f4b2L,
+/* 25*/ 0xc7e94211L,0x2d66c774L,0x43be8baeL,0xc663d445L,0x908eb130L,
+/* 30*/ 0xf4e3be15L,0x63b9d566L,0x529396b5L,0x1e1be743L,0x4d5ff63fL,
+/* 35*/ 0x985e4a83L,0x71ab9df7L,0xc516c6f5L,0x85c19ab4L,0x1f4daee4L,
+/* 40*/ 0xf2973431L,0xb713dc5eL,0x3f2e159aL,0xc824da16L,0x06bf376aL,
+/* 45*/ 0xb2fe23ecL,0xe39b1c22L,0xf1eecb5fL,0x08e82d52L,0x565686c2L,
+/* 50*/ 0xab0aea93L,0xfd47219fL,0xebdbabd7L,0x2404a185L,0x8c7312b9L,
+/* 55*/ 0xa8f2d828L,0x0c8902daL,0x65b42b63L,0xc0bbef62L,0x4e3e4cefL,
+/* 60*/ 0x788f8018L,0xee1ebab7L,0x93928f9dL,0x683d2903L,0xd3b60689L,
+/* 65*/ 0xafcb0ddcL,0x88a4c47aL,0xf6dd9c3dL,0x7ea5fca0L,0x8a6d7244L,
+/* 70*/ 0xbe11f120L,0x04ff91b8L,0x8d2dc8c0L,0x27f97fdbL,0x7f9e1f47L,
+/* 75*/ 0x1734f0c7L,0x26f3ed8eL,0x0df8f2bfL,0xb0833d9eL,0xe420a4e5L,
+/* 80*/ 0xa423cae6L,0x95616772L,0x9ae6c049L,0x075941f2L,0xd8e12812L,
+/* 85*/ 0x000f6f4fL,0x3c0d6b05L,0x6cef921cL,0xb82bc264L,0x396cb008L,
+/* 90*/ 0x5d608a6fL,0x6d7782c8L,0x186550aaL,0x6b6fec09L,0x28e70b13L,
+/* 95*/ 0x57ce5688L,0xecd3af84L,0x23335a95L,0x91f40cd2L,0x7b6a3b26L,
+/* 100*/ 0xbd32b3b6L,0x3754a6fbL,0x8ed088f0L,0xf867e87cL,0x20851746L,
+/* 105*/ 0x6410f9c6L,0x35380442L,0xc2ca10a7L,0x1adea27fL,0x76bddd79L,
+/* 110*/ 0x92742cf4L,0x0e98f7eeL,0x164e931dL,0xb9c835b3L,0x69060a99L,
+/* 115*/ 0xb44c531eL,0xfa7b66feL,0xc98a5b53L,0x7d95aae9L,0x302f467bL,
+/* 120*/ 0x74b811deL,0xf3866abdL,0xb5b3d32dL,0xfc3157a4L,0xd251fe19L,
+/* 125*/ 0x0b5d8eacL,0xda71ffd5L,0x47ea05a3L,0x05c6a9e1L,0xca0ee958L,
+/* 130*/ 0x9939034dL,0x25dc5edfL,0x79083cb1L,0x86768450L,0xcf757d6dL,
+/* 135*/ 0x5972b6bcL,0xa78d59c9L,0xc4ad8d41L,0x2a362ad3L,0xd1179991L,
+/* 140*/ 0x601407ffL,0xdcf50917L,0x587069d0L,0xe0821ed6L,0xdbb59427L,
+/* 145*/ 0x73911a4bL,0x7c904fc3L,0x844afb92L,0x6f8c955dL,0xe8c0c5bbL,
+/* 150*/ 0xb67ab987L,0xa529d96cL,0xf91f7181L,0x618b1b06L,0xe718bb0cL,
+/* 155*/ 0x8bd7615bL,0xd5a93a59L,0x54aef81bL,0x772136e3L,0xce44fd9cL,
+/* 160*/ 0x10cda57eL,0x87d66e0bL,0x3d798967L,0x1b2c1804L,0x3edfbd68L,
+/* 165*/ 0x15f6e62bL,0xef68b854L,0x3896db35L,0x12b7b5e2L,0xcb489029L,
+/* 170*/ 0x9e4f98a5L,0x62eb77a8L,0x217c24a2L,0x964152f6L,0x49b2080aL,
+/* 175*/ 0x53d23ee7L,0x48fb6d69L,0x1903d190L,0x9449e494L,0xbf6e7886L,
+/* 180*/ 0xfb356cfaL,0x3a261365L,0x424bc1ebL,0xa1192570L,0x019ca782L,
+/* 185*/ 0x9d3f7e0eL,0x9c127575L,0xedf02039L,0xad57bcceL,0x5c153277L,
+/* 190*/ 0x81a84540L,0xbcaa7356L,0xccd59b60L,0xa62a629bL,0xa25ccd10L,
+/* 195*/ 0x2b5b65cfL,0x1c535832L,0x55fd4e3aL,0x31d9790dL,0xf06bc37dL,
+/* 200*/ 0x4afc1d71L,0xaeed5533L,0xba461634L,0xbb694b78L,0x5f3a5c73L,
+/* 205*/ 0x6a3c764aL,0x8fb0cca9L,0xf725684cL,0x4fe5382fL,0x1d0163afL,
+/* 210*/ 0x5aa07a8fL,0xe205a8edL,0xc30bad38L,0xff22cf1fL,0x72432e2eL,
+/* 215*/ 0x32c2518bL,0x3487ce4eL,0x7ae0ac02L,0x709fa098L,0x0a3b395aL,
+/* 220*/ 0x5b4043f8L,0xa9e48c36L,0x149a8521L,0xd07dee6bL,0x46acd2f3L,
+/* 225*/ 0x8958dffcL,0xb3a1223cL,0xb11d31c4L,0xcd7f4d3eL,0x0f28e3adL,
+/* 230*/ 0xe5b100beL,0xaac54824L,0xe9c9d7baL,0x9bd47001L,0x80f149b0L,
+/* 235*/ 0x66022f0fL,0x020c4048L,0x6efa192aL,0x67073f8dL,0x13ec7bf9L,
+/* 240*/ 0x3655011aL,0xe6afe157L,0xd9845f6eL,0xdecc4425L,0x511ae2ccL,
+/* 245*/ 0xdf81b4d8L,0xd7809e55L,0xd6d883d9L,0x2cc7978cL,0x5e787cc5L,
+/* 250*/ 0xdd0033d1L,0xa050c937L,0x97f75dcdL,0x299de580L,0x41e2b261L,
+/* 255*/ 0xea5a54f1L
+ /* End of S Box 6 */ },
+
+
+ { /* Start of S Box 7 */
+
+/* 0*/ 0x7e672590L,0xbea513bbL,0x2c906fe6L,0x86029c2bL,0x55dc4f74L,
+/* 5*/ 0x0553398eL,0x63e09647L,0xcafd0babL,0x264c37dfL,0x8272210fL,
+/* 10*/ 0x67afa669L,0x12d98a5fL,0x8cab23c4L,0x75c68bd1L,0xc3370470L,
+/* 15*/ 0x33f37f4eL,0x283992ffL,0xe73a3a67L,0x1032f283L,0xf5ad9fc2L,
+/* 20*/ 0x963f0c5dL,0x664fbc45L,0x202ba41cL,0xc7c02d80L,0x54731e84L,
+/* 25*/ 0x8a1085f5L,0x601d80fbL,0x2f968e55L,0x35e96812L,0xe45a8f78L,
+/* 30*/ 0xbd7de662L,0x3b6e6eadL,0x8097c5efL,0x070b6781L,0xb1e508f3L,
+/* 35*/ 0x24e4fae3L,0xb81a7805L,0xec0fc918L,0x43c8774bL,0x9b2512a9L,
+/* 40*/ 0x2b05ad04L,0x32c2536fL,0xedf236e0L,0x8bc4b0cfL,0xbaceb837L,
+/* 45*/ 0x4535b289L,0x0d0e94c3L,0xa5a371d0L,0xad695a58L,0x39e3437dL,
+/* 50*/ 0x9186bffcL,0x21038c3bL,0x0aa9dff9L,0x5d1f06ceL,0x62def8a4L,
+/* 55*/ 0xf740a2b4L,0xa2575868L,0x682683c1L,0xdbb30facL,0x61fe1928L,
+/* 60*/ 0x468a6511L,0xc61cd5f4L,0xe54d9800L,0x6b98d7f7L,0x8418b6a5L,
+/* 65*/ 0x5f09a5d2L,0x90b4e80bL,0x49b2c852L,0x69f11c77L,0x17412b7eL,
+/* 70*/ 0x7f6fc0edL,0x56838dccL,0x6e9546a2L,0xd0758619L,0x087b9b9aL,
+/* 75*/ 0xd231a01dL,0xaf46d415L,0x097060fdL,0xd920f657L,0x882d3f9fL,
+/* 80*/ 0x3ae7c3c9L,0xe8a00d9bL,0x4fe67ebeL,0x2ef80eb2L,0xc1916b0cL,
+/* 85*/ 0xf4dffea0L,0xb97eb3ebL,0xfdff84ddL,0xff8b14f1L,0xe96b0572L,
+/* 90*/ 0xf64b508cL,0xae220a6eL,0x4423ae5aL,0xc2bece5eL,0xde27567cL,
+/* 95*/ 0xfc935c63L,0x47075573L,0xe65b27f0L,0xe121fd22L,0xf2668753L,
+/* 100*/ 0x2debf5d7L,0x8347e08dL,0xac5eda03L,0x2a7cebe9L,0x3fe8d92eL,
+/* 105*/ 0x23542fe4L,0x1fa7bd50L,0xcf9b4102L,0x9d0dba39L,0x9cb8902aL,
+/* 110*/ 0xa7249d8bL,0x0f6d667aL,0x5ebfa9ecL,0x6a594df2L,0x79600938L,
+/* 115*/ 0x023b7591L,0xea2c79c8L,0xc99d07eaL,0x64cb5ee1L,0x1a9cab3dL,
+/* 120*/ 0x76db9527L,0xc08e012fL,0x3dfb481aL,0x872f22e7L,0x2948d15cL,
+/* 125*/ 0xa4782c79L,0x6f50d232L,0x78f0728aL,0x5a87aab1L,0xc4e2c19cL,
+/* 130*/ 0xee767387L,0x1b2a1864L,0x7b8d10d3L,0xd1713161L,0x0eeac456L,
+/* 135*/ 0xd8799e06L,0xb645b548L,0x4043cb65L,0xa874fb29L,0x4b12d030L,
+/* 140*/ 0x7d687413L,0x18ef9a1fL,0xd7631d4cL,0x5829c7daL,0xcdfa30faL,
+/* 145*/ 0xc5084bb0L,0x92cd20e2L,0xd4c16940L,0x03283ec0L,0xa917813fL,
+/* 150*/ 0x9a587d01L,0x70041f8fL,0xdc6ab1dcL,0xddaee3d5L,0x31829742L,
+/* 155*/ 0x198c022dL,0x1c9eafcbL,0x5bbc6c49L,0xd3d3293aL,0x16d50007L,
+/* 160*/ 0x04bb8820L,0x3c5c2a41L,0x37ee7af8L,0x8eb04025L,0x9313ecbaL,
+/* 165*/ 0xbffc4799L,0x8955a744L,0xef85d633L,0x504499a7L,0xa6ca6a86L,
+/* 170*/ 0xbb3d3297L,0xb34a8236L,0x6dccbe4fL,0x06143394L,0xce19fc7bL,
+/* 175*/ 0xccc3c6c6L,0xe36254aeL,0x77b7eda1L,0xa133dd9eL,0xebf9356aL,
+/* 180*/ 0x513ccf88L,0xe2a1b417L,0x972ee5bdL,0x853824cdL,0x5752f4eeL,
+/* 185*/ 0x6c1142e8L,0x3ea4f309L,0xb2b5934aL,0xdfd628aaL,0x59acea3eL,
+/* 190*/ 0xa01eb92cL,0x389964bcL,0xda305dd4L,0x019a59b7L,0x11d2ca93L,
+/* 195*/ 0xfaa6d3b9L,0x4e772ecaL,0x72651776L,0xfb4e5b0eL,0xa38f91a8L,
+/* 200*/ 0x1d0663b5L,0x30f4f192L,0xb50051b6L,0xb716ccb3L,0x4abd1b59L,
+/* 205*/ 0x146c5f26L,0xf134e2deL,0x00f67c6cL,0xb0e1b795L,0x98aa4ec7L,
+/* 210*/ 0x0cc73b34L,0x654276a3L,0x8d1ba871L,0x740a5216L,0xe0d01a23L,
+/* 215*/ 0x9ed161d6L,0x9f36a324L,0x993ebb7fL,0xfeb9491bL,0x365ddcdbL,
+/* 220*/ 0x810cffc5L,0x71ec0382L,0x2249e7bfL,0x48817046L,0xf3a24a5bL,
+/* 225*/ 0x4288e4d9L,0x0bf5c243L,0x257fe151L,0x95b64c0dL,0x4164f066L,
+/* 230*/ 0xaaf7db08L,0x73b1119dL,0x8f9f7bb8L,0xd6844596L,0xf07a34a6L,
+/* 235*/ 0x53943d0aL,0xf9dd166dL,0x7a8957afL,0xf8ba3ce5L,0x27c9621eL,
+/* 240*/ 0x5cdae910L,0xc8518998L,0x941538feL,0x136115d8L,0xaba8443cL,
+/* 245*/ 0x4d01f931L,0x34edf760L,0xb45f266bL,0xd5d4de14L,0x52d8ac35L,
+/* 250*/ 0x15cfd885L,0xcbc5cd21L,0x4cd76d4dL,0x7c80ef54L,0xbc92ee75L,
+/* 255*/ 0x1e56a1f6L
+ /* End of S Box 7 */ },
+
+
+ { /* Start of S Box 8 */
+
+/* 0*/ 0xbaa20b6cL,0x9ffbad26L,0xe1f7d738L,0x794aec8dL,0xc9e9cf3cL,
+/* 5*/ 0x8a9a7846L,0xc57c4685L,0xb9a92fedL,0x29cb141fL,0x52f9ddb7L,
+/* 10*/ 0xf68ba6bcL,0x19ccc020L,0x4f584aaaL,0x3bf6a596L,0x003b7cf7L,
+/* 15*/ 0x54f0ce9aL,0xa7ec4303L,0x46cf0077L,0x78d33aa1L,0x215247d9L,
+/* 20*/ 0x74bcdf91L,0x08381d30L,0xdac43e40L,0x64872531L,0x0beffe5fL,
+/* 25*/ 0xb317f457L,0xaebb12daL,0xd5d0d67bL,0x7d75c6b4L,0x42a6d241L,
+/* 30*/ 0x1502d0a9L,0x3fd97fffL,0xc6c3ed28L,0x81868d0aL,0x92628bc5L,
+/* 35*/ 0x86679544L,0xfd1867afL,0x5ca3ea61L,0x568d5578L,0x4a2d71f4L,
+/* 40*/ 0x43c9d549L,0x8d95de2bL,0x6e5c74a0L,0x9120ffc7L,0x0d05d14aL,
+/* 45*/ 0xa93049d3L,0xbfa80e17L,0xf4096810L,0x043f5ef5L,0xa673b4f1L,
+/* 50*/ 0x6d780298L,0xa4847783L,0x5ee726fbL,0x9934c281L,0x220a588cL,
+/* 55*/ 0x384e240fL,0x933d5c69L,0x39e5ef47L,0x26e8b8f3L,0x4c1c6212L,
+/* 60*/ 0x8040f75dL,0x074b7093L,0x6625a8d7L,0x36298945L,0x76285088L,
+/* 65*/ 0x651d37c3L,0x24f5274dL,0xdbca3dabL,0x186b7ee1L,0xd80f8182L,
+/* 70*/ 0x14210c89L,0x943a3075L,0x4e6e11c4L,0x4d7e6badL,0xf05064c8L,
+/* 75*/ 0x025dcd97L,0x4bc10302L,0x7cede572L,0x8f90a970L,0xab88eebaL,
+/* 80*/ 0xb5998029L,0x5124d839L,0xb0eeb6a3L,0x89ddabdcL,0xe8074d76L,
+/* 85*/ 0xa1465223L,0x32518cf2L,0x9d39d4ebL,0xc0d84524L,0xe35e6ea8L,
+/* 90*/ 0x7abf3804L,0x113e2348L,0x9ae6069dL,0xb4dfdabbL,0xa8c5313fL,
+/* 95*/ 0x23ea3f79L,0x530e36a2L,0xa5fd228bL,0x95d1d350L,0x2b14cc09L,
+/* 100*/ 0x40042956L,0x879d05ccL,0x2064b9caL,0xacaca40eL,0xb29c846eL,
+/* 105*/ 0x9676c9e3L,0x752b7b8aL,0x7be2bcc2L,0x6bd58f5eL,0xd48f4c32L,
+/* 110*/ 0x606835e4L,0x9cd7c364L,0x2c269b7aL,0x3a0d079cL,0x73b683feL,
+/* 115*/ 0x45374f1eL,0x10afa242L,0x577f8666L,0xddaa10f6L,0xf34f561cL,
+/* 120*/ 0x3d355d6bL,0xe47048aeL,0xaa13c492L,0x050344fdL,0x2aab5151L,
+/* 125*/ 0xf5b26ae5L,0xed919a59L,0x5ac67900L,0xf1cde380L,0x0c79a11bL,
+/* 130*/ 0x351533fcL,0xcd4d8e36L,0x1f856005L,0x690b9fddL,0xe736dccfL,
+/* 135*/ 0x1d47bf6aL,0x7f66c72aL,0x85f21b7fL,0x983cbdb6L,0x01ebbebfL,
+/* 140*/ 0x035f3b99L,0xeb111f34L,0x28cefdc6L,0x5bfc9ecdL,0xf22eacb0L,
+/* 145*/ 0x9e41cbb2L,0xe0f8327cL,0x82e3e26fL,0xfc43fc86L,0xd0ba66dfL,
+/* 150*/ 0x489ef2a7L,0xd9e0c81dL,0x68690d52L,0xcc451367L,0xc2232e16L,
+/* 155*/ 0xe95a7335L,0x0fdae19bL,0xff5b962cL,0x97596527L,0xc46db333L,
+/* 160*/ 0x3ed4c562L,0xc14c9d9eL,0x5d6faa21L,0x638e940dL,0xf9316d58L,
+/* 165*/ 0x47b3b0eaL,0x30ffcad2L,0xce1bba7dL,0x1e6108e6L,0x2e1ea33dL,
+/* 170*/ 0x507bf05bL,0xfafef94bL,0xd17de8e2L,0x5598b214L,0x1663f813L,
+/* 175*/ 0x17d25a2dL,0xeefa5ff9L,0x582f4e37L,0x12128773L,0xfef17ab8L,
+/* 180*/ 0x06005322L,0xbb32bbc9L,0x8c898508L,0x592c15f0L,0xd38a4054L,
+/* 185*/ 0x4957b7d6L,0xd2b891dbL,0x37bd2d3eL,0x34ad20cbL,0x622288e9L,
+/* 190*/ 0x2dc7345aL,0xafb416c0L,0x1cf459b1L,0xdc7739faL,0x0a711a25L,
+/* 195*/ 0x13e18a0cL,0x5f72af4cL,0x6ac8db11L,0xbe53c18eL,0x1aa569b9L,
+/* 200*/ 0xef551ea4L,0xa02a429fL,0xbd16e790L,0x7eb9171aL,0x77d693d8L,
+/* 205*/ 0x8e06993aL,0x9bde7560L,0xe5801987L,0xc37a09beL,0xb8db76acL,
+/* 210*/ 0xe2087294L,0x6c81616dL,0xb7f30fe7L,0xbc9b82bdL,0xfba4e4d4L,
+/* 215*/ 0xc7b1012fL,0xa20c043bL,0xde9febd0L,0x2f9297ceL,0xe610aef8L,
+/* 220*/ 0x70b06f19L,0xc86ae00bL,0x0e01988fL,0x41192ae0L,0x448c1cb5L,
+/* 225*/ 0xadbe92eeL,0x7293a007L,0x1b54b5b3L,0xd61f63d1L,0xeae40a74L,
+/* 230*/ 0x61a72b55L,0xec83a7d5L,0x88942806L,0x90a07da5L,0xd7424b95L,
+/* 235*/ 0x67745b4eL,0xa31a1853L,0xca6021efL,0xdfb56c4fL,0xcbc2d915L,
+/* 240*/ 0x3c48e918L,0x8bae3c63L,0x6f659c71L,0xf8b754c1L,0x2782f3deL,
+/* 245*/ 0xf796f168L,0x71492c84L,0x33c0f5a6L,0x3144f6ecL,0x25dc412eL,
+/* 250*/ 0xb16c5743L,0x83a1fa7eL,0x0997b101L,0xb627e6e8L,0xcf33905cL,
+/* 255*/ 0x8456fb65L
+ /* End of S Box 8 */ },
+
+
+ { /* Start of S Box 9 */
+
+/* 0*/ 0xb29bea74L,0xc35da605L,0x305c1ca3L,0xd2e9f5bcL,0x6fd5bff4L,
+/* 5*/ 0xff347703L,0xfc45b163L,0xf498e068L,0xb71229fcL,0x81acc3fbL,
+/* 10*/ 0x78538a8bL,0x984ecf81L,0xa5da47a4L,0x8f259eefL,0x6475dc65L,
+/* 15*/ 0x081865b9L,0x49e14a3cL,0x19e66079L,0xd382e91bL,0x5b109794L,
+/* 20*/ 0x3f9f81e1L,0x4470a388L,0x41601abeL,0xaaf9f407L,0x8e175ef6L,
+/* 25*/ 0xed842297L,0x893a4271L,0x1790839aL,0xd566a99eL,0x6b417deeL,
+/* 30*/ 0x75c90d23L,0x715edb31L,0x723553f7L,0x9afb50c9L,0xfbc5f600L,
+/* 35*/ 0xcd3b6a4eL,0x97ed0fbaL,0x29689aecL,0x63135c8eL,0xf0e26c7eL,
+/* 40*/ 0x0692ae7fL,0xdbb208ffL,0x2ede3e9bL,0x6a65bebdL,0xd40867e9L,
+/* 45*/ 0xc954afc5L,0x73b08201L,0x7ffdf809L,0x1195c24fL,0x1ca5adcaL,
+/* 50*/ 0x74bd6d1fL,0xb393c455L,0xcadfd3faL,0x99f13011L,0x0ebca813L,
+/* 55*/ 0x60e791b8L,0x6597ac7aL,0x18a7e46bL,0x09cb49d3L,0x0b27df6dL,
+/* 60*/ 0xcfe52f87L,0xcef66837L,0xe6328035L,0xfa87c592L,0x37baff93L,
+/* 65*/ 0xd71fcc99L,0xdcab205cL,0x4d7a5638L,0x48012510L,0x62797558L,
+/* 70*/ 0xb6cf1fe5L,0xbc311834L,0x9c2373acL,0x14ec6175L,0xa439cbdfL,
+/* 75*/ 0x54afb0eaL,0xd686960bL,0xfdd0d47bL,0x7b063902L,0x8b78bac3L,
+/* 80*/ 0x26c6a4d5L,0x5c0055b6L,0x2376102eL,0x0411783eL,0x2aa3f1cdL,
+/* 85*/ 0x51fc6ea8L,0x701ce243L,0x9b2a0abbL,0x0ad93733L,0x6e80d03dL,
+/* 90*/ 0xaf6295d1L,0xf629896fL,0xa30b0648L,0x463d8dd4L,0x963f84cbL,
+/* 95*/ 0x01ff94f8L,0x8d7fefdcL,0x553611c0L,0xa97c1719L,0xb96af759L,
+/* 100*/ 0xe0e3c95eL,0x0528335bL,0x21fe5925L,0x821a5245L,0x807238b1L,
+/* 105*/ 0x67f23db5L,0xea6b4eabL,0x0da6f985L,0xab1bc85aL,0xef8c90e4L,
+/* 110*/ 0x4526230eL,0x38eb8b1cL,0x1b91cd91L,0x9fce5f0cL,0xf72cc72bL,
+/* 115*/ 0xc64f2617L,0xdaf7857dL,0x7d373cf1L,0x28eaedd7L,0x203887d0L,
+/* 120*/ 0xc49a155fL,0xa251b3b0L,0xf2d47ae3L,0x3d9ef267L,0x4a94ab2fL,
+/* 125*/ 0x7755a222L,0x0205e329L,0xc28fa7a7L,0xaec1fe51L,0x270f164cL,
+/* 130*/ 0x8c6d01bfL,0x53b5bc98L,0xc09d3febL,0x834986ccL,0x4309a12cL,
+/* 135*/ 0x578b2a96L,0x3bb74b86L,0x69561b4aL,0x037e32f3L,0xde335b08L,
+/* 140*/ 0xc5156be0L,0xe7ef09adL,0x93b834c7L,0xa7719352L,0x59302821L,
+/* 145*/ 0xe3529d26L,0xf961da76L,0xcb142c44L,0xa0f3b98dL,0x76502457L,
+/* 150*/ 0x945a414bL,0x078eeb12L,0xdff8de69L,0xeb6c8c2dL,0xbda90c4dL,
+/* 155*/ 0xe9c44d16L,0x168dfd66L,0xad64763bL,0xa65fd764L,0x95a29c06L,
+/* 160*/ 0x32d7713fL,0x40f0b277L,0x224af08fL,0x004cb5e8L,0x92574814L,
+/* 165*/ 0x8877d827L,0x3e5b2d04L,0x68c2d5f2L,0x86966273L,0x1d433adaL,
+/* 170*/ 0x8774988aL,0x3c0e0bfeL,0xddad581dL,0x2fd654edL,0x0f4769fdL,
+/* 175*/ 0xc181ee9dL,0x5fd88f61L,0x341dbb3aL,0x528543f9L,0xd92235cfL,
+/* 180*/ 0x1ea82eb4L,0xb5cd790fL,0x91d24f1eL,0xa869e6c2L,0x61f474d2L,
+/* 185*/ 0xcc205addL,0x0c7bfba9L,0xbf2b0489L,0xb02d72d8L,0x2b46ece6L,
+/* 190*/ 0xe4dcd90aL,0xb8a11440L,0xee8a63b7L,0x854dd1a1L,0xd1e00583L,
+/* 195*/ 0x42b40e24L,0x9e8964deL,0xb4b35d78L,0xbec76f6eL,0x24b9c620L,
+/* 200*/ 0xd8d399a6L,0x5adb2190L,0x2db12730L,0x3a5866afL,0x58c8fadbL,
+/* 205*/ 0x5d8844e7L,0x8a4bf380L,0x15a01d70L,0x79f5c028L,0x66be3b8cL,
+/* 210*/ 0xf3e42b53L,0x56990039L,0x2c0c3182L,0x5e16407cL,0xecc04515L,
+/* 215*/ 0x6c440284L,0x4cb6701aL,0x13bfc142L,0x9d039f6aL,0x4f6e92c8L,
+/* 220*/ 0xa1407c62L,0x8483a095L,0xc70ae1c4L,0xe20213a2L,0xbacafc41L,
+/* 225*/ 0x4ecc12b3L,0x4bee3646L,0x1fe807aeL,0x25217f9cL,0x35dde5f5L,
+/* 230*/ 0x7a7dd6ceL,0xf89cce50L,0xac07b718L,0x7e73d2c6L,0xe563e76cL,
+/* 235*/ 0x123ca536L,0x3948ca56L,0x9019dd49L,0x10aa88d9L,0xc82451e2L,
+/* 240*/ 0x473eb6d6L,0x506fe854L,0xe8bb03a5L,0x332f4c32L,0xfe1e1e72L,
+/* 245*/ 0xb1ae572aL,0x7c0d7bc1L,0xe1c37eb2L,0xf542aa60L,0xf1a48ea0L,
+/* 250*/ 0xd067b89fL,0xbbfa195dL,0x1a049b0dL,0x315946aaL,0x36d1b447L,
+/* 255*/ 0x6d2ebdf0L
+ /* End of S Box 9 */ },
+
+
+ { /* Start of S Box 10 */
+
+/* 0*/ 0x0d188a6dL,0x12cea0dbL,0x7e63740eL,0x6a444821L,0x253d234fL,
+/* 5*/ 0x6ffc6597L,0x94a6bdefL,0x33ee1b2fL,0x0a6c00c0L,0x3aa336b1L,
+/* 10*/ 0x5af55d17L,0x265fb3dcL,0x0e89cf4dL,0x0786b008L,0xc80055b8L,
+/* 15*/ 0x6b17c3ceL,0x72b05a74L,0xd21a8d78L,0xa6b70840L,0xfe8eae77L,
+/* 20*/ 0xed69565cL,0x55e1bcf4L,0x585c2f60L,0xe06f1a62L,0xad67c0cdL,
+/* 25*/ 0x7712af88L,0x9cc26acaL,0x1888053dL,0x37eb853eL,0x9215abd7L,
+/* 30*/ 0xde30adfcL,0x1f1038e6L,0x70c51c8aL,0x8d586c26L,0xf72bdd90L,
+/* 35*/ 0x4dc3ce15L,0x68eaeefaL,0xd0e9c8b9L,0x200f9c44L,0xddd141baL,
+/* 40*/ 0x024bf1d3L,0x0f64c9d4L,0xc421e9e9L,0x9d11c14cL,0x9a0dd9e4L,
+/* 45*/ 0x5f92ec19L,0x1b980df0L,0x1dcc4542L,0xb8fe8c56L,0x0c9c9167L,
+/* 50*/ 0x4e81eb49L,0xca368f27L,0xe3603b37L,0xea08acccL,0xac516992L,
+/* 55*/ 0xc34f513bL,0x804d100dL,0x6edca4c4L,0xfc912939L,0x29d219b0L,
+/* 60*/ 0x278aaa3cL,0x4868da7dL,0x54e890b7L,0xb46d735aL,0x514589aaL,
+/* 65*/ 0xd6c630afL,0x4980dfe8L,0xbe3ccc55L,0x59d41202L,0x650c078bL,
+/* 70*/ 0xaf3a9e7bL,0x3ed9827aL,0x9e79fc6eL,0xaadbfbaeL,0xc5f7d803L,
+/* 75*/ 0x3daf7f50L,0x67b4f465L,0x73406e11L,0x39313f8cL,0x8a6e6686L,
+/* 80*/ 0xd8075f1fL,0xd3cbfed1L,0x69c7e49cL,0x930581e0L,0xe4b1a5a8L,
+/* 85*/ 0xbbc45472L,0x09ddbf58L,0xc91d687eL,0xbdbffda5L,0x88c08735L,
+/* 90*/ 0xe9e36bf9L,0xdb5ea9b6L,0x95559404L,0x08f432fbL,0xe24ea281L,
+/* 95*/ 0x64663579L,0x000b8010L,0x7914e7d5L,0x32fd0473L,0xd1a7f0a4L,
+/* 100*/ 0x445ab98eL,0xec72993fL,0xa29a4d32L,0xb77306d8L,0xc7c97cf6L,
+/* 105*/ 0x7b6ab645L,0xf5ef7adfL,0xfb2e15f7L,0xe747f757L,0x5e944354L,
+/* 110*/ 0x234a2669L,0x47e46359L,0x9b9d11a9L,0x40762cedL,0x56f1de98L,
+/* 115*/ 0x11334668L,0x890a9a70L,0x1a296113L,0xb3bd4af5L,0x163b7548L,
+/* 120*/ 0xd51b4f84L,0xb99b2abcL,0x3cc1dc30L,0xa9f0b56cL,0x812272b2L,
+/* 125*/ 0x0b233a5fL,0xb650dbf2L,0xf1a0771bL,0x36562b76L,0xdc037b0fL,
+/* 130*/ 0x104c97ffL,0xc2ec98d2L,0x90596f22L,0x28b6620bL,0xdf42b212L,
+/* 135*/ 0xfdbc4243L,0xf3fb175eL,0x4a2d8b00L,0xe8f3869bL,0x30d69bc3L,
+/* 140*/ 0x853714c8L,0xa7751d2eL,0x31e56deaL,0xd4840b0cL,0x9685d783L,
+/* 145*/ 0x068c9333L,0x8fba032cL,0x76d7bb47L,0x6d0ee22bL,0xb546794bL,
+/* 150*/ 0xd971b894L,0x8b09d253L,0xa0ad5761L,0xee77ba06L,0x46359f31L,
+/* 155*/ 0x577cc7ecL,0x52825efdL,0xa4beed95L,0x9825c52aL,0xeb48029aL,
+/* 160*/ 0xbaae59f8L,0xcf490ee1L,0xbc990164L,0x8ca49dfeL,0x4f38a6e7L,
+/* 165*/ 0x2ba98389L,0x8228f538L,0x199f64acL,0x01a1cac5L,0xa8b51641L,
+/* 170*/ 0x5ce72d01L,0x8e5df26bL,0x60f28e1eL,0xcd5be125L,0xe5b376bfL,
+/* 175*/ 0x1c8d3116L,0x7132cbb3L,0xcb7ae320L,0xc0fa5366L,0xd7653e34L,
+/* 180*/ 0x971c88c2L,0xc62c7dd0L,0x34d0a3daL,0x868f6709L,0x7ae6fa8fL,
+/* 185*/ 0x22bbd523L,0x66cd3d5bL,0x1ef9288dL,0xf9cf58c1L,0x5b784e80L,
+/* 190*/ 0x7439a191L,0xae134c36L,0x9116c463L,0x2e9e1396L,0xf8611f3aL,
+/* 195*/ 0x2d2f3307L,0x247f37ddL,0xc1e2ff9dL,0x43c821e5L,0x05ed5cabL,
+/* 200*/ 0xef74e80aL,0x4cca6028L,0xf0ac3cbdL,0x5d874b29L,0x6c62f6a6L,
+/* 205*/ 0x4b2a2ef3L,0xb1aa2087L,0x62a5d0a3L,0x0327221cL,0xb096b4c6L,
+/* 210*/ 0x417ec693L,0xaba840d6L,0x789725ebL,0xf4b9e02dL,0xe6e00975L,
+/* 215*/ 0xcc04961aL,0x63f624bbL,0x7fa21ecbL,0x2c01ea7fL,0xb2415005L,
+/* 220*/ 0x2a8bbeb5L,0x83b2b14eL,0xa383d1a7L,0x5352f96aL,0x043ecdadL,
+/* 225*/ 0xce1918a1L,0xfa6be6c9L,0x50def36fL,0xf6b80ce2L,0x4543ef7cL,
+/* 230*/ 0x9953d651L,0xf257955dL,0x87244914L,0xda1e0a24L,0xffda4785L,
+/* 235*/ 0x14d327a2L,0x3b93c29fL,0x840684b4L,0x61ab71a0L,0x9f7b784aL,
+/* 240*/ 0x2fd570cfL,0x15955bdeL,0x38f8d471L,0x3534a718L,0x133fb71dL,
+/* 245*/ 0x3fd80f52L,0x4290a8beL,0x75ff44c7L,0xa554e546L,0xe1023499L,
+/* 250*/ 0xbf2652e3L,0x7d20399eL,0xa1df7e82L,0x177092eeL,0x217dd3f1L,
+/* 255*/ 0x7c1ff8d9L
+ /* End of S Box 10 */ },
+
+
+ { /* Start of S Box 11 */
+
+/* 0*/ 0x12113f2eL,0xbfbd0785L,0xf11793fbL,0xa5bff566L,0x83c7b0e5L,
+/* 5*/ 0x72fb316bL,0x75526a9aL,0x41e0e612L,0x7156ba09L,0x53ce7deeL,
+/* 10*/ 0x0aa26881L,0xa43e0d7dL,0x3da73ca3L,0x182761edL,0xbd5077ffL,
+/* 15*/ 0x56db4aa0L,0xe792711cL,0xf0a4eb1dL,0x7f878237L,0xec65c4e8L,
+/* 20*/ 0x08dc8d43L,0x0f8ce142L,0x8258abdaL,0xf4154e16L,0x49dec2fdL,
+/* 25*/ 0xcd8d5705L,0x6c2c3a0fL,0x5c12bb88L,0xeff3cdb6L,0x2c89ed8cL,
+/* 30*/ 0x7beba967L,0x2a142157L,0xc6d0836fL,0xb4f97e96L,0x6931e969L,
+/* 35*/ 0x514e6c7cL,0xa7792600L,0x0bbbf780L,0x59671bbdL,0x0707b676L,
+/* 40*/ 0x37482d93L,0x80af1479L,0x3805a60dL,0xe1f4cac1L,0x580b3074L,
+/* 45*/ 0x30b8d6ceL,0x05a304beL,0xd176626dL,0xebca97f3L,0xbb201f11L,
+/* 50*/ 0x6a1afe23L,0xffaa86e4L,0x62b4da49L,0x1b6629f5L,0xf5d9e092L,
+/* 55*/ 0xf37f3dd1L,0x619bd45bL,0xa6ec8e4fL,0x29c80939L,0x0c7c0c34L,
+/* 60*/ 0x9cfe6e48L,0xe65fd3acL,0x73613b65L,0xb3c669f9L,0xbe2e8a9eL,
+/* 65*/ 0x286f9678L,0x5797fd13L,0x99805d75L,0xcfb641c5L,0xa91074baL,
+/* 70*/ 0x6343af47L,0x6403cb46L,0x8894c8dbL,0x2663034cL,0x3c40dc5eL,
+/* 75*/ 0x00995231L,0x96789aa2L,0x2efde4b9L,0x7dc195e1L,0x547dadd5L,
+/* 80*/ 0x06a8ea04L,0xf2347a63L,0x5e0dc6f7L,0x8462dfc2L,0x1e6b2c3cL,
+/* 85*/ 0x9bd275b3L,0x91d419e2L,0xbcefd17eL,0xb9003924L,0xd07e7320L,
+/* 90*/ 0xdef0495cL,0xc36ad00eL,0x1785b1abL,0x92e20bcfL,0xb139f0e9L,
+/* 95*/ 0x675bb9a1L,0xaecfa4afL,0x132376cbL,0xe84589d3L,0x79a05456L,
+/* 100*/ 0xa2f860bcL,0x1ae4f8b5L,0x20df4db4L,0xa1e1428bL,0x3bf60a1aL,
+/* 105*/ 0x27ff7bf1L,0xcb44c0e7L,0xf7f587c4L,0x1f3b9b21L,0x94368f01L,
+/* 110*/ 0x856e23a4L,0x6f93de3fL,0x773f5bbfL,0x8b22056eL,0xdf41f654L,
+/* 115*/ 0xb8246ff4L,0x8d57bff2L,0xd57167eaL,0xc5699f22L,0x40734ba7L,
+/* 120*/ 0x5d5c2772L,0x033020a8L,0xe30a7c4dL,0xadc40fd6L,0x76353441L,
+/* 125*/ 0x5aa5229bL,0x81516590L,0xda49f14eL,0x4fa672a5L,0x4d9fac5fL,
+/* 130*/ 0x154be230L,0x8a7a5cc0L,0xce3d2f84L,0xcca15514L,0x5221360cL,
+/* 135*/ 0xaf0fb81eL,0x5bdd5873L,0xf6825f8fL,0x1113d228L,0x70ad996cL,
+/* 140*/ 0x93320051L,0x60471c53L,0xe9ba567bL,0x3a462ae3L,0x5f55e72dL,
+/* 145*/ 0x1d3c5ad7L,0xdcfc45ecL,0x34d812efL,0xfa96ee1bL,0x369d1ef8L,
+/* 150*/ 0xc9b1a189L,0x7c1d3555L,0x50845edcL,0x4bb31877L,0x8764a060L,
+/* 155*/ 0x8c9a9415L,0x230e1a3aL,0xb05e9133L,0x242b9e03L,0xa3b99db7L,
+/* 160*/ 0xc2d7fb0aL,0x3333849dL,0xd27278d4L,0xb5d3efa6L,0x78ac28adL,
+/* 165*/ 0xc7b2c135L,0x0926ecf0L,0xc1374c91L,0x74f16d98L,0x2274084aL,
+/* 170*/ 0x3f6d9cfaL,0x7ac0a383L,0xb73aff1fL,0x3909a23dL,0x9f1653aeL,
+/* 175*/ 0x4e2f3e71L,0xca5ab22aL,0xe01e3858L,0x90c5a7ebL,0x3e4a17dfL,
+/* 180*/ 0xaa987fb0L,0x488bbd62L,0xb625062bL,0x2d776bb8L,0x43b5fc08L,
+/* 185*/ 0x1490d532L,0xd6d12495L,0x44e89845L,0x2fe60118L,0x9d9ef950L,
+/* 190*/ 0xac38133eL,0xd3864329L,0x017b255aL,0xfdc2dd26L,0x256851e6L,
+/* 195*/ 0x318e7086L,0x2bfa4861L,0x89eac706L,0xee5940c6L,0x68c3bc2fL,
+/* 200*/ 0xe260334bL,0x98da90bbL,0xf818f270L,0x4706d897L,0x212d3799L,
+/* 205*/ 0x4cf7e5d0L,0xd9c9649fL,0xa85db5cdL,0x35e90e82L,0x6b881152L,
+/* 210*/ 0xab1c02c7L,0x46752b02L,0x664f598eL,0x45ab2e64L,0xc4cdb4b2L,
+/* 215*/ 0xba42107fL,0xea2a808aL,0x971bf3deL,0x4a54a836L,0x4253aeccL,
+/* 220*/ 0x1029be68L,0x6dcc9225L,0xe4bca56aL,0xc0ae50b1L,0x7e011d94L,
+/* 225*/ 0xe59c162cL,0xd8e5c340L,0xd470fa0bL,0xb2be79ddL,0xd783889cL,
+/* 230*/ 0x1cede8f6L,0x8f4c817aL,0xddb785c9L,0x860232d8L,0x198aaad9L,
+/* 235*/ 0xa0814738L,0x3219cffcL,0x169546d2L,0xfc0cb759L,0x55911510L,
+/* 240*/ 0x04d5cec3L,0xed08cc3bL,0x0d6cf427L,0xc8e38ccaL,0x0eeee3feL,
+/* 245*/ 0x9ee7d7c8L,0xf9f24fa9L,0xdb04b35dL,0x9ab0c9e0L,0x651f4417L,
+/* 250*/ 0x028f8b07L,0x6e28d9aaL,0xfba96319L,0x8ed66687L,0xfecbc58dL,
+/* 255*/ 0x954ddb44L
+ /* End of S Box 11 */ },
+
+
+ { /* Start of S Box 12 */
+
+/* 0*/ 0x7b0bdffeL,0x865d16b1L,0x49a058c0L,0x97abaa3fL,0xcaacc75dL,
+/* 5*/ 0xaba6c17dL,0xf8746f92L,0x6f48aeedL,0x8841d4b5L,0xf36a146aL,
+/* 10*/ 0x73c390abL,0xe6fb558fL,0x87b1019eL,0x26970252L,0x246377b2L,
+/* 15*/ 0xcbf676aeL,0xf923db06L,0xf7389116L,0x14c81a90L,0x83114eb4L,
+/* 20*/ 0x8b137559L,0x95a86a7aL,0xd5b8da8cL,0xc4df780eL,0x5a9cb3e2L,
+/* 25*/ 0xe44d4062L,0xe8dc8ef6L,0x9d180845L,0x817ad18bL,0xc286c85bL,
+/* 30*/ 0x251f20deL,0xee6d5933L,0xf6edef81L,0xd4d16c1eL,0xc94a0c32L,
+/* 35*/ 0x8437fd22L,0x3271ee43L,0x42572aeeL,0x5f91962aL,0x1c522d98L,
+/* 40*/ 0x59b23f0cL,0xd86b8804L,0x08c63531L,0x2c0d7a40L,0xb97c4729L,
+/* 45*/ 0x04964df9L,0x13c74a17L,0x5878362fL,0x4c808cd6L,0x092cb1e0L,
+/* 50*/ 0x6df02885L,0xa0c2105eL,0x8aba9e68L,0x64e03057L,0xe5d61325L,
+/* 55*/ 0x0e43a628L,0x16dbd62bL,0x2733d90bL,0x3ae57283L,0xc0c1052cL,
+/* 60*/ 0x4b6fb620L,0x37513953L,0xfc898bb3L,0x471b179fL,0xdf6e66b8L,
+/* 65*/ 0xd32142f5L,0x9b30fafcL,0x4ed92549L,0x105c6d99L,0x4acd69ffL,
+/* 70*/ 0x2b1a27d3L,0x6bfcc067L,0x6301a278L,0xad36e6f2L,0xef3ff64eL,
+/* 75*/ 0x56b3cadbL,0x0184bb61L,0x17beb9fdL,0xfaec6109L,0xa2e1ffa1L,
+/* 80*/ 0x2fd224f8L,0x238f5be6L,0x8f8570cfL,0xaeb5f25aL,0x4f1d3e64L,
+/* 85*/ 0x4377eb24L,0x1fa45346L,0xb2056386L,0x52095e76L,0xbb7b5adcL,
+/* 90*/ 0x3514e472L,0xdde81e6eL,0x7acea9c4L,0xac15cc48L,0x71c97d93L,
+/* 95*/ 0x767f941cL,0x911052a2L,0xffea09bfL,0xfe3ddcf0L,0x15ebf3aaL,
+/* 100*/ 0x9235b8bcL,0x75408615L,0x9a723437L,0xe1a1bd38L,0x33541b7eL,
+/* 105*/ 0x1bdd6856L,0xb307e13eL,0x90814bb0L,0x51d7217bL,0x0bb92219L,
+/* 110*/ 0x689f4500L,0xc568b01fL,0x5df3d2d7L,0x3c0ecd0dL,0x2a0244c8L,
+/* 115*/ 0x852574e8L,0xe72f23a9L,0x8e26ed02L,0x2d92cbddL,0xdabc0458L,
+/* 120*/ 0xcdf5feb6L,0x9e4e8dccL,0xf4f1e344L,0x0d8c436dL,0x4427603bL,
+/* 125*/ 0xbdd37fdaL,0x80505f26L,0x8c7d2b8eL,0xb73273c5L,0x397362eaL,
+/* 130*/ 0x618a3811L,0x608bfb88L,0x06f7d714L,0x212e4677L,0x28efceadL,
+/* 135*/ 0x076c0371L,0x36a3a4d9L,0x5487b455L,0x3429a365L,0x65d467acL,
+/* 140*/ 0x78ee7eebL,0x99bf12b7L,0x4d129896L,0x772a5601L,0xcce284c7L,
+/* 145*/ 0x2ed85c21L,0xd099e8a4L,0xa179158aL,0x6ac0ab1aL,0x299a4807L,
+/* 150*/ 0xbe67a58dL,0xdc19544aL,0xb8949b54L,0x8d315779L,0xb6f849c1L,
+/* 155*/ 0x53c5ac34L,0x66de92a5L,0xf195dd13L,0x318d3a73L,0x301ec542L,
+/* 160*/ 0x0cc40da6L,0xf253ade4L,0x467ee566L,0xea5585ecL,0x3baf19bbL,
+/* 165*/ 0x7de9f480L,0x79006e7cL,0xa9b7a197L,0xa44bd8f1L,0xfb2ba739L,
+/* 170*/ 0xec342fd4L,0xed4fd32dL,0x3d1789baL,0x400f5d7fL,0xc798f594L,
+/* 175*/ 0x4506a847L,0x034c0a95L,0xe2162c9dL,0x55a9cfd0L,0x692d832eL,
+/* 180*/ 0xcf9db2caL,0x5e2287e9L,0xd2610ef3L,0x1ae7ecc2L,0x48399ca0L,
+/* 185*/ 0xa7e4269bL,0x6ee3a0afL,0x7065bfe1L,0xa6ffe708L,0x2256804cL,
+/* 190*/ 0x7476e21bL,0x41b0796cL,0x7c243b05L,0x000a950fL,0x1858416bL,
+/* 195*/ 0xf5a53c89L,0xe9fef823L,0x3f443275L,0xe0cbf091L,0x0af27b84L,
+/* 200*/ 0x3ebb0f27L,0x1de6f7f4L,0xc31c29f7L,0xb166de3dL,0x12932ec3L,
+/* 205*/ 0x9c0c0674L,0x5cda81b9L,0xd1bd9d12L,0xaffd7c82L,0x8962bca7L,
+/* 210*/ 0xa342c4a8L,0x62457151L,0x82089f03L,0xeb49c670L,0x5b5f6530L,
+/* 215*/ 0x7e28bad2L,0x20880ba3L,0xf0faafcdL,0xce82b56fL,0x0275335cL,
+/* 220*/ 0xc18e8afbL,0xde601d69L,0xba9b820aL,0xc8a2be4fL,0xd7cac335L,
+/* 225*/ 0xd9a73741L,0x115e974dL,0x7f5ac21dL,0x383bf9c6L,0xbcaeb75fL,
+/* 230*/ 0xfd0350ceL,0xb5d06b87L,0x9820e03cL,0x72d5f163L,0xe3644fc9L,
+/* 235*/ 0xa5464c4bL,0x57048fcbL,0x9690c9dfL,0xdbf9eafaL,0xbff4649aL,
+/* 240*/ 0x053c00e3L,0xb4b61136L,0x67593dd1L,0x503ee960L,0x9fb4993aL,
+/* 245*/ 0x19831810L,0xc670d518L,0xb05b51d8L,0x0f3a1ce5L,0x6caa1f9cL,
+/* 250*/ 0xaacc31beL,0x949ed050L,0x1ead07e7L,0xa8479abdL,0xd6cffcd5L,
+/* 255*/ 0x936993efL
+ /* End of S Box 12 */ },
+
+
+ { /* Start of S Box 13 */
+
+/* 0*/ 0x472e91cbL,0x5444b5b6L,0x62be5861L,0x1be102c7L,0x63e4b31eL,
+/* 5*/ 0xe81f71b7L,0x9e2317c9L,0x39a408aeL,0x518024f4L,0x1731c66fL,
+/* 10*/ 0x68cbc918L,0x71fb0c9eL,0xd03b7fddL,0x7d6222ebL,0x9057eda3L,
+/* 15*/ 0x1a34a407L,0x8cc2253dL,0xb6f6979dL,0x835675dcL,0xf319be9fL,
+/* 20*/ 0xbe1cd743L,0x4d32fee4L,0x77e7d887L,0x37e9ebfdL,0x15f851e8L,
+/* 25*/ 0x23dc3706L,0x19d78385L,0xbd506933L,0xa13ad4a6L,0x913f1a0eL,
+/* 30*/ 0xdde560b9L,0x9a5f0996L,0xa65a0435L,0x48d34c4dL,0xe90839a7L,
+/* 35*/ 0x8abba54eL,0x6fd13ce1L,0xc7eebd3cL,0x0e297602L,0x58b9bbb4L,
+/* 40*/ 0xef7901e6L,0x64a28a62L,0xa509875aL,0xf8834442L,0x2702c709L,
+/* 45*/ 0x07353f31L,0x3b39f665L,0xf5b18b49L,0x4010ae37L,0x784de00bL,
+/* 50*/ 0x7a1121e9L,0xde918ed3L,0xc8529dcdL,0x816a5d05L,0x02ed8298L,
+/* 55*/ 0x04e3dd84L,0xfd2bc3e2L,0xaf167089L,0x96af367eL,0xa4da6232L,
+/* 60*/ 0x18ff7325L,0x05f9a9f1L,0x4fefb9f9L,0xcd94eaa5L,0xbfaa5069L,
+/* 65*/ 0xa0b8c077L,0x60d86f57L,0xfe71c813L,0x29ebd2c8L,0x4ca86538L,
+/* 70*/ 0x6bf1a030L,0xa237b88aL,0xaa8af41dL,0xe1f7b6ecL,0xe214d953L,
+/* 75*/ 0x33057879L,0x49caa736L,0xfa45cff3L,0xc063b411L,0xba7e27d0L,
+/* 80*/ 0x31533819L,0x2a004ac1L,0x210efc3fL,0x2646885eL,0x66727dcfL,
+/* 85*/ 0x9d7fbf54L,0xa8dd0ea8L,0x3447caceL,0x3f0c14dbL,0xb8382aacL,
+/* 90*/ 0x4ace3539L,0x0a518d51L,0x95178981L,0x35aee2caL,0x73f0f7e3L,
+/* 95*/ 0x94281140L,0x59d0e523L,0xd292cb88L,0x565d1b27L,0x7ec8fbafL,
+/* 100*/ 0x069af08dL,0xc127fd24L,0x0bc77b10L,0x5f03e7efL,0x453e99baL,
+/* 105*/ 0xeed9ff7fL,0x87b55215L,0x7915ab4cL,0xd389a358L,0x5e75ce6dL,
+/* 110*/ 0x28d655c0L,0xdad26c73L,0x2e2510ffL,0x9fa7eeccL,0x1d0629c3L,
+/* 115*/ 0xdc9c9c46L,0x2d67ecd7L,0xe75e94bdL,0x3d649e2aL,0x6c413a2bL,
+/* 120*/ 0x706f0d7cL,0xdfb0127bL,0x4e366b55L,0x2c825650L,0x24205720L,
+/* 125*/ 0xb5c998f7L,0x3e95462cL,0x756e5c72L,0x3259488fL,0x11e8771aL,
+/* 130*/ 0xa7c0a617L,0x577663e5L,0x089b6401L,0x8eab1941L,0xae55ef8cL,
+/* 135*/ 0x3aac5460L,0xd4e6262fL,0x5d979a47L,0xb19823b0L,0x7f8d6a0cL,
+/* 140*/ 0xffa08683L,0x0170cd0fL,0x858cd5d8L,0x53961c90L,0xc4c61556L,
+/* 145*/ 0x41f2f226L,0xcfcd062dL,0xf24c03b8L,0xea81df5bL,0x7be2fa52L,
+/* 150*/ 0xb361f98bL,0xc2901316L,0x55ba4bbcL,0x93b234a9L,0x0fbc6603L,
+/* 155*/ 0x80a96822L,0x6d60491fL,0x22bd00f8L,0xbcad5aadL,0x52f3f13bL,
+/* 160*/ 0x42fd2b28L,0xb41dd01cL,0xc52c93bfL,0xfc663094L,0x8f58d100L,
+/* 165*/ 0x43fecc08L,0xc6331e5dL,0xe6480f66L,0xca847204L,0x4bdf1da0L,
+/* 170*/ 0x30cc2efbL,0x13e02deaL,0xfb49ac45L,0xf9d4434fL,0xf47c5b9cL,
+/* 175*/ 0x148879c2L,0x039fc234L,0xa3db9bfcL,0xd1a1dc5cL,0x763d7cd4L,
+/* 180*/ 0xed6d2f93L,0xab13af6eL,0x1e8e054aL,0xd68f4f9aL,0xc30484b3L,
+/* 185*/ 0xd7d50afaL,0x6930855fL,0xcc07db95L,0xce746db1L,0x744e967dL,
+/* 190*/ 0xf16cf575L,0x8643e8b5L,0xf0eae38eL,0xe52de1d1L,0x6587dae0L,
+/* 195*/ 0x0c4b8121L,0x1c7ac567L,0xac0db20aL,0x36c3a812L,0x5b1a4514L,
+/* 200*/ 0xa9a3f868L,0xb9263baaL,0xcb3ce9d2L,0xe44fb1a4L,0x9221bc82L,
+/* 205*/ 0xb29390feL,0x6ab41863L,0x974a3e2eL,0x89f531c5L,0x255ca13eL,
+/* 210*/ 0x8b65d348L,0xec248f78L,0xd8fc16f0L,0x50ecdeeeL,0x09010792L,
+/* 215*/ 0x3c7d1fb2L,0xeba5426bL,0x847b417aL,0x468b40d9L,0x8dc4e680L,
+/* 220*/ 0x7cc1f391L,0x2f1eb086L,0x6e5baa6aL,0xe0b395daL,0xe31b2cf6L,
+/* 225*/ 0xd9690b0dL,0x729ec464L,0x38403ddeL,0x610b80a2L,0x5cf433abL,
+/* 230*/ 0xb0785fc4L,0xd512e4c6L,0xbbb7d699L,0x5a86591bL,0x10cf5376L,
+/* 235*/ 0x12bf9f4bL,0x980fbaa1L,0x992a4e70L,0x20fa7ae7L,0xf7996ebbL,
+/* 240*/ 0xc918a2beL,0x82de74f2L,0xad54209bL,0xf66b4d74L,0x1fc5b771L,
+/* 245*/ 0x169d9229L,0x887761dfL,0x00b667d5L,0xdb425e59L,0xb72f2844L,
+/* 250*/ 0x9b0ac1f5L,0x9c737e3aL,0x2b85476cL,0x6722add6L,0x44a63297L,
+/* 255*/ 0x0d688cedL
+ /* End of S Box 13 */ },
+
+
+ { /* Start of S Box 14 */
+
+/* 0*/ 0xabc59484L,0x4107778aL,0x8ad94c6fL,0xfe83df90L,0x0f64053fL,
+/* 5*/ 0xd1292e9dL,0xc5744356L,0x8dd1abb4L,0x4c4e7667L,0xfb4a7fc1L,
+/* 10*/ 0x74f402cbL,0x70f06afdL,0xa82286f2L,0x918dd076L,0x7a97c5ceL,
+/* 15*/ 0x48f7bde3L,0x6a04d11dL,0xac243ef7L,0x33ac10caL,0x2f7a341eL,
+/* 20*/ 0x5f75157aL,0xf4773381L,0x591c870eL,0x78df8cc8L,0x22f3adb0L,
+/* 25*/ 0x251a5993L,0x09fbef66L,0x796942a8L,0x97541d2eL,0x2373daa9L,
+/* 30*/ 0x1bd2f142L,0xb57e8eb2L,0xe1a5bfdbL,0x7d0efa92L,0xb3442c94L,
+/* 35*/ 0xd2cb6447L,0x386ac97eL,0x66d61805L,0xbdada15eL,0x11bc1aa7L,
+/* 40*/ 0x14e9f6eaL,0xe533a0c0L,0xf935ee0aL,0x8fee8a04L,0x810d6d85L,
+/* 45*/ 0x7c68b6d6L,0x4edc9aa2L,0x956e897dL,0xed87581aL,0x264be9d7L,
+/* 50*/ 0xff4ddb29L,0x823857c2L,0xe005a9a0L,0xf1cc2450L,0x6f9951e1L,
+/* 55*/ 0xaade2310L,0xe70c75f5L,0x83e1a31fL,0x4f7dde8eL,0xf723b563L,
+/* 60*/ 0x368e0928L,0x86362b71L,0x21e8982dL,0xdfb3f92bL,0x44676352L,
+/* 65*/ 0x99efba31L,0x2eab4e1cL,0xfc6ca5e7L,0x0ebe5d4eL,0xa0717d0cL,
+/* 70*/ 0xb64f8199L,0x946b31a1L,0x5656cbc6L,0xcffec3efL,0x622766c9L,
+/* 75*/ 0xfa211e35L,0x52f98b89L,0x6d01674bL,0x4978a802L,0xf651f701L,
+/* 80*/ 0x15b0d43dL,0xd6ff4683L,0x3463855fL,0x672ba29cL,0xbc128312L,
+/* 85*/ 0x4626a70dL,0xc8927a5aL,0xb8481cf9L,0x1c962262L,0xa21196baL,
+/* 90*/ 0xbaba5ee9L,0x5bb162d0L,0x69943bd1L,0x0c47e35cL,0x8cc9619aL,
+/* 95*/ 0xe284d948L,0x271bf264L,0xc27fb398L,0x4bc70897L,0x60cf202cL,
+/* 100*/ 0x7f42d6aaL,0xa5a13506L,0x5d3e8860L,0xcea63d3cL,0x63bf0a8fL,
+/* 105*/ 0xf02e9efaL,0xb17b0674L,0xb072b1d3L,0x06e5723bL,0x3737e436L,
+/* 110*/ 0x24aa49c7L,0x0ded0d18L,0xdb256b14L,0x58b27877L,0xecb49f54L,
+/* 115*/ 0x6c40256aL,0x6ea92ffbL,0x3906aa4cL,0xc9866fd5L,0x4549323eL,
+/* 120*/ 0xa7b85fabL,0x1918cc27L,0x7308d7b5L,0x1e16c7adL,0x71850b37L,
+/* 125*/ 0x3095fd78L,0xa63b70e6L,0xd880e2aeL,0x3e282769L,0xa39ba6bcL,
+/* 130*/ 0x98700fa3L,0xf34c53e8L,0x288af426L,0xb99d930fL,0xf5b99df1L,
+/* 135*/ 0xe9d0c8cfL,0x5ac8405dL,0x50e7217bL,0x511fbbbeL,0x2ca2e639L,
+/* 140*/ 0xc020301bL,0x356dbc00L,0x8e43ddb9L,0x4d327b4aL,0xf20ff3edL,
+/* 145*/ 0x1dbb29bdL,0x43d44779L,0xa1b68f70L,0x6114455bL,0xe63d280bL,
+/* 150*/ 0x6bf6ff65L,0x10fc39e5L,0x3dae126eL,0xc1d7cf11L,0xcb60b795L,
+/* 155*/ 0x1789d5b3L,0x9bca36b7L,0x08306075L,0x84615608L,0x8b3a0186L,
+/* 160*/ 0xe88fbecdL,0x7ba47c4dL,0x2de44dacL,0x653fe58dL,0xcca0b968L,
+/* 165*/ 0xd7fa0e72L,0x93901780L,0x1f2c26ccL,0xae595b6bL,0xa9ecea9bL,
+/* 170*/ 0xe3dbf8c4L,0x319cc130L,0x12981196L,0x01a3a4deL,0x32c454b6L,
+/* 175*/ 0x755bd817L,0x3cd871e4L,0xa48bb8daL,0x02fdec09L,0xfd2dc2e2L,
+/* 180*/ 0x9e578088L,0x9a9f916dL,0x4065fe6cL,0x1853999eL,0xc7793f23L,
+/* 185*/ 0xdc1016bbL,0x969355ffL,0x7ef292f6L,0xcdce4adcL,0x05e24416L,
+/* 190*/ 0x85c16c46L,0xd441d37fL,0x57bd6855L,0x8746f54fL,0x9ca773dfL,
+/* 195*/ 0x770bae22L,0x54828413L,0xb75e4b19L,0x04c35c03L,0xbf7cca07L,
+/* 200*/ 0x2955c4ddL,0x721db041L,0xb2394f33L,0x03f51387L,0x89b73c9fL,
+/* 205*/ 0x0b1737f3L,0x07e69024L,0x9231d245L,0x76193861L,0x88159c15L,
+/* 210*/ 0xdeb552d9L,0xd9767e40L,0x20c6c0c3L,0x4281977cL,0xf8afe1e0L,
+/* 215*/ 0xd32a0751L,0x3fc27432L,0xddf1dcc5L,0x68581f34L,0x3bcd5025L,
+/* 220*/ 0x0091b2eeL,0x4aeb6944L,0x1602e743L,0xea09eb58L,0xef0a2a8bL,
+/* 225*/ 0x641e03a5L,0xeb50e021L,0x5c8ccef8L,0x802ff0b8L,0xd5e3edfeL,
+/* 230*/ 0xc4dd1b49L,0x5334cd2aL,0x13f82d2fL,0x47450c20L,0x55dafbd2L,
+/* 235*/ 0xbec0c6f4L,0xb45d7959L,0x3ad36e8cL,0x0aa8ac57L,0x1a3c8d73L,
+/* 240*/ 0xe45aafb1L,0x9f664838L,0xc6880053L,0xd0039bbfL,0xee5f19ebL,
+/* 245*/ 0xca0041d8L,0xbbea3aafL,0xda628291L,0x9d5c95d4L,0xadd504a6L,
+/* 250*/ 0xc39ab482L,0x5e9e14a4L,0x2be065f0L,0x2a13fc3aL,0x9052e8ecL,
+/* 255*/ 0xaf6f5afcL
+ /* End of S Box 14 */ },
+
+
+ { /* Start of S Box 15 */
+
+/* 0*/ 0x519aa8b5L,0xbb303da9L,0xe00e2b10L,0xdfa6c1dbL,0x2e6b952eL,
+/* 5*/ 0xee10dc23L,0x37936d09L,0x1fc42e92L,0x39b25a9fL,0x13ff89f4L,
+/* 10*/ 0xc8f53feaL,0x18500bc7L,0x95a0379dL,0x98f751c2L,0x2289c42fL,
+/* 15*/ 0xa21e4098L,0x6f391f41L,0xf27e7e58L,0x0d0df887L,0x4b79d540L,
+/* 20*/ 0x8e8409aaL,0x71fe46f8L,0x688a9b29L,0x3f08b548L,0x84abe03aL,
+/* 25*/ 0x5e91b6c1L,0xfde4c2aeL,0x251d0e72L,0x92d4fee5L,0xf9371967L,
+/* 30*/ 0x9175108fL,0xe6e81835L,0x8c8cb8eeL,0xb55a67b3L,0xcef138ccL,
+/* 35*/ 0x8b256268L,0x00d815f5L,0xe8810812L,0x77826189L,0xea73267dL,
+/* 40*/ 0x19b90f8dL,0x45c33bb4L,0x82477056L,0xe1770075L,0x09467aa6L,
+/* 45*/ 0xa7c6f54aL,0x79768742L,0x61b86bcaL,0xd6644a44L,0xe33f0171L,
+/* 50*/ 0xc229fbcdL,0x41b08febL,0xd1903e30L,0x65ec9080L,0x563d6fbdL,
+/* 55*/ 0xf56da488L,0xebf64cd8L,0x4934426bL,0x7c8592fcL,0x6aca8cf2L,
+/* 60*/ 0x1cea111bL,0x3a57ee7aL,0xace11c0dL,0x9942d85eL,0xc4613407L,
+/* 65*/ 0xfa8e643bL,0x327fc701L,0x4ca9be82L,0x3352526dL,0x2c047f63L,
+/* 70*/ 0xf3a8f7ddL,0x1a4a98a8L,0x762ed4d1L,0x27c75008L,0xbdf497c0L,
+/* 75*/ 0x7a7b84dfL,0x315c28abL,0x801f93e3L,0xf19b0ca1L,0x8f14e46aL,
+/* 80*/ 0xe48ba333L,0x9605e625L,0xf03ecb60L,0x60385f2dL,0x902845baL,
+/* 85*/ 0x7f96d66fL,0x24bff05cL,0x2820730bL,0x947133cbL,0xd444828aL,
+/* 90*/ 0xb343f6f1L,0x0bef4705L,0x8da574f9L,0x01e25d6cL,0x1732793eL,
+/* 95*/ 0x4f0f7b27L,0x364b7117L,0xb2d1da77L,0xa6c5f1e9L,0x574ca5b1L,
+/* 100*/ 0x386a3076L,0xad6894d6L,0x1156d7faL,0xa48d1d9aL,0x4794c0afL,
+/* 105*/ 0x150c0aa0L,0x26d348acL,0x29fdeabeL,0xa5dede53L,0x81671e8eL,
+/* 110*/ 0x594ee3bfL,0xa96c56e6L,0x3426a726L,0xc5976579L,0xbc22e5e4L,
+/* 115*/ 0xc1006319L,0xdaafdd2aL,0xa1a1aa83L,0x3badd0e7L,0xc3b14981L,
+/* 120*/ 0xd770b155L,0xccd7c693L,0x42e944c5L,0x03e0064fL,0xca95b4efL,
+/* 125*/ 0x3dee81c3L,0xfbbcd98cL,0x1e07e15bL,0x667ce949L,0xe7d6773fL,
+/* 130*/ 0x21b6124bL,0x6b2a6ef7L,0xd3278a9cL,0x9a988304L,0x75d2ae9bL,
+/* 135*/ 0xfe49e2ffL,0x9bc24f46L,0x74cc2cf6L,0xa3139f36L,0x6c9ef35aL,
+/* 140*/ 0x9fc1dffeL,0x9e5facdcL,0xaadc8bbbL,0x5abdbc5fL,0x44b3b390L,
+/* 145*/ 0xf754efa7L,0x5fe3bdb7L,0x4e59c886L,0x06a4c984L,0xa0338878L,
+/* 150*/ 0xcd513cd7L,0x63ebd27eL,0x8aba80adL,0x50da144eL,0x5d9f4e97L,
+/* 155*/ 0x025b751cL,0x2d580200L,0xb6c05837L,0x580aa15dL,0x54022a6eL,
+/* 160*/ 0xb41a5415L,0x4863fab6L,0xb0b79957L,0x46d0d159L,0xdc2b8650L,
+/* 165*/ 0x20a7bb0cL,0x4a032974L,0xec8636a2L,0x8548f24cL,0xf6a2bf16L,
+/* 170*/ 0x1088f4b0L,0x0c2f3a94L,0x525dc396L,0x14065785L,0x2b4dca52L,
+/* 175*/ 0x08aeed39L,0xabedfc99L,0xb1dbcf18L,0x87f85bbcL,0xae3aff61L,
+/* 180*/ 0x433ccd70L,0x5b23cc64L,0x7b453213L,0x5355c545L,0x9318ec0aL,
+/* 185*/ 0x78692d31L,0x0a21693dL,0xd5666814L,0x05fb59d9L,0xc71985b2L,
+/* 190*/ 0x2abb8e0eL,0xcf6e6c91L,0xd9cfe7c6L,0xefe7132cL,0x9711ab28L,
+/* 195*/ 0x3ce52732L,0x12d516d2L,0x7209a0d0L,0xd278d306L,0x70fa4b7bL,
+/* 200*/ 0x1d407dd3L,0xdb0beba4L,0xbfd97621L,0xa8be21e1L,0x1b6f1b66L,
+/* 205*/ 0x30650ddaL,0xba7ddbb9L,0x7df953fbL,0x9d1c3902L,0xedf0e8d5L,
+/* 210*/ 0xb8741ae0L,0x0f240565L,0x62cd438bL,0xc616a924L,0xaf7a96a3L,
+/* 215*/ 0x35365538L,0xe583af4dL,0x73415eb8L,0x23176a47L,0xfc9ccee8L,
+/* 220*/ 0x7efc9de2L,0x695e03cfL,0xf8ce66d4L,0x88b4781dL,0x67dd9c03L,
+/* 225*/ 0x3e8f9e73L,0xc0c95c51L,0xbe314d22L,0x55aa0795L,0xcb1bb011L,
+/* 230*/ 0xe980fdc8L,0x9c62b7ceL,0xde2d239eL,0x042cadf3L,0xffdf04deL,
+/* 235*/ 0x5ce6a60fL,0xd8c831edL,0xb7b5b9ecL,0xb9cbf962L,0xe253b254L,
+/* 240*/ 0x0735ba1fL,0x16ac917fL,0xdd607c2bL,0x64a335c4L,0x40159a7cL,
+/* 245*/ 0x869222f0L,0x6ef21769L,0x839d20a5L,0xd03b24c9L,0xf412601eL,
+/* 250*/ 0x6d72a243L,0x0e018dfdL,0x89f3721aL,0xc94f4134L,0x2f992f20L,
+/* 255*/ 0x4d87253cL
+ /* End of S Box 15 */ }
+};
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/php_hash_tiger.h b/ext/hash/php_hash_tiger.h
new file mode 100644
index 0000000..c3428bf
--- /dev/null
+++ b/ext/hash/php_hash_tiger.h
@@ -0,0 +1,49 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Michael Wallner <mike@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_HASH_TIGER_H
+#define PHP_HASH_TIGER_H
+
+/* TIGER context */
+typedef struct {
+ php_hash_uint64 state[3];
+ php_hash_uint64 passed;
+ unsigned char buffer[64];
+ unsigned int passes:1;
+ unsigned int length:7;
+} PHP_TIGER_CTX;
+
+PHP_HASH_API void PHP_3TIGERInit(PHP_TIGER_CTX *context);
+PHP_HASH_API void PHP_4TIGERInit(PHP_TIGER_CTX *context);
+PHP_HASH_API void PHP_TIGERUpdate(PHP_TIGER_CTX *context, const unsigned char *input, size_t len);
+PHP_HASH_API void PHP_TIGER128Final(unsigned char digest[16], PHP_TIGER_CTX *context);
+PHP_HASH_API void PHP_TIGER160Final(unsigned char digest[20], PHP_TIGER_CTX *context);
+PHP_HASH_API void PHP_TIGER192Final(unsigned char digest[24], PHP_TIGER_CTX *context);
+
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/php_hash_tiger_tables.h b/ext/hash/php_hash_tiger_tables.h
new file mode 100644
index 0000000..a826c9a
--- /dev/null
+++ b/ext/hash/php_hash_tiger_tables.h
@@ -0,0 +1,549 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Michael Wallner <mike@php.net> |
+ | Sara Golemon <pollita@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#define t1 (table)
+#define t2 (table+256)
+#define t3 (table+256*2)
+#define t4 (table+256*3)
+
+static const php_hash_uint64 table[4*256] = {
+ L64(0x02AAB17CF7E90C5E) /* 0 */, L64(0xAC424B03E243A8EC) /* 1 */,
+ L64(0x72CD5BE30DD5FCD3) /* 2 */, L64(0x6D019B93F6F97F3A) /* 3 */,
+ L64(0xCD9978FFD21F9193) /* 4 */, L64(0x7573A1C9708029E2) /* 5 */,
+ L64(0xB164326B922A83C3) /* 6 */, L64(0x46883EEE04915870) /* 7 */,
+ L64(0xEAACE3057103ECE6) /* 8 */, L64(0xC54169B808A3535C) /* 9 */,
+ L64(0x4CE754918DDEC47C) /* 10 */, L64(0x0AA2F4DFDC0DF40C) /* 11 */,
+ L64(0x10B76F18A74DBEFA) /* 12 */, L64(0xC6CCB6235AD1AB6A) /* 13 */,
+ L64(0x13726121572FE2FF) /* 14 */, L64(0x1A488C6F199D921E) /* 15 */,
+ L64(0x4BC9F9F4DA0007CA) /* 16 */, L64(0x26F5E6F6E85241C7) /* 17 */,
+ L64(0x859079DBEA5947B6) /* 18 */, L64(0x4F1885C5C99E8C92) /* 19 */,
+ L64(0xD78E761EA96F864B) /* 20 */, L64(0x8E36428C52B5C17D) /* 21 */,
+ L64(0x69CF6827373063C1) /* 22 */, L64(0xB607C93D9BB4C56E) /* 23 */,
+ L64(0x7D820E760E76B5EA) /* 24 */, L64(0x645C9CC6F07FDC42) /* 25 */,
+ L64(0xBF38A078243342E0) /* 26 */, L64(0x5F6B343C9D2E7D04) /* 27 */,
+ L64(0xF2C28AEB600B0EC6) /* 28 */, L64(0x6C0ED85F7254BCAC) /* 29 */,
+ L64(0x71592281A4DB4FE5) /* 30 */, L64(0x1967FA69CE0FED9F) /* 31 */,
+ L64(0xFD5293F8B96545DB) /* 32 */, L64(0xC879E9D7F2A7600B) /* 33 */,
+ L64(0x860248920193194E) /* 34 */, L64(0xA4F9533B2D9CC0B3) /* 35 */,
+ L64(0x9053836C15957613) /* 36 */, L64(0xDB6DCF8AFC357BF1) /* 37 */,
+ L64(0x18BEEA7A7A370F57) /* 38 */, L64(0x037117CA50B99066) /* 39 */,
+ L64(0x6AB30A9774424A35) /* 40 */, L64(0xF4E92F02E325249B) /* 41 */,
+ L64(0x7739DB07061CCAE1) /* 42 */, L64(0xD8F3B49CECA42A05) /* 43 */,
+ L64(0xBD56BE3F51382F73) /* 44 */, L64(0x45FAED5843B0BB28) /* 45 */,
+ L64(0x1C813D5C11BF1F83) /* 46 */, L64(0x8AF0E4B6D75FA169) /* 47 */,
+ L64(0x33EE18A487AD9999) /* 48 */, L64(0x3C26E8EAB1C94410) /* 49 */,
+ L64(0xB510102BC0A822F9) /* 50 */, L64(0x141EEF310CE6123B) /* 51 */,
+ L64(0xFC65B90059DDB154) /* 52 */, L64(0xE0158640C5E0E607) /* 53 */,
+ L64(0x884E079826C3A3CF) /* 54 */, L64(0x930D0D9523C535FD) /* 55 */,
+ L64(0x35638D754E9A2B00) /* 56 */, L64(0x4085FCCF40469DD5) /* 57 */,
+ L64(0xC4B17AD28BE23A4C) /* 58 */, L64(0xCAB2F0FC6A3E6A2E) /* 59 */,
+ L64(0x2860971A6B943FCD) /* 60 */, L64(0x3DDE6EE212E30446) /* 61 */,
+ L64(0x6222F32AE01765AE) /* 62 */, L64(0x5D550BB5478308FE) /* 63 */,
+ L64(0xA9EFA98DA0EDA22A) /* 64 */, L64(0xC351A71686C40DA7) /* 65 */,
+ L64(0x1105586D9C867C84) /* 66 */, L64(0xDCFFEE85FDA22853) /* 67 */,
+ L64(0xCCFBD0262C5EEF76) /* 68 */, L64(0xBAF294CB8990D201) /* 69 */,
+ L64(0xE69464F52AFAD975) /* 70 */, L64(0x94B013AFDF133E14) /* 71 */,
+ L64(0x06A7D1A32823C958) /* 72 */, L64(0x6F95FE5130F61119) /* 73 */,
+ L64(0xD92AB34E462C06C0) /* 74 */, L64(0xED7BDE33887C71D2) /* 75 */,
+ L64(0x79746D6E6518393E) /* 76 */, L64(0x5BA419385D713329) /* 77 */,
+ L64(0x7C1BA6B948A97564) /* 78 */, L64(0x31987C197BFDAC67) /* 79 */,
+ L64(0xDE6C23C44B053D02) /* 80 */, L64(0x581C49FED002D64D) /* 81 */,
+ L64(0xDD474D6338261571) /* 82 */, L64(0xAA4546C3E473D062) /* 83 */,
+ L64(0x928FCE349455F860) /* 84 */, L64(0x48161BBACAAB94D9) /* 85 */,
+ L64(0x63912430770E6F68) /* 86 */, L64(0x6EC8A5E602C6641C) /* 87 */,
+ L64(0x87282515337DDD2B) /* 88 */, L64(0x2CDA6B42034B701B) /* 89 */,
+ L64(0xB03D37C181CB096D) /* 90 */, L64(0xE108438266C71C6F) /* 91 */,
+ L64(0x2B3180C7EB51B255) /* 92 */, L64(0xDF92B82F96C08BBC) /* 93 */,
+ L64(0x5C68C8C0A632F3BA) /* 94 */, L64(0x5504CC861C3D0556) /* 95 */,
+ L64(0xABBFA4E55FB26B8F) /* 96 */, L64(0x41848B0AB3BACEB4) /* 97 */,
+ L64(0xB334A273AA445D32) /* 98 */, L64(0xBCA696F0A85AD881) /* 99 */,
+ L64(0x24F6EC65B528D56C) /* 100 */, L64(0x0CE1512E90F4524A) /* 101 */,
+ L64(0x4E9DD79D5506D35A) /* 102 */, L64(0x258905FAC6CE9779) /* 103 */,
+ L64(0x2019295B3E109B33) /* 104 */, L64(0xF8A9478B73A054CC) /* 105 */,
+ L64(0x2924F2F934417EB0) /* 106 */, L64(0x3993357D536D1BC4) /* 107 */,
+ L64(0x38A81AC21DB6FF8B) /* 108 */, L64(0x47C4FBF17D6016BF) /* 109 */,
+ L64(0x1E0FAADD7667E3F5) /* 110 */, L64(0x7ABCFF62938BEB96) /* 111 */,
+ L64(0xA78DAD948FC179C9) /* 112 */, L64(0x8F1F98B72911E50D) /* 113 */,
+ L64(0x61E48EAE27121A91) /* 114 */, L64(0x4D62F7AD31859808) /* 115 */,
+ L64(0xECEBA345EF5CEAEB) /* 116 */, L64(0xF5CEB25EBC9684CE) /* 117 */,
+ L64(0xF633E20CB7F76221) /* 118 */, L64(0xA32CDF06AB8293E4) /* 119 */,
+ L64(0x985A202CA5EE2CA4) /* 120 */, L64(0xCF0B8447CC8A8FB1) /* 121 */,
+ L64(0x9F765244979859A3) /* 122 */, L64(0xA8D516B1A1240017) /* 123 */,
+ L64(0x0BD7BA3EBB5DC726) /* 124 */, L64(0xE54BCA55B86ADB39) /* 125 */,
+ L64(0x1D7A3AFD6C478063) /* 126 */, L64(0x519EC608E7669EDD) /* 127 */,
+ L64(0x0E5715A2D149AA23) /* 128 */, L64(0x177D4571848FF194) /* 129 */,
+ L64(0xEEB55F3241014C22) /* 130 */, L64(0x0F5E5CA13A6E2EC2) /* 131 */,
+ L64(0x8029927B75F5C361) /* 132 */, L64(0xAD139FABC3D6E436) /* 133 */,
+ L64(0x0D5DF1A94CCF402F) /* 134 */, L64(0x3E8BD948BEA5DFC8) /* 135 */,
+ L64(0xA5A0D357BD3FF77E) /* 136 */, L64(0xA2D12E251F74F645) /* 137 */,
+ L64(0x66FD9E525E81A082) /* 138 */, L64(0x2E0C90CE7F687A49) /* 139 */,
+ L64(0xC2E8BCBEBA973BC5) /* 140 */, L64(0x000001BCE509745F) /* 141 */,
+ L64(0x423777BBE6DAB3D6) /* 142 */, L64(0xD1661C7EAEF06EB5) /* 143 */,
+ L64(0xA1781F354DAACFD8) /* 144 */, L64(0x2D11284A2B16AFFC) /* 145 */,
+ L64(0xF1FC4F67FA891D1F) /* 146 */, L64(0x73ECC25DCB920ADA) /* 147 */,
+ L64(0xAE610C22C2A12651) /* 148 */, L64(0x96E0A810D356B78A) /* 149 */,
+ L64(0x5A9A381F2FE7870F) /* 150 */, L64(0xD5AD62EDE94E5530) /* 151 */,
+ L64(0xD225E5E8368D1427) /* 152 */, L64(0x65977B70C7AF4631) /* 153 */,
+ L64(0x99F889B2DE39D74F) /* 154 */, L64(0x233F30BF54E1D143) /* 155 */,
+ L64(0x9A9675D3D9A63C97) /* 156 */, L64(0x5470554FF334F9A8) /* 157 */,
+ L64(0x166ACB744A4F5688) /* 158 */, L64(0x70C74CAAB2E4AEAD) /* 159 */,
+ L64(0xF0D091646F294D12) /* 160 */, L64(0x57B82A89684031D1) /* 161 */,
+ L64(0xEFD95A5A61BE0B6B) /* 162 */, L64(0x2FBD12E969F2F29A) /* 163 */,
+ L64(0x9BD37013FEFF9FE8) /* 164 */, L64(0x3F9B0404D6085A06) /* 165 */,
+ L64(0x4940C1F3166CFE15) /* 166 */, L64(0x09542C4DCDF3DEFB) /* 167 */,
+ L64(0xB4C5218385CD5CE3) /* 168 */, L64(0xC935B7DC4462A641) /* 169 */,
+ L64(0x3417F8A68ED3B63F) /* 170 */, L64(0xB80959295B215B40) /* 171 */,
+ L64(0xF99CDAEF3B8C8572) /* 172 */, L64(0x018C0614F8FCB95D) /* 173 */,
+ L64(0x1B14ACCD1A3ACDF3) /* 174 */, L64(0x84D471F200BB732D) /* 175 */,
+ L64(0xC1A3110E95E8DA16) /* 176 */, L64(0x430A7220BF1A82B8) /* 177 */,
+ L64(0xB77E090D39DF210E) /* 178 */, L64(0x5EF4BD9F3CD05E9D) /* 179 */,
+ L64(0x9D4FF6DA7E57A444) /* 180 */, L64(0xDA1D60E183D4A5F8) /* 181 */,
+ L64(0xB287C38417998E47) /* 182 */, L64(0xFE3EDC121BB31886) /* 183 */,
+ L64(0xC7FE3CCC980CCBEF) /* 184 */, L64(0xE46FB590189BFD03) /* 185 */,
+ L64(0x3732FD469A4C57DC) /* 186 */, L64(0x7EF700A07CF1AD65) /* 187 */,
+ L64(0x59C64468A31D8859) /* 188 */, L64(0x762FB0B4D45B61F6) /* 189 */,
+ L64(0x155BAED099047718) /* 190 */, L64(0x68755E4C3D50BAA6) /* 191 */,
+ L64(0xE9214E7F22D8B4DF) /* 192 */, L64(0x2ADDBF532EAC95F4) /* 193 */,
+ L64(0x32AE3909B4BD0109) /* 194 */, L64(0x834DF537B08E3450) /* 195 */,
+ L64(0xFA209DA84220728D) /* 196 */, L64(0x9E691D9B9EFE23F7) /* 197 */,
+ L64(0x0446D288C4AE8D7F) /* 198 */, L64(0x7B4CC524E169785B) /* 199 */,
+ L64(0x21D87F0135CA1385) /* 200 */, L64(0xCEBB400F137B8AA5) /* 201 */,
+ L64(0x272E2B66580796BE) /* 202 */, L64(0x3612264125C2B0DE) /* 203 */,
+ L64(0x057702BDAD1EFBB2) /* 204 */, L64(0xD4BABB8EACF84BE9) /* 205 */,
+ L64(0x91583139641BC67B) /* 206 */, L64(0x8BDC2DE08036E024) /* 207 */,
+ L64(0x603C8156F49F68ED) /* 208 */, L64(0xF7D236F7DBEF5111) /* 209 */,
+ L64(0x9727C4598AD21E80) /* 210 */, L64(0xA08A0896670A5FD7) /* 211 */,
+ L64(0xCB4A8F4309EBA9CB) /* 212 */, L64(0x81AF564B0F7036A1) /* 213 */,
+ L64(0xC0B99AA778199ABD) /* 214 */, L64(0x959F1EC83FC8E952) /* 215 */,
+ L64(0x8C505077794A81B9) /* 216 */, L64(0x3ACAAF8F056338F0) /* 217 */,
+ L64(0x07B43F50627A6778) /* 218 */, L64(0x4A44AB49F5ECCC77) /* 219 */,
+ L64(0x3BC3D6E4B679EE98) /* 220 */, L64(0x9CC0D4D1CF14108C) /* 221 */,
+ L64(0x4406C00B206BC8A0) /* 222 */, L64(0x82A18854C8D72D89) /* 223 */,
+ L64(0x67E366B35C3C432C) /* 224 */, L64(0xB923DD61102B37F2) /* 225 */,
+ L64(0x56AB2779D884271D) /* 226 */, L64(0xBE83E1B0FF1525AF) /* 227 */,
+ L64(0xFB7C65D4217E49A9) /* 228 */, L64(0x6BDBE0E76D48E7D4) /* 229 */,
+ L64(0x08DF828745D9179E) /* 230 */, L64(0x22EA6A9ADD53BD34) /* 231 */,
+ L64(0xE36E141C5622200A) /* 232 */, L64(0x7F805D1B8CB750EE) /* 233 */,
+ L64(0xAFE5C7A59F58E837) /* 234 */, L64(0xE27F996A4FB1C23C) /* 235 */,
+ L64(0xD3867DFB0775F0D0) /* 236 */, L64(0xD0E673DE6E88891A) /* 237 */,
+ L64(0x123AEB9EAFB86C25) /* 238 */, L64(0x30F1D5D5C145B895) /* 239 */,
+ L64(0xBB434A2DEE7269E7) /* 240 */, L64(0x78CB67ECF931FA38) /* 241 */,
+ L64(0xF33B0372323BBF9C) /* 242 */, L64(0x52D66336FB279C74) /* 243 */,
+ L64(0x505F33AC0AFB4EAA) /* 244 */, L64(0xE8A5CD99A2CCE187) /* 245 */,
+ L64(0x534974801E2D30BB) /* 246 */, L64(0x8D2D5711D5876D90) /* 247 */,
+ L64(0x1F1A412891BC038E) /* 248 */, L64(0xD6E2E71D82E56648) /* 249 */,
+ L64(0x74036C3A497732B7) /* 250 */, L64(0x89B67ED96361F5AB) /* 251 */,
+ L64(0xFFED95D8F1EA02A2) /* 252 */, L64(0xE72B3BD61464D43D) /* 253 */,
+ L64(0xA6300F170BDC4820) /* 254 */, L64(0xEBC18760ED78A77A) /* 255 */,
+ L64(0xE6A6BE5A05A12138) /* 256 */, L64(0xB5A122A5B4F87C98) /* 257 */,
+ L64(0x563C6089140B6990) /* 258 */, L64(0x4C46CB2E391F5DD5) /* 259 */,
+ L64(0xD932ADDBC9B79434) /* 260 */, L64(0x08EA70E42015AFF5) /* 261 */,
+ L64(0xD765A6673E478CF1) /* 262 */, L64(0xC4FB757EAB278D99) /* 263 */,
+ L64(0xDF11C6862D6E0692) /* 264 */, L64(0xDDEB84F10D7F3B16) /* 265 */,
+ L64(0x6F2EF604A665EA04) /* 266 */, L64(0x4A8E0F0FF0E0DFB3) /* 267 */,
+ L64(0xA5EDEEF83DBCBA51) /* 268 */, L64(0xFC4F0A2A0EA4371E) /* 269 */,
+ L64(0xE83E1DA85CB38429) /* 270 */, L64(0xDC8FF882BA1B1CE2) /* 271 */,
+ L64(0xCD45505E8353E80D) /* 272 */, L64(0x18D19A00D4DB0717) /* 273 */,
+ L64(0x34A0CFEDA5F38101) /* 274 */, L64(0x0BE77E518887CAF2) /* 275 */,
+ L64(0x1E341438B3C45136) /* 276 */, L64(0xE05797F49089CCF9) /* 277 */,
+ L64(0xFFD23F9DF2591D14) /* 278 */, L64(0x543DDA228595C5CD) /* 279 */,
+ L64(0x661F81FD99052A33) /* 280 */, L64(0x8736E641DB0F7B76) /* 281 */,
+ L64(0x15227725418E5307) /* 282 */, L64(0xE25F7F46162EB2FA) /* 283 */,
+ L64(0x48A8B2126C13D9FE) /* 284 */, L64(0xAFDC541792E76EEA) /* 285 */,
+ L64(0x03D912BFC6D1898F) /* 286 */, L64(0x31B1AAFA1B83F51B) /* 287 */,
+ L64(0xF1AC2796E42AB7D9) /* 288 */, L64(0x40A3A7D7FCD2EBAC) /* 289 */,
+ L64(0x1056136D0AFBBCC5) /* 290 */, L64(0x7889E1DD9A6D0C85) /* 291 */,
+ L64(0xD33525782A7974AA) /* 292 */, L64(0xA7E25D09078AC09B) /* 293 */,
+ L64(0xBD4138B3EAC6EDD0) /* 294 */, L64(0x920ABFBE71EB9E70) /* 295 */,
+ L64(0xA2A5D0F54FC2625C) /* 296 */, L64(0xC054E36B0B1290A3) /* 297 */,
+ L64(0xF6DD59FF62FE932B) /* 298 */, L64(0x3537354511A8AC7D) /* 299 */,
+ L64(0xCA845E9172FADCD4) /* 300 */, L64(0x84F82B60329D20DC) /* 301 */,
+ L64(0x79C62CE1CD672F18) /* 302 */, L64(0x8B09A2ADD124642C) /* 303 */,
+ L64(0xD0C1E96A19D9E726) /* 304 */, L64(0x5A786A9B4BA9500C) /* 305 */,
+ L64(0x0E020336634C43F3) /* 306 */, L64(0xC17B474AEB66D822) /* 307 */,
+ L64(0x6A731AE3EC9BAAC2) /* 308 */, L64(0x8226667AE0840258) /* 309 */,
+ L64(0x67D4567691CAECA5) /* 310 */, L64(0x1D94155C4875ADB5) /* 311 */,
+ L64(0x6D00FD985B813FDF) /* 312 */, L64(0x51286EFCB774CD06) /* 313 */,
+ L64(0x5E8834471FA744AF) /* 314 */, L64(0xF72CA0AEE761AE2E) /* 315 */,
+ L64(0xBE40E4CDAEE8E09A) /* 316 */, L64(0xE9970BBB5118F665) /* 317 */,
+ L64(0x726E4BEB33DF1964) /* 318 */, L64(0x703B000729199762) /* 319 */,
+ L64(0x4631D816F5EF30A7) /* 320 */, L64(0xB880B5B51504A6BE) /* 321 */,
+ L64(0x641793C37ED84B6C) /* 322 */, L64(0x7B21ED77F6E97D96) /* 323 */,
+ L64(0x776306312EF96B73) /* 324 */, L64(0xAE528948E86FF3F4) /* 325 */,
+ L64(0x53DBD7F286A3F8F8) /* 326 */, L64(0x16CADCE74CFC1063) /* 327 */,
+ L64(0x005C19BDFA52C6DD) /* 328 */, L64(0x68868F5D64D46AD3) /* 329 */,
+ L64(0x3A9D512CCF1E186A) /* 330 */, L64(0x367E62C2385660AE) /* 331 */,
+ L64(0xE359E7EA77DCB1D7) /* 332 */, L64(0x526C0773749ABE6E) /* 333 */,
+ L64(0x735AE5F9D09F734B) /* 334 */, L64(0x493FC7CC8A558BA8) /* 335 */,
+ L64(0xB0B9C1533041AB45) /* 336 */, L64(0x321958BA470A59BD) /* 337 */,
+ L64(0x852DB00B5F46C393) /* 338 */, L64(0x91209B2BD336B0E5) /* 339 */,
+ L64(0x6E604F7D659EF19F) /* 340 */, L64(0xB99A8AE2782CCB24) /* 341 */,
+ L64(0xCCF52AB6C814C4C7) /* 342 */, L64(0x4727D9AFBE11727B) /* 343 */,
+ L64(0x7E950D0C0121B34D) /* 344 */, L64(0x756F435670AD471F) /* 345 */,
+ L64(0xF5ADD442615A6849) /* 346 */, L64(0x4E87E09980B9957A) /* 347 */,
+ L64(0x2ACFA1DF50AEE355) /* 348 */, L64(0xD898263AFD2FD556) /* 349 */,
+ L64(0xC8F4924DD80C8FD6) /* 350 */, L64(0xCF99CA3D754A173A) /* 351 */,
+ L64(0xFE477BACAF91BF3C) /* 352 */, L64(0xED5371F6D690C12D) /* 353 */,
+ L64(0x831A5C285E687094) /* 354 */, L64(0xC5D3C90A3708A0A4) /* 355 */,
+ L64(0x0F7F903717D06580) /* 356 */, L64(0x19F9BB13B8FDF27F) /* 357 */,
+ L64(0xB1BD6F1B4D502843) /* 358 */, L64(0x1C761BA38FFF4012) /* 359 */,
+ L64(0x0D1530C4E2E21F3B) /* 360 */, L64(0x8943CE69A7372C8A) /* 361 */,
+ L64(0xE5184E11FEB5CE66) /* 362 */, L64(0x618BDB80BD736621) /* 363 */,
+ L64(0x7D29BAD68B574D0B) /* 364 */, L64(0x81BB613E25E6FE5B) /* 365 */,
+ L64(0x071C9C10BC07913F) /* 366 */, L64(0xC7BEEB7909AC2D97) /* 367 */,
+ L64(0xC3E58D353BC5D757) /* 368 */, L64(0xEB017892F38F61E8) /* 369 */,
+ L64(0xD4EFFB9C9B1CC21A) /* 370 */, L64(0x99727D26F494F7AB) /* 371 */,
+ L64(0xA3E063A2956B3E03) /* 372 */, L64(0x9D4A8B9A4AA09C30) /* 373 */,
+ L64(0x3F6AB7D500090FB4) /* 374 */, L64(0x9CC0F2A057268AC0) /* 375 */,
+ L64(0x3DEE9D2DEDBF42D1) /* 376 */, L64(0x330F49C87960A972) /* 377 */,
+ L64(0xC6B2720287421B41) /* 378 */, L64(0x0AC59EC07C00369C) /* 379 */,
+ L64(0xEF4EAC49CB353425) /* 380 */, L64(0xF450244EEF0129D8) /* 381 */,
+ L64(0x8ACC46E5CAF4DEB6) /* 382 */, L64(0x2FFEAB63989263F7) /* 383 */,
+ L64(0x8F7CB9FE5D7A4578) /* 384 */, L64(0x5BD8F7644E634635) /* 385 */,
+ L64(0x427A7315BF2DC900) /* 386 */, L64(0x17D0C4AA2125261C) /* 387 */,
+ L64(0x3992486C93518E50) /* 388 */, L64(0xB4CBFEE0A2D7D4C3) /* 389 */,
+ L64(0x7C75D6202C5DDD8D) /* 390 */, L64(0xDBC295D8E35B6C61) /* 391 */,
+ L64(0x60B369D302032B19) /* 392 */, L64(0xCE42685FDCE44132) /* 393 */,
+ L64(0x06F3DDB9DDF65610) /* 394 */, L64(0x8EA4D21DB5E148F0) /* 395 */,
+ L64(0x20B0FCE62FCD496F) /* 396 */, L64(0x2C1B912358B0EE31) /* 397 */,
+ L64(0xB28317B818F5A308) /* 398 */, L64(0xA89C1E189CA6D2CF) /* 399 */,
+ L64(0x0C6B18576AAADBC8) /* 400 */, L64(0xB65DEAA91299FAE3) /* 401 */,
+ L64(0xFB2B794B7F1027E7) /* 402 */, L64(0x04E4317F443B5BEB) /* 403 */,
+ L64(0x4B852D325939D0A6) /* 404 */, L64(0xD5AE6BEEFB207FFC) /* 405 */,
+ L64(0x309682B281C7D374) /* 406 */, L64(0xBAE309A194C3B475) /* 407 */,
+ L64(0x8CC3F97B13B49F05) /* 408 */, L64(0x98A9422FF8293967) /* 409 */,
+ L64(0x244B16B01076FF7C) /* 410 */, L64(0xF8BF571C663D67EE) /* 411 */,
+ L64(0x1F0D6758EEE30DA1) /* 412 */, L64(0xC9B611D97ADEB9B7) /* 413 */,
+ L64(0xB7AFD5887B6C57A2) /* 414 */, L64(0x6290AE846B984FE1) /* 415 */,
+ L64(0x94DF4CDEACC1A5FD) /* 416 */, L64(0x058A5BD1C5483AFF) /* 417 */,
+ L64(0x63166CC142BA3C37) /* 418 */, L64(0x8DB8526EB2F76F40) /* 419 */,
+ L64(0xE10880036F0D6D4E) /* 420 */, L64(0x9E0523C9971D311D) /* 421 */,
+ L64(0x45EC2824CC7CD691) /* 422 */, L64(0x575B8359E62382C9) /* 423 */,
+ L64(0xFA9E400DC4889995) /* 424 */, L64(0xD1823ECB45721568) /* 425 */,
+ L64(0xDAFD983B8206082F) /* 426 */, L64(0xAA7D29082386A8CB) /* 427 */,
+ L64(0x269FCD4403B87588) /* 428 */, L64(0x1B91F5F728BDD1E0) /* 429 */,
+ L64(0xE4669F39040201F6) /* 430 */, L64(0x7A1D7C218CF04ADE) /* 431 */,
+ L64(0x65623C29D79CE5CE) /* 432 */, L64(0x2368449096C00BB1) /* 433 */,
+ L64(0xAB9BF1879DA503BA) /* 434 */, L64(0xBC23ECB1A458058E) /* 435 */,
+ L64(0x9A58DF01BB401ECC) /* 436 */, L64(0xA070E868A85F143D) /* 437 */,
+ L64(0x4FF188307DF2239E) /* 438 */, L64(0x14D565B41A641183) /* 439 */,
+ L64(0xEE13337452701602) /* 440 */, L64(0x950E3DCF3F285E09) /* 441 */,
+ L64(0x59930254B9C80953) /* 442 */, L64(0x3BF299408930DA6D) /* 443 */,
+ L64(0xA955943F53691387) /* 444 */, L64(0xA15EDECAA9CB8784) /* 445 */,
+ L64(0x29142127352BE9A0) /* 446 */, L64(0x76F0371FFF4E7AFB) /* 447 */,
+ L64(0x0239F450274F2228) /* 448 */, L64(0xBB073AF01D5E868B) /* 449 */,
+ L64(0xBFC80571C10E96C1) /* 450 */, L64(0xD267088568222E23) /* 451 */,
+ L64(0x9671A3D48E80B5B0) /* 452 */, L64(0x55B5D38AE193BB81) /* 453 */,
+ L64(0x693AE2D0A18B04B8) /* 454 */, L64(0x5C48B4ECADD5335F) /* 455 */,
+ L64(0xFD743B194916A1CA) /* 456 */, L64(0x2577018134BE98C4) /* 457 */,
+ L64(0xE77987E83C54A4AD) /* 458 */, L64(0x28E11014DA33E1B9) /* 459 */,
+ L64(0x270CC59E226AA213) /* 460 */, L64(0x71495F756D1A5F60) /* 461 */,
+ L64(0x9BE853FB60AFEF77) /* 462 */, L64(0xADC786A7F7443DBF) /* 463 */,
+ L64(0x0904456173B29A82) /* 464 */, L64(0x58BC7A66C232BD5E) /* 465 */,
+ L64(0xF306558C673AC8B2) /* 466 */, L64(0x41F639C6B6C9772A) /* 467 */,
+ L64(0x216DEFE99FDA35DA) /* 468 */, L64(0x11640CC71C7BE615) /* 469 */,
+ L64(0x93C43694565C5527) /* 470 */, L64(0xEA038E6246777839) /* 471 */,
+ L64(0xF9ABF3CE5A3E2469) /* 472 */, L64(0x741E768D0FD312D2) /* 473 */,
+ L64(0x0144B883CED652C6) /* 474 */, L64(0xC20B5A5BA33F8552) /* 475 */,
+ L64(0x1AE69633C3435A9D) /* 476 */, L64(0x97A28CA4088CFDEC) /* 477 */,
+ L64(0x8824A43C1E96F420) /* 478 */, L64(0x37612FA66EEEA746) /* 479 */,
+ L64(0x6B4CB165F9CF0E5A) /* 480 */, L64(0x43AA1C06A0ABFB4A) /* 481 */,
+ L64(0x7F4DC26FF162796B) /* 482 */, L64(0x6CBACC8E54ED9B0F) /* 483 */,
+ L64(0xA6B7FFEFD2BB253E) /* 484 */, L64(0x2E25BC95B0A29D4F) /* 485 */,
+ L64(0x86D6A58BDEF1388C) /* 486 */, L64(0xDED74AC576B6F054) /* 487 */,
+ L64(0x8030BDBC2B45805D) /* 488 */, L64(0x3C81AF70E94D9289) /* 489 */,
+ L64(0x3EFF6DDA9E3100DB) /* 490 */, L64(0xB38DC39FDFCC8847) /* 491 */,
+ L64(0x123885528D17B87E) /* 492 */, L64(0xF2DA0ED240B1B642) /* 493 */,
+ L64(0x44CEFADCD54BF9A9) /* 494 */, L64(0x1312200E433C7EE6) /* 495 */,
+ L64(0x9FFCC84F3A78C748) /* 496 */, L64(0xF0CD1F72248576BB) /* 497 */,
+ L64(0xEC6974053638CFE4) /* 498 */, L64(0x2BA7B67C0CEC4E4C) /* 499 */,
+ L64(0xAC2F4DF3E5CE32ED) /* 500 */, L64(0xCB33D14326EA4C11) /* 501 */,
+ L64(0xA4E9044CC77E58BC) /* 502 */, L64(0x5F513293D934FCEF) /* 503 */,
+ L64(0x5DC9645506E55444) /* 504 */, L64(0x50DE418F317DE40A) /* 505 */,
+ L64(0x388CB31A69DDE259) /* 506 */, L64(0x2DB4A83455820A86) /* 507 */,
+ L64(0x9010A91E84711AE9) /* 508 */, L64(0x4DF7F0B7B1498371) /* 509 */,
+ L64(0xD62A2EABC0977179) /* 510 */, L64(0x22FAC097AA8D5C0E) /* 511 */,
+ L64(0xF49FCC2FF1DAF39B) /* 512 */, L64(0x487FD5C66FF29281) /* 513 */,
+ L64(0xE8A30667FCDCA83F) /* 514 */, L64(0x2C9B4BE3D2FCCE63) /* 515 */,
+ L64(0xDA3FF74B93FBBBC2) /* 516 */, L64(0x2FA165D2FE70BA66) /* 517 */,
+ L64(0xA103E279970E93D4) /* 518 */, L64(0xBECDEC77B0E45E71) /* 519 */,
+ L64(0xCFB41E723985E497) /* 520 */, L64(0xB70AAA025EF75017) /* 521 */,
+ L64(0xD42309F03840B8E0) /* 522 */, L64(0x8EFC1AD035898579) /* 523 */,
+ L64(0x96C6920BE2B2ABC5) /* 524 */, L64(0x66AF4163375A9172) /* 525 */,
+ L64(0x2174ABDCCA7127FB) /* 526 */, L64(0xB33CCEA64A72FF41) /* 527 */,
+ L64(0xF04A4933083066A5) /* 528 */, L64(0x8D970ACDD7289AF5) /* 529 */,
+ L64(0x8F96E8E031C8C25E) /* 530 */, L64(0xF3FEC02276875D47) /* 531 */,
+ L64(0xEC7BF310056190DD) /* 532 */, L64(0xF5ADB0AEBB0F1491) /* 533 */,
+ L64(0x9B50F8850FD58892) /* 534 */, L64(0x4975488358B74DE8) /* 535 */,
+ L64(0xA3354FF691531C61) /* 536 */, L64(0x0702BBE481D2C6EE) /* 537 */,
+ L64(0x89FB24057DEDED98) /* 538 */, L64(0xAC3075138596E902) /* 539 */,
+ L64(0x1D2D3580172772ED) /* 540 */, L64(0xEB738FC28E6BC30D) /* 541 */,
+ L64(0x5854EF8F63044326) /* 542 */, L64(0x9E5C52325ADD3BBE) /* 543 */,
+ L64(0x90AA53CF325C4623) /* 544 */, L64(0xC1D24D51349DD067) /* 545 */,
+ L64(0x2051CFEEA69EA624) /* 546 */, L64(0x13220F0A862E7E4F) /* 547 */,
+ L64(0xCE39399404E04864) /* 548 */, L64(0xD9C42CA47086FCB7) /* 549 */,
+ L64(0x685AD2238A03E7CC) /* 550 */, L64(0x066484B2AB2FF1DB) /* 551 */,
+ L64(0xFE9D5D70EFBF79EC) /* 552 */, L64(0x5B13B9DD9C481854) /* 553 */,
+ L64(0x15F0D475ED1509AD) /* 554 */, L64(0x0BEBCD060EC79851) /* 555 */,
+ L64(0xD58C6791183AB7F8) /* 556 */, L64(0xD1187C5052F3EEE4) /* 557 */,
+ L64(0xC95D1192E54E82FF) /* 558 */, L64(0x86EEA14CB9AC6CA2) /* 559 */,
+ L64(0x3485BEB153677D5D) /* 560 */, L64(0xDD191D781F8C492A) /* 561 */,
+ L64(0xF60866BAA784EBF9) /* 562 */, L64(0x518F643BA2D08C74) /* 563 */,
+ L64(0x8852E956E1087C22) /* 564 */, L64(0xA768CB8DC410AE8D) /* 565 */,
+ L64(0x38047726BFEC8E1A) /* 566 */, L64(0xA67738B4CD3B45AA) /* 567 */,
+ L64(0xAD16691CEC0DDE19) /* 568 */, L64(0xC6D4319380462E07) /* 569 */,
+ L64(0xC5A5876D0BA61938) /* 570 */, L64(0x16B9FA1FA58FD840) /* 571 */,
+ L64(0x188AB1173CA74F18) /* 572 */, L64(0xABDA2F98C99C021F) /* 573 */,
+ L64(0x3E0580AB134AE816) /* 574 */, L64(0x5F3B05B773645ABB) /* 575 */,
+ L64(0x2501A2BE5575F2F6) /* 576 */, L64(0x1B2F74004E7E8BA9) /* 577 */,
+ L64(0x1CD7580371E8D953) /* 578 */, L64(0x7F6ED89562764E30) /* 579 */,
+ L64(0xB15926FF596F003D) /* 580 */, L64(0x9F65293DA8C5D6B9) /* 581 */,
+ L64(0x6ECEF04DD690F84C) /* 582 */, L64(0x4782275FFF33AF88) /* 583 */,
+ L64(0xE41433083F820801) /* 584 */, L64(0xFD0DFE409A1AF9B5) /* 585 */,
+ L64(0x4325A3342CDB396B) /* 586 */, L64(0x8AE77E62B301B252) /* 587 */,
+ L64(0xC36F9E9F6655615A) /* 588 */, L64(0x85455A2D92D32C09) /* 589 */,
+ L64(0xF2C7DEA949477485) /* 590 */, L64(0x63CFB4C133A39EBA) /* 591 */,
+ L64(0x83B040CC6EBC5462) /* 592 */, L64(0x3B9454C8FDB326B0) /* 593 */,
+ L64(0x56F56A9E87FFD78C) /* 594 */, L64(0x2DC2940D99F42BC6) /* 595 */,
+ L64(0x98F7DF096B096E2D) /* 596 */, L64(0x19A6E01E3AD852BF) /* 597 */,
+ L64(0x42A99CCBDBD4B40B) /* 598 */, L64(0xA59998AF45E9C559) /* 599 */,
+ L64(0x366295E807D93186) /* 600 */, L64(0x6B48181BFAA1F773) /* 601 */,
+ L64(0x1FEC57E2157A0A1D) /* 602 */, L64(0x4667446AF6201AD5) /* 603 */,
+ L64(0xE615EBCACFB0F075) /* 604 */, L64(0xB8F31F4F68290778) /* 605 */,
+ L64(0x22713ED6CE22D11E) /* 606 */, L64(0x3057C1A72EC3C93B) /* 607 */,
+ L64(0xCB46ACC37C3F1F2F) /* 608 */, L64(0xDBB893FD02AAF50E) /* 609 */,
+ L64(0x331FD92E600B9FCF) /* 610 */, L64(0xA498F96148EA3AD6) /* 611 */,
+ L64(0xA8D8426E8B6A83EA) /* 612 */, L64(0xA089B274B7735CDC) /* 613 */,
+ L64(0x87F6B3731E524A11) /* 614 */, L64(0x118808E5CBC96749) /* 615 */,
+ L64(0x9906E4C7B19BD394) /* 616 */, L64(0xAFED7F7E9B24A20C) /* 617 */,
+ L64(0x6509EADEEB3644A7) /* 618 */, L64(0x6C1EF1D3E8EF0EDE) /* 619 */,
+ L64(0xB9C97D43E9798FB4) /* 620 */, L64(0xA2F2D784740C28A3) /* 621 */,
+ L64(0x7B8496476197566F) /* 622 */, L64(0x7A5BE3E6B65F069D) /* 623 */,
+ L64(0xF96330ED78BE6F10) /* 624 */, L64(0xEEE60DE77A076A15) /* 625 */,
+ L64(0x2B4BEE4AA08B9BD0) /* 626 */, L64(0x6A56A63EC7B8894E) /* 627 */,
+ L64(0x02121359BA34FEF4) /* 628 */, L64(0x4CBF99F8283703FC) /* 629 */,
+ L64(0x398071350CAF30C8) /* 630 */, L64(0xD0A77A89F017687A) /* 631 */,
+ L64(0xF1C1A9EB9E423569) /* 632 */, L64(0x8C7976282DEE8199) /* 633 */,
+ L64(0x5D1737A5DD1F7ABD) /* 634 */, L64(0x4F53433C09A9FA80) /* 635 */,
+ L64(0xFA8B0C53DF7CA1D9) /* 636 */, L64(0x3FD9DCBC886CCB77) /* 637 */,
+ L64(0xC040917CA91B4720) /* 638 */, L64(0x7DD00142F9D1DCDF) /* 639 */,
+ L64(0x8476FC1D4F387B58) /* 640 */, L64(0x23F8E7C5F3316503) /* 641 */,
+ L64(0x032A2244E7E37339) /* 642 */, L64(0x5C87A5D750F5A74B) /* 643 */,
+ L64(0x082B4CC43698992E) /* 644 */, L64(0xDF917BECB858F63C) /* 645 */,
+ L64(0x3270B8FC5BF86DDA) /* 646 */, L64(0x10AE72BB29B5DD76) /* 647 */,
+ L64(0x576AC94E7700362B) /* 648 */, L64(0x1AD112DAC61EFB8F) /* 649 */,
+ L64(0x691BC30EC5FAA427) /* 650 */, L64(0xFF246311CC327143) /* 651 */,
+ L64(0x3142368E30E53206) /* 652 */, L64(0x71380E31E02CA396) /* 653 */,
+ L64(0x958D5C960AAD76F1) /* 654 */, L64(0xF8D6F430C16DA536) /* 655 */,
+ L64(0xC8FFD13F1BE7E1D2) /* 656 */, L64(0x7578AE66004DDBE1) /* 657 */,
+ L64(0x05833F01067BE646) /* 658 */, L64(0xBB34B5AD3BFE586D) /* 659 */,
+ L64(0x095F34C9A12B97F0) /* 660 */, L64(0x247AB64525D60CA8) /* 661 */,
+ L64(0xDCDBC6F3017477D1) /* 662 */, L64(0x4A2E14D4DECAD24D) /* 663 */,
+ L64(0xBDB5E6D9BE0A1EEB) /* 664 */, L64(0x2A7E70F7794301AB) /* 665 */,
+ L64(0xDEF42D8A270540FD) /* 666 */, L64(0x01078EC0A34C22C1) /* 667 */,
+ L64(0xE5DE511AF4C16387) /* 668 */, L64(0x7EBB3A52BD9A330A) /* 669 */,
+ L64(0x77697857AA7D6435) /* 670 */, L64(0x004E831603AE4C32) /* 671 */,
+ L64(0xE7A21020AD78E312) /* 672 */, L64(0x9D41A70C6AB420F2) /* 673 */,
+ L64(0x28E06C18EA1141E6) /* 674 */, L64(0xD2B28CBD984F6B28) /* 675 */,
+ L64(0x26B75F6C446E9D83) /* 676 */, L64(0xBA47568C4D418D7F) /* 677 */,
+ L64(0xD80BADBFE6183D8E) /* 678 */, L64(0x0E206D7F5F166044) /* 679 */,
+ L64(0xE258A43911CBCA3E) /* 680 */, L64(0x723A1746B21DC0BC) /* 681 */,
+ L64(0xC7CAA854F5D7CDD3) /* 682 */, L64(0x7CAC32883D261D9C) /* 683 */,
+ L64(0x7690C26423BA942C) /* 684 */, L64(0x17E55524478042B8) /* 685 */,
+ L64(0xE0BE477656A2389F) /* 686 */, L64(0x4D289B5E67AB2DA0) /* 687 */,
+ L64(0x44862B9C8FBBFD31) /* 688 */, L64(0xB47CC8049D141365) /* 689 */,
+ L64(0x822C1B362B91C793) /* 690 */, L64(0x4EB14655FB13DFD8) /* 691 */,
+ L64(0x1ECBBA0714E2A97B) /* 692 */, L64(0x6143459D5CDE5F14) /* 693 */,
+ L64(0x53A8FBF1D5F0AC89) /* 694 */, L64(0x97EA04D81C5E5B00) /* 695 */,
+ L64(0x622181A8D4FDB3F3) /* 696 */, L64(0xE9BCD341572A1208) /* 697 */,
+ L64(0x1411258643CCE58A) /* 698 */, L64(0x9144C5FEA4C6E0A4) /* 699 */,
+ L64(0x0D33D06565CF620F) /* 700 */, L64(0x54A48D489F219CA1) /* 701 */,
+ L64(0xC43E5EAC6D63C821) /* 702 */, L64(0xA9728B3A72770DAF) /* 703 */,
+ L64(0xD7934E7B20DF87EF) /* 704 */, L64(0xE35503B61A3E86E5) /* 705 */,
+ L64(0xCAE321FBC819D504) /* 706 */, L64(0x129A50B3AC60BFA6) /* 707 */,
+ L64(0xCD5E68EA7E9FB6C3) /* 708 */, L64(0xB01C90199483B1C7) /* 709 */,
+ L64(0x3DE93CD5C295376C) /* 710 */, L64(0xAED52EDF2AB9AD13) /* 711 */,
+ L64(0x2E60F512C0A07884) /* 712 */, L64(0xBC3D86A3E36210C9) /* 713 */,
+ L64(0x35269D9B163951CE) /* 714 */, L64(0x0C7D6E2AD0CDB5FA) /* 715 */,
+ L64(0x59E86297D87F5733) /* 716 */, L64(0x298EF221898DB0E7) /* 717 */,
+ L64(0x55000029D1A5AA7E) /* 718 */, L64(0x8BC08AE1B5061B45) /* 719 */,
+ L64(0xC2C31C2B6C92703A) /* 720 */, L64(0x94CC596BAF25EF42) /* 721 */,
+ L64(0x0A1D73DB22540456) /* 722 */, L64(0x04B6A0F9D9C4179A) /* 723 */,
+ L64(0xEFFDAFA2AE3D3C60) /* 724 */, L64(0xF7C8075BB49496C4) /* 725 */,
+ L64(0x9CC5C7141D1CD4E3) /* 726 */, L64(0x78BD1638218E5534) /* 727 */,
+ L64(0xB2F11568F850246A) /* 728 */, L64(0xEDFABCFA9502BC29) /* 729 */,
+ L64(0x796CE5F2DA23051B) /* 730 */, L64(0xAAE128B0DC93537C) /* 731 */,
+ L64(0x3A493DA0EE4B29AE) /* 732 */, L64(0xB5DF6B2C416895D7) /* 733 */,
+ L64(0xFCABBD25122D7F37) /* 734 */, L64(0x70810B58105DC4B1) /* 735 */,
+ L64(0xE10FDD37F7882A90) /* 736 */, L64(0x524DCAB5518A3F5C) /* 737 */,
+ L64(0x3C9E85878451255B) /* 738 */, L64(0x4029828119BD34E2) /* 739 */,
+ L64(0x74A05B6F5D3CECCB) /* 740 */, L64(0xB610021542E13ECA) /* 741 */,
+ L64(0x0FF979D12F59E2AC) /* 742 */, L64(0x6037DA27E4F9CC50) /* 743 */,
+ L64(0x5E92975A0DF1847D) /* 744 */, L64(0xD66DE190D3E623FE) /* 745 */,
+ L64(0x5032D6B87B568048) /* 746 */, L64(0x9A36B7CE8235216E) /* 747 */,
+ L64(0x80272A7A24F64B4A) /* 748 */, L64(0x93EFED8B8C6916F7) /* 749 */,
+ L64(0x37DDBFF44CCE1555) /* 750 */, L64(0x4B95DB5D4B99BD25) /* 751 */,
+ L64(0x92D3FDA169812FC0) /* 752 */, L64(0xFB1A4A9A90660BB6) /* 753 */,
+ L64(0x730C196946A4B9B2) /* 754 */, L64(0x81E289AA7F49DA68) /* 755 */,
+ L64(0x64669A0F83B1A05F) /* 756 */, L64(0x27B3FF7D9644F48B) /* 757 */,
+ L64(0xCC6B615C8DB675B3) /* 758 */, L64(0x674F20B9BCEBBE95) /* 759 */,
+ L64(0x6F31238275655982) /* 760 */, L64(0x5AE488713E45CF05) /* 761 */,
+ L64(0xBF619F9954C21157) /* 762 */, L64(0xEABAC46040A8EAE9) /* 763 */,
+ L64(0x454C6FE9F2C0C1CD) /* 764 */, L64(0x419CF6496412691C) /* 765 */,
+ L64(0xD3DC3BEF265B0F70) /* 766 */, L64(0x6D0E60F5C3578A9E) /* 767 */,
+ L64(0x5B0E608526323C55) /* 768 */, L64(0x1A46C1A9FA1B59F5) /* 769 */,
+ L64(0xA9E245A17C4C8FFA) /* 770 */, L64(0x65CA5159DB2955D7) /* 771 */,
+ L64(0x05DB0A76CE35AFC2) /* 772 */, L64(0x81EAC77EA9113D45) /* 773 */,
+ L64(0x528EF88AB6AC0A0D) /* 774 */, L64(0xA09EA253597BE3FF) /* 775 */,
+ L64(0x430DDFB3AC48CD56) /* 776 */, L64(0xC4B3A67AF45CE46F) /* 777 */,
+ L64(0x4ECECFD8FBE2D05E) /* 778 */, L64(0x3EF56F10B39935F0) /* 779 */,
+ L64(0x0B22D6829CD619C6) /* 780 */, L64(0x17FD460A74DF2069) /* 781 */,
+ L64(0x6CF8CC8E8510ED40) /* 782 */, L64(0xD6C824BF3A6ECAA7) /* 783 */,
+ L64(0x61243D581A817049) /* 784 */, L64(0x048BACB6BBC163A2) /* 785 */,
+ L64(0xD9A38AC27D44CC32) /* 786 */, L64(0x7FDDFF5BAAF410AB) /* 787 */,
+ L64(0xAD6D495AA804824B) /* 788 */, L64(0xE1A6A74F2D8C9F94) /* 789 */,
+ L64(0xD4F7851235DEE8E3) /* 790 */, L64(0xFD4B7F886540D893) /* 791 */,
+ L64(0x247C20042AA4BFDA) /* 792 */, L64(0x096EA1C517D1327C) /* 793 */,
+ L64(0xD56966B4361A6685) /* 794 */, L64(0x277DA5C31221057D) /* 795 */,
+ L64(0x94D59893A43ACFF7) /* 796 */, L64(0x64F0C51CCDC02281) /* 797 */,
+ L64(0x3D33BCC4FF6189DB) /* 798 */, L64(0xE005CB184CE66AF1) /* 799 */,
+ L64(0xFF5CCD1D1DB99BEA) /* 800 */, L64(0xB0B854A7FE42980F) /* 801 */,
+ L64(0x7BD46A6A718D4B9F) /* 802 */, L64(0xD10FA8CC22A5FD8C) /* 803 */,
+ L64(0xD31484952BE4BD31) /* 804 */, L64(0xC7FA975FCB243847) /* 805 */,
+ L64(0x4886ED1E5846C407) /* 806 */, L64(0x28CDDB791EB70B04) /* 807 */,
+ L64(0xC2B00BE2F573417F) /* 808 */, L64(0x5C9590452180F877) /* 809 */,
+ L64(0x7A6BDDFFF370EB00) /* 810 */, L64(0xCE509E38D6D9D6A4) /* 811 */,
+ L64(0xEBEB0F00647FA702) /* 812 */, L64(0x1DCC06CF76606F06) /* 813 */,
+ L64(0xE4D9F28BA286FF0A) /* 814 */, L64(0xD85A305DC918C262) /* 815 */,
+ L64(0x475B1D8732225F54) /* 816 */, L64(0x2D4FB51668CCB5FE) /* 817 */,
+ L64(0xA679B9D9D72BBA20) /* 818 */, L64(0x53841C0D912D43A5) /* 819 */,
+ L64(0x3B7EAA48BF12A4E8) /* 820 */, L64(0x781E0E47F22F1DDF) /* 821 */,
+ L64(0xEFF20CE60AB50973) /* 822 */, L64(0x20D261D19DFFB742) /* 823 */,
+ L64(0x16A12B03062A2E39) /* 824 */, L64(0x1960EB2239650495) /* 825 */,
+ L64(0x251C16FED50EB8B8) /* 826 */, L64(0x9AC0C330F826016E) /* 827 */,
+ L64(0xED152665953E7671) /* 828 */, L64(0x02D63194A6369570) /* 829 */,
+ L64(0x5074F08394B1C987) /* 830 */, L64(0x70BA598C90B25CE1) /* 831 */,
+ L64(0x794A15810B9742F6) /* 832 */, L64(0x0D5925E9FCAF8C6C) /* 833 */,
+ L64(0x3067716CD868744E) /* 834 */, L64(0x910AB077E8D7731B) /* 835 */,
+ L64(0x6A61BBDB5AC42F61) /* 836 */, L64(0x93513EFBF0851567) /* 837 */,
+ L64(0xF494724B9E83E9D5) /* 838 */, L64(0xE887E1985C09648D) /* 839 */,
+ L64(0x34B1D3C675370CFD) /* 840 */, L64(0xDC35E433BC0D255D) /* 841 */,
+ L64(0xD0AAB84234131BE0) /* 842 */, L64(0x08042A50B48B7EAF) /* 843 */,
+ L64(0x9997C4EE44A3AB35) /* 844 */, L64(0x829A7B49201799D0) /* 845 */,
+ L64(0x263B8307B7C54441) /* 846 */, L64(0x752F95F4FD6A6CA6) /* 847 */,
+ L64(0x927217402C08C6E5) /* 848 */, L64(0x2A8AB754A795D9EE) /* 849 */,
+ L64(0xA442F7552F72943D) /* 850 */, L64(0x2C31334E19781208) /* 851 */,
+ L64(0x4FA98D7CEAEE6291) /* 852 */, L64(0x55C3862F665DB309) /* 853 */,
+ L64(0xBD0610175D53B1F3) /* 854 */, L64(0x46FE6CB840413F27) /* 855 */,
+ L64(0x3FE03792DF0CFA59) /* 856 */, L64(0xCFE700372EB85E8F) /* 857 */,
+ L64(0xA7BE29E7ADBCE118) /* 858 */, L64(0xE544EE5CDE8431DD) /* 859 */,
+ L64(0x8A781B1B41F1873E) /* 860 */, L64(0xA5C94C78A0D2F0E7) /* 861 */,
+ L64(0x39412E2877B60728) /* 862 */, L64(0xA1265EF3AFC9A62C) /* 863 */,
+ L64(0xBCC2770C6A2506C5) /* 864 */, L64(0x3AB66DD5DCE1CE12) /* 865 */,
+ L64(0xE65499D04A675B37) /* 866 */, L64(0x7D8F523481BFD216) /* 867 */,
+ L64(0x0F6F64FCEC15F389) /* 868 */, L64(0x74EFBE618B5B13C8) /* 869 */,
+ L64(0xACDC82B714273E1D) /* 870 */, L64(0xDD40BFE003199D17) /* 871 */,
+ L64(0x37E99257E7E061F8) /* 872 */, L64(0xFA52626904775AAA) /* 873 */,
+ L64(0x8BBBF63A463D56F9) /* 874 */, L64(0xF0013F1543A26E64) /* 875 */,
+ L64(0xA8307E9F879EC898) /* 876 */, L64(0xCC4C27A4150177CC) /* 877 */,
+ L64(0x1B432F2CCA1D3348) /* 878 */, L64(0xDE1D1F8F9F6FA013) /* 879 */,
+ L64(0x606602A047A7DDD6) /* 880 */, L64(0xD237AB64CC1CB2C7) /* 881 */,
+ L64(0x9B938E7225FCD1D3) /* 882 */, L64(0xEC4E03708E0FF476) /* 883 */,
+ L64(0xFEB2FBDA3D03C12D) /* 884 */, L64(0xAE0BCED2EE43889A) /* 885 */,
+ L64(0x22CB8923EBFB4F43) /* 886 */, L64(0x69360D013CF7396D) /* 887 */,
+ L64(0x855E3602D2D4E022) /* 888 */, L64(0x073805BAD01F784C) /* 889 */,
+ L64(0x33E17A133852F546) /* 890 */, L64(0xDF4874058AC7B638) /* 891 */,
+ L64(0xBA92B29C678AA14A) /* 892 */, L64(0x0CE89FC76CFAADCD) /* 893 */,
+ L64(0x5F9D4E0908339E34) /* 894 */, L64(0xF1AFE9291F5923B9) /* 895 */,
+ L64(0x6E3480F60F4A265F) /* 896 */, L64(0xEEBF3A2AB29B841C) /* 897 */,
+ L64(0xE21938A88F91B4AD) /* 898 */, L64(0x57DFEFF845C6D3C3) /* 899 */,
+ L64(0x2F006B0BF62CAAF2) /* 900 */, L64(0x62F479EF6F75EE78) /* 901 */,
+ L64(0x11A55AD41C8916A9) /* 902 */, L64(0xF229D29084FED453) /* 903 */,
+ L64(0x42F1C27B16B000E6) /* 904 */, L64(0x2B1F76749823C074) /* 905 */,
+ L64(0x4B76ECA3C2745360) /* 906 */, L64(0x8C98F463B91691BD) /* 907 */,
+ L64(0x14BCC93CF1ADE66A) /* 908 */, L64(0x8885213E6D458397) /* 909 */,
+ L64(0x8E177DF0274D4711) /* 910 */, L64(0xB49B73B5503F2951) /* 911 */,
+ L64(0x10168168C3F96B6B) /* 912 */, L64(0x0E3D963B63CAB0AE) /* 913 */,
+ L64(0x8DFC4B5655A1DB14) /* 914 */, L64(0xF789F1356E14DE5C) /* 915 */,
+ L64(0x683E68AF4E51DAC1) /* 916 */, L64(0xC9A84F9D8D4B0FD9) /* 917 */,
+ L64(0x3691E03F52A0F9D1) /* 918 */, L64(0x5ED86E46E1878E80) /* 919 */,
+ L64(0x3C711A0E99D07150) /* 920 */, L64(0x5A0865B20C4E9310) /* 921 */,
+ L64(0x56FBFC1FE4F0682E) /* 922 */, L64(0xEA8D5DE3105EDF9B) /* 923 */,
+ L64(0x71ABFDB12379187A) /* 924 */, L64(0x2EB99DE1BEE77B9C) /* 925 */,
+ L64(0x21ECC0EA33CF4523) /* 926 */, L64(0x59A4D7521805C7A1) /* 927 */,
+ L64(0x3896F5EB56AE7C72) /* 928 */, L64(0xAA638F3DB18F75DC) /* 929 */,
+ L64(0x9F39358DABE9808E) /* 930 */, L64(0xB7DEFA91C00B72AC) /* 931 */,
+ L64(0x6B5541FD62492D92) /* 932 */, L64(0x6DC6DEE8F92E4D5B) /* 933 */,
+ L64(0x353F57ABC4BEEA7E) /* 934 */, L64(0x735769D6DA5690CE) /* 935 */,
+ L64(0x0A234AA642391484) /* 936 */, L64(0xF6F9508028F80D9D) /* 937 */,
+ L64(0xB8E319A27AB3F215) /* 938 */, L64(0x31AD9C1151341A4D) /* 939 */,
+ L64(0x773C22A57BEF5805) /* 940 */, L64(0x45C7561A07968633) /* 941 */,
+ L64(0xF913DA9E249DBE36) /* 942 */, L64(0xDA652D9B78A64C68) /* 943 */,
+ L64(0x4C27A97F3BC334EF) /* 944 */, L64(0x76621220E66B17F4) /* 945 */,
+ L64(0x967743899ACD7D0B) /* 946 */, L64(0xF3EE5BCAE0ED6782) /* 947 */,
+ L64(0x409F753600C879FC) /* 948 */, L64(0x06D09A39B5926DB6) /* 949 */,
+ L64(0x6F83AEB0317AC588) /* 950 */, L64(0x01E6CA4A86381F21) /* 951 */,
+ L64(0x66FF3462D19F3025) /* 952 */, L64(0x72207C24DDFD3BFB) /* 953 */,
+ L64(0x4AF6B6D3E2ECE2EB) /* 954 */, L64(0x9C994DBEC7EA08DE) /* 955 */,
+ L64(0x49ACE597B09A8BC4) /* 956 */, L64(0xB38C4766CF0797BA) /* 957 */,
+ L64(0x131B9373C57C2A75) /* 958 */, L64(0xB1822CCE61931E58) /* 959 */,
+ L64(0x9D7555B909BA1C0C) /* 960 */, L64(0x127FAFDD937D11D2) /* 961 */,
+ L64(0x29DA3BADC66D92E4) /* 962 */, L64(0xA2C1D57154C2ECBC) /* 963 */,
+ L64(0x58C5134D82F6FE24) /* 964 */, L64(0x1C3AE3515B62274F) /* 965 */,
+ L64(0xE907C82E01CB8126) /* 966 */, L64(0xF8ED091913E37FCB) /* 967 */,
+ L64(0x3249D8F9C80046C9) /* 968 */, L64(0x80CF9BEDE388FB63) /* 969 */,
+ L64(0x1881539A116CF19E) /* 970 */, L64(0x5103F3F76BD52457) /* 971 */,
+ L64(0x15B7E6F5AE47F7A8) /* 972 */, L64(0xDBD7C6DED47E9CCF) /* 973 */,
+ L64(0x44E55C410228BB1A) /* 974 */, L64(0xB647D4255EDB4E99) /* 975 */,
+ L64(0x5D11882BB8AAFC30) /* 976 */, L64(0xF5098BBB29D3212A) /* 977 */,
+ L64(0x8FB5EA14E90296B3) /* 978 */, L64(0x677B942157DD025A) /* 979 */,
+ L64(0xFB58E7C0A390ACB5) /* 980 */, L64(0x89D3674C83BD4A01) /* 981 */,
+ L64(0x9E2DA4DF4BF3B93B) /* 982 */, L64(0xFCC41E328CAB4829) /* 983 */,
+ L64(0x03F38C96BA582C52) /* 984 */, L64(0xCAD1BDBD7FD85DB2) /* 985 */,
+ L64(0xBBB442C16082AE83) /* 986 */, L64(0xB95FE86BA5DA9AB0) /* 987 */,
+ L64(0xB22E04673771A93F) /* 988 */, L64(0x845358C9493152D8) /* 989 */,
+ L64(0xBE2A488697B4541E) /* 990 */, L64(0x95A2DC2DD38E6966) /* 991 */,
+ L64(0xC02C11AC923C852B) /* 992 */, L64(0x2388B1990DF2A87B) /* 993 */,
+ L64(0x7C8008FA1B4F37BE) /* 994 */, L64(0x1F70D0C84D54E503) /* 995 */,
+ L64(0x5490ADEC7ECE57D4) /* 996 */, L64(0x002B3C27D9063A3A) /* 997 */,
+ L64(0x7EAEA3848030A2BF) /* 998 */, L64(0xC602326DED2003C0) /* 999 */,
+ L64(0x83A7287D69A94086) /* 1000 */, L64(0xC57A5FCB30F57A8A) /* 1001 */,
+ L64(0xB56844E479EBE779) /* 1002 */, L64(0xA373B40F05DCBCE9) /* 1003 */,
+ L64(0xD71A786E88570EE2) /* 1004 */, L64(0x879CBACDBDE8F6A0) /* 1005 */,
+ L64(0x976AD1BCC164A32F) /* 1006 */, L64(0xAB21E25E9666D78B) /* 1007 */,
+ L64(0x901063AAE5E5C33C) /* 1008 */, L64(0x9818B34448698D90) /* 1009 */,
+ L64(0xE36487AE3E1E8ABB) /* 1010 */, L64(0xAFBDF931893BDCB4) /* 1011 */,
+ L64(0x6345A0DC5FBBD519) /* 1012 */, L64(0x8628FE269B9465CA) /* 1013 */,
+ L64(0x1E5D01603F9C51EC) /* 1014 */, L64(0x4DE44006A15049B7) /* 1015 */,
+ L64(0xBF6C70E5F776CBB1) /* 1016 */, L64(0x411218F2EF552BED) /* 1017 */,
+ L64(0xCB0C0708705A36A3) /* 1018 */, L64(0xE74D14754F986044) /* 1019 */,
+ L64(0xCD56D9430EA8280E) /* 1020 */, L64(0xC12591D7535F5065) /* 1021 */,
+ L64(0xC83223F1720AEF96) /* 1022 */, L64(0xC3A0396F7363A51F) /* 1023 */,
+};
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/php_hash_types.h b/ext/hash/php_hash_types.h
new file mode 100644
index 0000000..8793da5
--- /dev/null
+++ b/ext/hash/php_hash_types.h
@@ -0,0 +1,71 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Michael Wallner <mike@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_HASH_TYPES_H
+#define PHP_HASH_TYPES_H
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#else
+#ifndef PHP_WIN32
+#include "php_config.h"
+#endif
+#endif
+
+#ifndef PHP_WIN32
+#if SIZEOF_LONG == 8
+#define L64(x) x
+typedef unsigned long php_hash_uint64;
+#if SIZEOF_INT == 4
+typedef unsigned int php_hash_uint32;
+#elif SIZEOF_SHORT == 4
+typedef unsigned short php_hash_uint32;
+#else
+#error "Need a 32bit integer type"
+#endif
+#elif SIZEOF_LONG_LONG == 8
+#define L64(x) x##LL
+typedef unsigned long long php_hash_uint64;
+#if SIZEOF_INT == 4
+typedef unsigned int php_hash_uint32;
+#elif SIZEOF_LONG == 4
+typedef unsigned long php_hash_uint32;
+#else
+#error "Need a 32bit integer type"
+#endif
+#else
+#error "Need a 64bit integer type"
+#endif
+#else
+#define L64(x) x##i64
+typedef unsigned __int64 php_hash_uint64;
+typedef unsigned __int32 php_hash_uint32;
+#endif
+
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/php_hash_whirlpool.h b/ext/hash/php_hash_whirlpool.h
new file mode 100644
index 0000000..f742547
--- /dev/null
+++ b/ext/hash/php_hash_whirlpool.h
@@ -0,0 +1,48 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Michael Wallner <mike@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_HASH_WHIRLPOOL_H
+#define PHP_HASH_WHIRLPOOL_H
+
+/* WHIRLPOOL context */
+typedef struct {
+ php_hash_uint64 state[8];
+ unsigned char bitlength[32];
+ struct {
+ int pos;
+ int bits;
+ unsigned char data[64];
+ } buffer;
+} PHP_WHIRLPOOL_CTX;
+
+PHP_HASH_API void PHP_WHIRLPOOLInit(PHP_WHIRLPOOL_CTX *);
+PHP_HASH_API void PHP_WHIRLPOOLUpdate(PHP_WHIRLPOOL_CTX *, const unsigned char *, size_t);
+PHP_HASH_API void PHP_WHIRLPOOLFinal(unsigned char[64], PHP_WHIRLPOOL_CTX *);
+
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
diff --git a/ext/hash/php_hash_whirlpool_tables.h b/ext/hash/php_hash_whirlpool_tables.h
new file mode 100644
index 0000000..819a52a
--- /dev/null
+++ b/ext/hash/php_hash_whirlpool_tables.h
@@ -0,0 +1,585 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Michael Wallner <mike@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_HASH_WHIRLPOOL_TABLES_H
+#define PHP_HASH_WHIRLPOOL_TABLES_H
+
+#define R 10
+
+static const php_hash_uint64 rc[R + 1] = {
+ L64(0x0000000000000000),
+ L64(0x1823c6e887b8014f),
+ L64(0x36a6d2f5796f9152),
+ L64(0x60bc9b8ea30c7b35),
+ L64(0x1de0d7c22e4bfe57),
+ L64(0x157737e59ff04ada),
+ L64(0x58c9290ab1a06b85),
+ L64(0xbd5d10f4cb3e0567),
+ L64(0xe427418ba77d95d8),
+ L64(0xfbee7c66dd17479e),
+ L64(0xca2dbf07ad5a8333),
+};
+
+static const php_hash_uint64 C0[256] = {
+ L64(0x18186018c07830d8), L64(0x23238c2305af4626), L64(0xc6c63fc67ef991b8), L64(0xe8e887e8136fcdfb),
+ L64(0x878726874ca113cb), L64(0xb8b8dab8a9626d11), L64(0x0101040108050209), L64(0x4f4f214f426e9e0d),
+ L64(0x3636d836adee6c9b), L64(0xa6a6a2a6590451ff), L64(0xd2d26fd2debdb90c), L64(0xf5f5f3f5fb06f70e),
+ L64(0x7979f979ef80f296), L64(0x6f6fa16f5fcede30), L64(0x91917e91fcef3f6d), L64(0x52525552aa07a4f8),
+ L64(0x60609d6027fdc047), L64(0xbcbccabc89766535), L64(0x9b9b569baccd2b37), L64(0x8e8e028e048c018a),
+ L64(0xa3a3b6a371155bd2), L64(0x0c0c300c603c186c), L64(0x7b7bf17bff8af684), L64(0x3535d435b5e16a80),
+ L64(0x1d1d741de8693af5), L64(0xe0e0a7e05347ddb3), L64(0xd7d77bd7f6acb321), L64(0xc2c22fc25eed999c),
+ L64(0x2e2eb82e6d965c43), L64(0x4b4b314b627a9629), L64(0xfefedffea321e15d), L64(0x575741578216aed5),
+ L64(0x15155415a8412abd), L64(0x7777c1779fb6eee8), L64(0x3737dc37a5eb6e92), L64(0xe5e5b3e57b56d79e),
+ L64(0x9f9f469f8cd92313), L64(0xf0f0e7f0d317fd23), L64(0x4a4a354a6a7f9420), L64(0xdada4fda9e95a944),
+ L64(0x58587d58fa25b0a2), L64(0xc9c903c906ca8fcf), L64(0x2929a429558d527c), L64(0x0a0a280a5022145a),
+ L64(0xb1b1feb1e14f7f50), L64(0xa0a0baa0691a5dc9), L64(0x6b6bb16b7fdad614), L64(0x85852e855cab17d9),
+ L64(0xbdbdcebd8173673c), L64(0x5d5d695dd234ba8f), L64(0x1010401080502090), L64(0xf4f4f7f4f303f507),
+ L64(0xcbcb0bcb16c08bdd), L64(0x3e3ef83eedc67cd3), L64(0x0505140528110a2d), L64(0x676781671fe6ce78),
+ L64(0xe4e4b7e47353d597), L64(0x27279c2725bb4e02), L64(0x4141194132588273), L64(0x8b8b168b2c9d0ba7),
+ L64(0xa7a7a6a7510153f6), L64(0x7d7de97dcf94fab2), L64(0x95956e95dcfb3749), L64(0xd8d847d88e9fad56),
+ L64(0xfbfbcbfb8b30eb70), L64(0xeeee9fee2371c1cd), L64(0x7c7ced7cc791f8bb), L64(0x6666856617e3cc71),
+ L64(0xdddd53dda68ea77b), L64(0x17175c17b84b2eaf), L64(0x4747014702468e45), L64(0x9e9e429e84dc211a),
+ L64(0xcaca0fca1ec589d4), L64(0x2d2db42d75995a58), L64(0xbfbfc6bf9179632e), L64(0x07071c07381b0e3f),
+ L64(0xadad8ead012347ac), L64(0x5a5a755aea2fb4b0), L64(0x838336836cb51bef), L64(0x3333cc3385ff66b6),
+ L64(0x636391633ff2c65c), L64(0x02020802100a0412), L64(0xaaaa92aa39384993), L64(0x7171d971afa8e2de),
+ L64(0xc8c807c80ecf8dc6), L64(0x19196419c87d32d1), L64(0x494939497270923b), L64(0xd9d943d9869aaf5f),
+ L64(0xf2f2eff2c31df931), L64(0xe3e3abe34b48dba8), L64(0x5b5b715be22ab6b9), L64(0x88881a8834920dbc),
+ L64(0x9a9a529aa4c8293e), L64(0x262698262dbe4c0b), L64(0x3232c8328dfa64bf), L64(0xb0b0fab0e94a7d59),
+ L64(0xe9e983e91b6acff2), L64(0x0f0f3c0f78331e77), L64(0xd5d573d5e6a6b733), L64(0x80803a8074ba1df4),
+ L64(0xbebec2be997c6127), L64(0xcdcd13cd26de87eb), L64(0x3434d034bde46889), L64(0x48483d487a759032),
+ L64(0xffffdbffab24e354), L64(0x7a7af57af78ff48d), L64(0x90907a90f4ea3d64), L64(0x5f5f615fc23ebe9d),
+ L64(0x202080201da0403d), L64(0x6868bd6867d5d00f), L64(0x1a1a681ad07234ca), L64(0xaeae82ae192c41b7),
+ L64(0xb4b4eab4c95e757d), L64(0x54544d549a19a8ce), L64(0x93937693ece53b7f), L64(0x222288220daa442f),
+ L64(0x64648d6407e9c863), L64(0xf1f1e3f1db12ff2a), L64(0x7373d173bfa2e6cc), L64(0x12124812905a2482),
+ L64(0x40401d403a5d807a), L64(0x0808200840281048), L64(0xc3c32bc356e89b95), L64(0xecec97ec337bc5df),
+ L64(0xdbdb4bdb9690ab4d), L64(0xa1a1bea1611f5fc0), L64(0x8d8d0e8d1c830791), L64(0x3d3df43df5c97ac8),
+ L64(0x97976697ccf1335b), L64(0x0000000000000000), L64(0xcfcf1bcf36d483f9), L64(0x2b2bac2b4587566e),
+ L64(0x7676c57697b3ece1), L64(0x8282328264b019e6), L64(0xd6d67fd6fea9b128), L64(0x1b1b6c1bd87736c3),
+ L64(0xb5b5eeb5c15b7774), L64(0xafaf86af112943be), L64(0x6a6ab56a77dfd41d), L64(0x50505d50ba0da0ea),
+ L64(0x45450945124c8a57), L64(0xf3f3ebf3cb18fb38), L64(0x3030c0309df060ad), L64(0xefef9bef2b74c3c4),
+ L64(0x3f3ffc3fe5c37eda), L64(0x55554955921caac7), L64(0xa2a2b2a2791059db), L64(0xeaea8fea0365c9e9),
+ L64(0x656589650fecca6a), L64(0xbabad2bab9686903), L64(0x2f2fbc2f65935e4a), L64(0xc0c027c04ee79d8e),
+ L64(0xdede5fdebe81a160), L64(0x1c1c701ce06c38fc), L64(0xfdfdd3fdbb2ee746), L64(0x4d4d294d52649a1f),
+ L64(0x92927292e4e03976), L64(0x7575c9758fbceafa), L64(0x06061806301e0c36), L64(0x8a8a128a249809ae),
+ L64(0xb2b2f2b2f940794b), L64(0xe6e6bfe66359d185), L64(0x0e0e380e70361c7e), L64(0x1f1f7c1ff8633ee7),
+ L64(0x6262956237f7c455), L64(0xd4d477d4eea3b53a), L64(0xa8a89aa829324d81), L64(0x96966296c4f43152),
+ L64(0xf9f9c3f99b3aef62), L64(0xc5c533c566f697a3), L64(0x2525942535b14a10), L64(0x59597959f220b2ab),
+ L64(0x84842a8454ae15d0), L64(0x7272d572b7a7e4c5), L64(0x3939e439d5dd72ec), L64(0x4c4c2d4c5a619816),
+ L64(0x5e5e655eca3bbc94), L64(0x7878fd78e785f09f), L64(0x3838e038ddd870e5), L64(0x8c8c0a8c14860598),
+ L64(0xd1d163d1c6b2bf17), L64(0xa5a5aea5410b57e4), L64(0xe2e2afe2434dd9a1), L64(0x616199612ff8c24e),
+ L64(0xb3b3f6b3f1457b42), L64(0x2121842115a54234), L64(0x9c9c4a9c94d62508), L64(0x1e1e781ef0663cee),
+ L64(0x4343114322528661), L64(0xc7c73bc776fc93b1), L64(0xfcfcd7fcb32be54f), L64(0x0404100420140824),
+ L64(0x51515951b208a2e3), L64(0x99995e99bcc72f25), L64(0x6d6da96d4fc4da22), L64(0x0d0d340d68391a65),
+ L64(0xfafacffa8335e979), L64(0xdfdf5bdfb684a369), L64(0x7e7ee57ed79bfca9), L64(0x242490243db44819),
+ L64(0x3b3bec3bc5d776fe), L64(0xabab96ab313d4b9a), L64(0xcece1fce3ed181f0), L64(0x1111441188552299),
+ L64(0x8f8f068f0c890383), L64(0x4e4e254e4a6b9c04), L64(0xb7b7e6b7d1517366), L64(0xebeb8beb0b60cbe0),
+ L64(0x3c3cf03cfdcc78c1), L64(0x81813e817cbf1ffd), L64(0x94946a94d4fe3540), L64(0xf7f7fbf7eb0cf31c),
+ L64(0xb9b9deb9a1676f18), L64(0x13134c13985f268b), L64(0x2c2cb02c7d9c5851), L64(0xd3d36bd3d6b8bb05),
+ L64(0xe7e7bbe76b5cd38c), L64(0x6e6ea56e57cbdc39), L64(0xc4c437c46ef395aa), L64(0x03030c03180f061b),
+ L64(0x565645568a13acdc), L64(0x44440d441a49885e), L64(0x7f7fe17fdf9efea0), L64(0xa9a99ea921374f88),
+ L64(0x2a2aa82a4d825467), L64(0xbbbbd6bbb16d6b0a), L64(0xc1c123c146e29f87), L64(0x53535153a202a6f1),
+ L64(0xdcdc57dcae8ba572), L64(0x0b0b2c0b58271653), L64(0x9d9d4e9d9cd32701), L64(0x6c6cad6c47c1d82b),
+ L64(0x3131c43195f562a4), L64(0x7474cd7487b9e8f3), L64(0xf6f6fff6e309f115), L64(0x464605460a438c4c),
+ L64(0xacac8aac092645a5), L64(0x89891e893c970fb5), L64(0x14145014a04428b4), L64(0xe1e1a3e15b42dfba),
+ L64(0x16165816b04e2ca6), L64(0x3a3ae83acdd274f7), L64(0x6969b9696fd0d206), L64(0x09092409482d1241),
+ L64(0x7070dd70a7ade0d7), L64(0xb6b6e2b6d954716f), L64(0xd0d067d0ceb7bd1e), L64(0xeded93ed3b7ec7d6),
+ L64(0xcccc17cc2edb85e2), L64(0x424215422a578468), L64(0x98985a98b4c22d2c), L64(0xa4a4aaa4490e55ed),
+ L64(0x2828a0285d885075), L64(0x5c5c6d5cda31b886), L64(0xf8f8c7f8933fed6b), L64(0x8686228644a411c2),
+};
+
+static const php_hash_uint64 C1[256] = {
+ L64(0xd818186018c07830), L64(0x2623238c2305af46), L64(0xb8c6c63fc67ef991), L64(0xfbe8e887e8136fcd),
+ L64(0xcb878726874ca113), L64(0x11b8b8dab8a9626d), L64(0x0901010401080502), L64(0x0d4f4f214f426e9e),
+ L64(0x9b3636d836adee6c), L64(0xffa6a6a2a6590451), L64(0x0cd2d26fd2debdb9), L64(0x0ef5f5f3f5fb06f7),
+ L64(0x967979f979ef80f2), L64(0x306f6fa16f5fcede), L64(0x6d91917e91fcef3f), L64(0xf852525552aa07a4),
+ L64(0x4760609d6027fdc0), L64(0x35bcbccabc897665), L64(0x379b9b569baccd2b), L64(0x8a8e8e028e048c01),
+ L64(0xd2a3a3b6a371155b), L64(0x6c0c0c300c603c18), L64(0x847b7bf17bff8af6), L64(0x803535d435b5e16a),
+ L64(0xf51d1d741de8693a), L64(0xb3e0e0a7e05347dd), L64(0x21d7d77bd7f6acb3), L64(0x9cc2c22fc25eed99),
+ L64(0x432e2eb82e6d965c), L64(0x294b4b314b627a96), L64(0x5dfefedffea321e1), L64(0xd5575741578216ae),
+ L64(0xbd15155415a8412a), L64(0xe87777c1779fb6ee), L64(0x923737dc37a5eb6e), L64(0x9ee5e5b3e57b56d7),
+ L64(0x139f9f469f8cd923), L64(0x23f0f0e7f0d317fd), L64(0x204a4a354a6a7f94), L64(0x44dada4fda9e95a9),
+ L64(0xa258587d58fa25b0), L64(0xcfc9c903c906ca8f), L64(0x7c2929a429558d52), L64(0x5a0a0a280a502214),
+ L64(0x50b1b1feb1e14f7f), L64(0xc9a0a0baa0691a5d), L64(0x146b6bb16b7fdad6), L64(0xd985852e855cab17),
+ L64(0x3cbdbdcebd817367), L64(0x8f5d5d695dd234ba), L64(0x9010104010805020), L64(0x07f4f4f7f4f303f5),
+ L64(0xddcbcb0bcb16c08b), L64(0xd33e3ef83eedc67c), L64(0x2d0505140528110a), L64(0x78676781671fe6ce),
+ L64(0x97e4e4b7e47353d5), L64(0x0227279c2725bb4e), L64(0x7341411941325882), L64(0xa78b8b168b2c9d0b),
+ L64(0xf6a7a7a6a7510153), L64(0xb27d7de97dcf94fa), L64(0x4995956e95dcfb37), L64(0x56d8d847d88e9fad),
+ L64(0x70fbfbcbfb8b30eb), L64(0xcdeeee9fee2371c1), L64(0xbb7c7ced7cc791f8), L64(0x716666856617e3cc),
+ L64(0x7bdddd53dda68ea7), L64(0xaf17175c17b84b2e), L64(0x454747014702468e), L64(0x1a9e9e429e84dc21),
+ L64(0xd4caca0fca1ec589), L64(0x582d2db42d75995a), L64(0x2ebfbfc6bf917963), L64(0x3f07071c07381b0e),
+ L64(0xacadad8ead012347), L64(0xb05a5a755aea2fb4), L64(0xef838336836cb51b), L64(0xb63333cc3385ff66),
+ L64(0x5c636391633ff2c6), L64(0x1202020802100a04), L64(0x93aaaa92aa393849), L64(0xde7171d971afa8e2),
+ L64(0xc6c8c807c80ecf8d), L64(0xd119196419c87d32), L64(0x3b49493949727092), L64(0x5fd9d943d9869aaf),
+ L64(0x31f2f2eff2c31df9), L64(0xa8e3e3abe34b48db), L64(0xb95b5b715be22ab6), L64(0xbc88881a8834920d),
+ L64(0x3e9a9a529aa4c829), L64(0x0b262698262dbe4c), L64(0xbf3232c8328dfa64), L64(0x59b0b0fab0e94a7d),
+ L64(0xf2e9e983e91b6acf), L64(0x770f0f3c0f78331e), L64(0x33d5d573d5e6a6b7), L64(0xf480803a8074ba1d),
+ L64(0x27bebec2be997c61), L64(0xebcdcd13cd26de87), L64(0x893434d034bde468), L64(0x3248483d487a7590),
+ L64(0x54ffffdbffab24e3), L64(0x8d7a7af57af78ff4), L64(0x6490907a90f4ea3d), L64(0x9d5f5f615fc23ebe),
+ L64(0x3d202080201da040), L64(0x0f6868bd6867d5d0), L64(0xca1a1a681ad07234), L64(0xb7aeae82ae192c41),
+ L64(0x7db4b4eab4c95e75), L64(0xce54544d549a19a8), L64(0x7f93937693ece53b), L64(0x2f222288220daa44),
+ L64(0x6364648d6407e9c8), L64(0x2af1f1e3f1db12ff), L64(0xcc7373d173bfa2e6), L64(0x8212124812905a24),
+ L64(0x7a40401d403a5d80), L64(0x4808082008402810), L64(0x95c3c32bc356e89b), L64(0xdfecec97ec337bc5),
+ L64(0x4ddbdb4bdb9690ab), L64(0xc0a1a1bea1611f5f), L64(0x918d8d0e8d1c8307), L64(0xc83d3df43df5c97a),
+ L64(0x5b97976697ccf133), L64(0x0000000000000000), L64(0xf9cfcf1bcf36d483), L64(0x6e2b2bac2b458756),
+ L64(0xe17676c57697b3ec), L64(0xe68282328264b019), L64(0x28d6d67fd6fea9b1), L64(0xc31b1b6c1bd87736),
+ L64(0x74b5b5eeb5c15b77), L64(0xbeafaf86af112943), L64(0x1d6a6ab56a77dfd4), L64(0xea50505d50ba0da0),
+ L64(0x5745450945124c8a), L64(0x38f3f3ebf3cb18fb), L64(0xad3030c0309df060), L64(0xc4efef9bef2b74c3),
+ L64(0xda3f3ffc3fe5c37e), L64(0xc755554955921caa), L64(0xdba2a2b2a2791059), L64(0xe9eaea8fea0365c9),
+ L64(0x6a656589650fecca), L64(0x03babad2bab96869), L64(0x4a2f2fbc2f65935e), L64(0x8ec0c027c04ee79d),
+ L64(0x60dede5fdebe81a1), L64(0xfc1c1c701ce06c38), L64(0x46fdfdd3fdbb2ee7), L64(0x1f4d4d294d52649a),
+ L64(0x7692927292e4e039), L64(0xfa7575c9758fbcea), L64(0x3606061806301e0c), L64(0xae8a8a128a249809),
+ L64(0x4bb2b2f2b2f94079), L64(0x85e6e6bfe66359d1), L64(0x7e0e0e380e70361c), L64(0xe71f1f7c1ff8633e),
+ L64(0x556262956237f7c4), L64(0x3ad4d477d4eea3b5), L64(0x81a8a89aa829324d), L64(0x5296966296c4f431),
+ L64(0x62f9f9c3f99b3aef), L64(0xa3c5c533c566f697), L64(0x102525942535b14a), L64(0xab59597959f220b2),
+ L64(0xd084842a8454ae15), L64(0xc57272d572b7a7e4), L64(0xec3939e439d5dd72), L64(0x164c4c2d4c5a6198),
+ L64(0x945e5e655eca3bbc), L64(0x9f7878fd78e785f0), L64(0xe53838e038ddd870), L64(0x988c8c0a8c148605),
+ L64(0x17d1d163d1c6b2bf), L64(0xe4a5a5aea5410b57), L64(0xa1e2e2afe2434dd9), L64(0x4e616199612ff8c2),
+ L64(0x42b3b3f6b3f1457b), L64(0x342121842115a542), L64(0x089c9c4a9c94d625), L64(0xee1e1e781ef0663c),
+ L64(0x6143431143225286), L64(0xb1c7c73bc776fc93), L64(0x4ffcfcd7fcb32be5), L64(0x2404041004201408),
+ L64(0xe351515951b208a2), L64(0x2599995e99bcc72f), L64(0x226d6da96d4fc4da), L64(0x650d0d340d68391a),
+ L64(0x79fafacffa8335e9), L64(0x69dfdf5bdfb684a3), L64(0xa97e7ee57ed79bfc), L64(0x19242490243db448),
+ L64(0xfe3b3bec3bc5d776), L64(0x9aabab96ab313d4b), L64(0xf0cece1fce3ed181), L64(0x9911114411885522),
+ L64(0x838f8f068f0c8903), L64(0x044e4e254e4a6b9c), L64(0x66b7b7e6b7d15173), L64(0xe0ebeb8beb0b60cb),
+ L64(0xc13c3cf03cfdcc78), L64(0xfd81813e817cbf1f), L64(0x4094946a94d4fe35), L64(0x1cf7f7fbf7eb0cf3),
+ L64(0x18b9b9deb9a1676f), L64(0x8b13134c13985f26), L64(0x512c2cb02c7d9c58), L64(0x05d3d36bd3d6b8bb),
+ L64(0x8ce7e7bbe76b5cd3), L64(0x396e6ea56e57cbdc), L64(0xaac4c437c46ef395), L64(0x1b03030c03180f06),
+ L64(0xdc565645568a13ac), L64(0x5e44440d441a4988), L64(0xa07f7fe17fdf9efe), L64(0x88a9a99ea921374f),
+ L64(0x672a2aa82a4d8254), L64(0x0abbbbd6bbb16d6b), L64(0x87c1c123c146e29f), L64(0xf153535153a202a6),
+ L64(0x72dcdc57dcae8ba5), L64(0x530b0b2c0b582716), L64(0x019d9d4e9d9cd327), L64(0x2b6c6cad6c47c1d8),
+ L64(0xa43131c43195f562), L64(0xf37474cd7487b9e8), L64(0x15f6f6fff6e309f1), L64(0x4c464605460a438c),
+ L64(0xa5acac8aac092645), L64(0xb589891e893c970f), L64(0xb414145014a04428), L64(0xbae1e1a3e15b42df),
+ L64(0xa616165816b04e2c), L64(0xf73a3ae83acdd274), L64(0x066969b9696fd0d2), L64(0x4109092409482d12),
+ L64(0xd77070dd70a7ade0), L64(0x6fb6b6e2b6d95471), L64(0x1ed0d067d0ceb7bd), L64(0xd6eded93ed3b7ec7),
+ L64(0xe2cccc17cc2edb85), L64(0x68424215422a5784), L64(0x2c98985a98b4c22d), L64(0xeda4a4aaa4490e55),
+ L64(0x752828a0285d8850), L64(0x865c5c6d5cda31b8), L64(0x6bf8f8c7f8933fed), L64(0xc28686228644a411),
+};
+
+static const php_hash_uint64 C2[256] = {
+ L64(0x30d818186018c078), L64(0x462623238c2305af), L64(0x91b8c6c63fc67ef9), L64(0xcdfbe8e887e8136f),
+ L64(0x13cb878726874ca1), L64(0x6d11b8b8dab8a962), L64(0x0209010104010805), L64(0x9e0d4f4f214f426e),
+ L64(0x6c9b3636d836adee), L64(0x51ffa6a6a2a65904), L64(0xb90cd2d26fd2debd), L64(0xf70ef5f5f3f5fb06),
+ L64(0xf2967979f979ef80), L64(0xde306f6fa16f5fce), L64(0x3f6d91917e91fcef), L64(0xa4f852525552aa07),
+ L64(0xc04760609d6027fd), L64(0x6535bcbccabc8976), L64(0x2b379b9b569baccd), L64(0x018a8e8e028e048c),
+ L64(0x5bd2a3a3b6a37115), L64(0x186c0c0c300c603c), L64(0xf6847b7bf17bff8a), L64(0x6a803535d435b5e1),
+ L64(0x3af51d1d741de869), L64(0xddb3e0e0a7e05347), L64(0xb321d7d77bd7f6ac), L64(0x999cc2c22fc25eed),
+ L64(0x5c432e2eb82e6d96), L64(0x96294b4b314b627a), L64(0xe15dfefedffea321), L64(0xaed5575741578216),
+ L64(0x2abd15155415a841), L64(0xeee87777c1779fb6), L64(0x6e923737dc37a5eb), L64(0xd79ee5e5b3e57b56),
+ L64(0x23139f9f469f8cd9), L64(0xfd23f0f0e7f0d317), L64(0x94204a4a354a6a7f), L64(0xa944dada4fda9e95),
+ L64(0xb0a258587d58fa25), L64(0x8fcfc9c903c906ca), L64(0x527c2929a429558d), L64(0x145a0a0a280a5022),
+ L64(0x7f50b1b1feb1e14f), L64(0x5dc9a0a0baa0691a), L64(0xd6146b6bb16b7fda), L64(0x17d985852e855cab),
+ L64(0x673cbdbdcebd8173), L64(0xba8f5d5d695dd234), L64(0x2090101040108050), L64(0xf507f4f4f7f4f303),
+ L64(0x8bddcbcb0bcb16c0), L64(0x7cd33e3ef83eedc6), L64(0x0a2d050514052811), L64(0xce78676781671fe6),
+ L64(0xd597e4e4b7e47353), L64(0x4e0227279c2725bb), L64(0x8273414119413258), L64(0x0ba78b8b168b2c9d),
+ L64(0x53f6a7a7a6a75101), L64(0xfab27d7de97dcf94), L64(0x374995956e95dcfb), L64(0xad56d8d847d88e9f),
+ L64(0xeb70fbfbcbfb8b30), L64(0xc1cdeeee9fee2371), L64(0xf8bb7c7ced7cc791), L64(0xcc716666856617e3),
+ L64(0xa77bdddd53dda68e), L64(0x2eaf17175c17b84b), L64(0x8e45474701470246), L64(0x211a9e9e429e84dc),
+ L64(0x89d4caca0fca1ec5), L64(0x5a582d2db42d7599), L64(0x632ebfbfc6bf9179), L64(0x0e3f07071c07381b),
+ L64(0x47acadad8ead0123), L64(0xb4b05a5a755aea2f), L64(0x1bef838336836cb5), L64(0x66b63333cc3385ff),
+ L64(0xc65c636391633ff2), L64(0x041202020802100a), L64(0x4993aaaa92aa3938), L64(0xe2de7171d971afa8),
+ L64(0x8dc6c8c807c80ecf), L64(0x32d119196419c87d), L64(0x923b494939497270), L64(0xaf5fd9d943d9869a),
+ L64(0xf931f2f2eff2c31d), L64(0xdba8e3e3abe34b48), L64(0xb6b95b5b715be22a), L64(0x0dbc88881a883492),
+ L64(0x293e9a9a529aa4c8), L64(0x4c0b262698262dbe), L64(0x64bf3232c8328dfa), L64(0x7d59b0b0fab0e94a),
+ L64(0xcff2e9e983e91b6a), L64(0x1e770f0f3c0f7833), L64(0xb733d5d573d5e6a6), L64(0x1df480803a8074ba),
+ L64(0x6127bebec2be997c), L64(0x87ebcdcd13cd26de), L64(0x68893434d034bde4), L64(0x903248483d487a75),
+ L64(0xe354ffffdbffab24), L64(0xf48d7a7af57af78f), L64(0x3d6490907a90f4ea), L64(0xbe9d5f5f615fc23e),
+ L64(0x403d202080201da0), L64(0xd00f6868bd6867d5), L64(0x34ca1a1a681ad072), L64(0x41b7aeae82ae192c),
+ L64(0x757db4b4eab4c95e), L64(0xa8ce54544d549a19), L64(0x3b7f93937693ece5), L64(0x442f222288220daa),
+ L64(0xc86364648d6407e9), L64(0xff2af1f1e3f1db12), L64(0xe6cc7373d173bfa2), L64(0x248212124812905a),
+ L64(0x807a40401d403a5d), L64(0x1048080820084028), L64(0x9b95c3c32bc356e8), L64(0xc5dfecec97ec337b),
+ L64(0xab4ddbdb4bdb9690), L64(0x5fc0a1a1bea1611f), L64(0x07918d8d0e8d1c83), L64(0x7ac83d3df43df5c9),
+ L64(0x335b97976697ccf1), L64(0x0000000000000000), L64(0x83f9cfcf1bcf36d4), L64(0x566e2b2bac2b4587),
+ L64(0xece17676c57697b3), L64(0x19e68282328264b0), L64(0xb128d6d67fd6fea9), L64(0x36c31b1b6c1bd877),
+ L64(0x7774b5b5eeb5c15b), L64(0x43beafaf86af1129), L64(0xd41d6a6ab56a77df), L64(0xa0ea50505d50ba0d),
+ L64(0x8a5745450945124c), L64(0xfb38f3f3ebf3cb18), L64(0x60ad3030c0309df0), L64(0xc3c4efef9bef2b74),
+ L64(0x7eda3f3ffc3fe5c3), L64(0xaac755554955921c), L64(0x59dba2a2b2a27910), L64(0xc9e9eaea8fea0365),
+ L64(0xca6a656589650fec), L64(0x6903babad2bab968), L64(0x5e4a2f2fbc2f6593), L64(0x9d8ec0c027c04ee7),
+ L64(0xa160dede5fdebe81), L64(0x38fc1c1c701ce06c), L64(0xe746fdfdd3fdbb2e), L64(0x9a1f4d4d294d5264),
+ L64(0x397692927292e4e0), L64(0xeafa7575c9758fbc), L64(0x0c3606061806301e), L64(0x09ae8a8a128a2498),
+ L64(0x794bb2b2f2b2f940), L64(0xd185e6e6bfe66359), L64(0x1c7e0e0e380e7036), L64(0x3ee71f1f7c1ff863),
+ L64(0xc4556262956237f7), L64(0xb53ad4d477d4eea3), L64(0x4d81a8a89aa82932), L64(0x315296966296c4f4),
+ L64(0xef62f9f9c3f99b3a), L64(0x97a3c5c533c566f6), L64(0x4a102525942535b1), L64(0xb2ab59597959f220),
+ L64(0x15d084842a8454ae), L64(0xe4c57272d572b7a7), L64(0x72ec3939e439d5dd), L64(0x98164c4c2d4c5a61),
+ L64(0xbc945e5e655eca3b), L64(0xf09f7878fd78e785), L64(0x70e53838e038ddd8), L64(0x05988c8c0a8c1486),
+ L64(0xbf17d1d163d1c6b2), L64(0x57e4a5a5aea5410b), L64(0xd9a1e2e2afe2434d), L64(0xc24e616199612ff8),
+ L64(0x7b42b3b3f6b3f145), L64(0x42342121842115a5), L64(0x25089c9c4a9c94d6), L64(0x3cee1e1e781ef066),
+ L64(0x8661434311432252), L64(0x93b1c7c73bc776fc), L64(0xe54ffcfcd7fcb32b), L64(0x0824040410042014),
+ L64(0xa2e351515951b208), L64(0x2f2599995e99bcc7), L64(0xda226d6da96d4fc4), L64(0x1a650d0d340d6839),
+ L64(0xe979fafacffa8335), L64(0xa369dfdf5bdfb684), L64(0xfca97e7ee57ed79b), L64(0x4819242490243db4),
+ L64(0x76fe3b3bec3bc5d7), L64(0x4b9aabab96ab313d), L64(0x81f0cece1fce3ed1), L64(0x2299111144118855),
+ L64(0x03838f8f068f0c89), L64(0x9c044e4e254e4a6b), L64(0x7366b7b7e6b7d151), L64(0xcbe0ebeb8beb0b60),
+ L64(0x78c13c3cf03cfdcc), L64(0x1ffd81813e817cbf), L64(0x354094946a94d4fe), L64(0xf31cf7f7fbf7eb0c),
+ L64(0x6f18b9b9deb9a167), L64(0x268b13134c13985f), L64(0x58512c2cb02c7d9c), L64(0xbb05d3d36bd3d6b8),
+ L64(0xd38ce7e7bbe76b5c), L64(0xdc396e6ea56e57cb), L64(0x95aac4c437c46ef3), L64(0x061b03030c03180f),
+ L64(0xacdc565645568a13), L64(0x885e44440d441a49), L64(0xfea07f7fe17fdf9e), L64(0x4f88a9a99ea92137),
+ L64(0x54672a2aa82a4d82), L64(0x6b0abbbbd6bbb16d), L64(0x9f87c1c123c146e2), L64(0xa6f153535153a202),
+ L64(0xa572dcdc57dcae8b), L64(0x16530b0b2c0b5827), L64(0x27019d9d4e9d9cd3), L64(0xd82b6c6cad6c47c1),
+ L64(0x62a43131c43195f5), L64(0xe8f37474cd7487b9), L64(0xf115f6f6fff6e309), L64(0x8c4c464605460a43),
+ L64(0x45a5acac8aac0926), L64(0x0fb589891e893c97), L64(0x28b414145014a044), L64(0xdfbae1e1a3e15b42),
+ L64(0x2ca616165816b04e), L64(0x74f73a3ae83acdd2), L64(0xd2066969b9696fd0), L64(0x124109092409482d),
+ L64(0xe0d77070dd70a7ad), L64(0x716fb6b6e2b6d954), L64(0xbd1ed0d067d0ceb7), L64(0xc7d6eded93ed3b7e),
+ L64(0x85e2cccc17cc2edb), L64(0x8468424215422a57), L64(0x2d2c98985a98b4c2), L64(0x55eda4a4aaa4490e),
+ L64(0x50752828a0285d88), L64(0xb8865c5c6d5cda31), L64(0xed6bf8f8c7f8933f), L64(0x11c28686228644a4),
+};
+
+static const php_hash_uint64 C3[256] = {
+ L64(0x7830d818186018c0), L64(0xaf462623238c2305), L64(0xf991b8c6c63fc67e), L64(0x6fcdfbe8e887e813),
+ L64(0xa113cb878726874c), L64(0x626d11b8b8dab8a9), L64(0x0502090101040108), L64(0x6e9e0d4f4f214f42),
+ L64(0xee6c9b3636d836ad), L64(0x0451ffa6a6a2a659), L64(0xbdb90cd2d26fd2de), L64(0x06f70ef5f5f3f5fb),
+ L64(0x80f2967979f979ef), L64(0xcede306f6fa16f5f), L64(0xef3f6d91917e91fc), L64(0x07a4f852525552aa),
+ L64(0xfdc04760609d6027), L64(0x766535bcbccabc89), L64(0xcd2b379b9b569bac), L64(0x8c018a8e8e028e04),
+ L64(0x155bd2a3a3b6a371), L64(0x3c186c0c0c300c60), L64(0x8af6847b7bf17bff), L64(0xe16a803535d435b5),
+ L64(0x693af51d1d741de8), L64(0x47ddb3e0e0a7e053), L64(0xacb321d7d77bd7f6), L64(0xed999cc2c22fc25e),
+ L64(0x965c432e2eb82e6d), L64(0x7a96294b4b314b62), L64(0x21e15dfefedffea3), L64(0x16aed55757415782),
+ L64(0x412abd15155415a8), L64(0xb6eee87777c1779f), L64(0xeb6e923737dc37a5), L64(0x56d79ee5e5b3e57b),
+ L64(0xd923139f9f469f8c), L64(0x17fd23f0f0e7f0d3), L64(0x7f94204a4a354a6a), L64(0x95a944dada4fda9e),
+ L64(0x25b0a258587d58fa), L64(0xca8fcfc9c903c906), L64(0x8d527c2929a42955), L64(0x22145a0a0a280a50),
+ L64(0x4f7f50b1b1feb1e1), L64(0x1a5dc9a0a0baa069), L64(0xdad6146b6bb16b7f), L64(0xab17d985852e855c),
+ L64(0x73673cbdbdcebd81), L64(0x34ba8f5d5d695dd2), L64(0x5020901010401080), L64(0x03f507f4f4f7f4f3),
+ L64(0xc08bddcbcb0bcb16), L64(0xc67cd33e3ef83eed), L64(0x110a2d0505140528), L64(0xe6ce78676781671f),
+ L64(0x53d597e4e4b7e473), L64(0xbb4e0227279c2725), L64(0x5882734141194132), L64(0x9d0ba78b8b168b2c),
+ L64(0x0153f6a7a7a6a751), L64(0x94fab27d7de97dcf), L64(0xfb374995956e95dc), L64(0x9fad56d8d847d88e),
+ L64(0x30eb70fbfbcbfb8b), L64(0x71c1cdeeee9fee23), L64(0x91f8bb7c7ced7cc7), L64(0xe3cc716666856617),
+ L64(0x8ea77bdddd53dda6), L64(0x4b2eaf17175c17b8), L64(0x468e454747014702), L64(0xdc211a9e9e429e84),
+ L64(0xc589d4caca0fca1e), L64(0x995a582d2db42d75), L64(0x79632ebfbfc6bf91), L64(0x1b0e3f07071c0738),
+ L64(0x2347acadad8ead01), L64(0x2fb4b05a5a755aea), L64(0xb51bef838336836c), L64(0xff66b63333cc3385),
+ L64(0xf2c65c636391633f), L64(0x0a04120202080210), L64(0x384993aaaa92aa39), L64(0xa8e2de7171d971af),
+ L64(0xcf8dc6c8c807c80e), L64(0x7d32d119196419c8), L64(0x70923b4949394972), L64(0x9aaf5fd9d943d986),
+ L64(0x1df931f2f2eff2c3), L64(0x48dba8e3e3abe34b), L64(0x2ab6b95b5b715be2), L64(0x920dbc88881a8834),
+ L64(0xc8293e9a9a529aa4), L64(0xbe4c0b262698262d), L64(0xfa64bf3232c8328d), L64(0x4a7d59b0b0fab0e9),
+ L64(0x6acff2e9e983e91b), L64(0x331e770f0f3c0f78), L64(0xa6b733d5d573d5e6), L64(0xba1df480803a8074),
+ L64(0x7c6127bebec2be99), L64(0xde87ebcdcd13cd26), L64(0xe468893434d034bd), L64(0x75903248483d487a),
+ L64(0x24e354ffffdbffab), L64(0x8ff48d7a7af57af7), L64(0xea3d6490907a90f4), L64(0x3ebe9d5f5f615fc2),
+ L64(0xa0403d202080201d), L64(0xd5d00f6868bd6867), L64(0x7234ca1a1a681ad0), L64(0x2c41b7aeae82ae19),
+ L64(0x5e757db4b4eab4c9), L64(0x19a8ce54544d549a), L64(0xe53b7f93937693ec), L64(0xaa442f222288220d),
+ L64(0xe9c86364648d6407), L64(0x12ff2af1f1e3f1db), L64(0xa2e6cc7373d173bf), L64(0x5a24821212481290),
+ L64(0x5d807a40401d403a), L64(0x2810480808200840), L64(0xe89b95c3c32bc356), L64(0x7bc5dfecec97ec33),
+ L64(0x90ab4ddbdb4bdb96), L64(0x1f5fc0a1a1bea161), L64(0x8307918d8d0e8d1c), L64(0xc97ac83d3df43df5),
+ L64(0xf1335b97976697cc), L64(0x0000000000000000), L64(0xd483f9cfcf1bcf36), L64(0x87566e2b2bac2b45),
+ L64(0xb3ece17676c57697), L64(0xb019e68282328264), L64(0xa9b128d6d67fd6fe), L64(0x7736c31b1b6c1bd8),
+ L64(0x5b7774b5b5eeb5c1), L64(0x2943beafaf86af11), L64(0xdfd41d6a6ab56a77), L64(0x0da0ea50505d50ba),
+ L64(0x4c8a574545094512), L64(0x18fb38f3f3ebf3cb), L64(0xf060ad3030c0309d), L64(0x74c3c4efef9bef2b),
+ L64(0xc37eda3f3ffc3fe5), L64(0x1caac75555495592), L64(0x1059dba2a2b2a279), L64(0x65c9e9eaea8fea03),
+ L64(0xecca6a656589650f), L64(0x686903babad2bab9), L64(0x935e4a2f2fbc2f65), L64(0xe79d8ec0c027c04e),
+ L64(0x81a160dede5fdebe), L64(0x6c38fc1c1c701ce0), L64(0x2ee746fdfdd3fdbb), L64(0x649a1f4d4d294d52),
+ L64(0xe0397692927292e4), L64(0xbceafa7575c9758f), L64(0x1e0c360606180630), L64(0x9809ae8a8a128a24),
+ L64(0x40794bb2b2f2b2f9), L64(0x59d185e6e6bfe663), L64(0x361c7e0e0e380e70), L64(0x633ee71f1f7c1ff8),
+ L64(0xf7c4556262956237), L64(0xa3b53ad4d477d4ee), L64(0x324d81a8a89aa829), L64(0xf4315296966296c4),
+ L64(0x3aef62f9f9c3f99b), L64(0xf697a3c5c533c566), L64(0xb14a102525942535), L64(0x20b2ab59597959f2),
+ L64(0xae15d084842a8454), L64(0xa7e4c57272d572b7), L64(0xdd72ec3939e439d5), L64(0x6198164c4c2d4c5a),
+ L64(0x3bbc945e5e655eca), L64(0x85f09f7878fd78e7), L64(0xd870e53838e038dd), L64(0x8605988c8c0a8c14),
+ L64(0xb2bf17d1d163d1c6), L64(0x0b57e4a5a5aea541), L64(0x4dd9a1e2e2afe243), L64(0xf8c24e616199612f),
+ L64(0x457b42b3b3f6b3f1), L64(0xa542342121842115), L64(0xd625089c9c4a9c94), L64(0x663cee1e1e781ef0),
+ L64(0x5286614343114322), L64(0xfc93b1c7c73bc776), L64(0x2be54ffcfcd7fcb3), L64(0x1408240404100420),
+ L64(0x08a2e351515951b2), L64(0xc72f2599995e99bc), L64(0xc4da226d6da96d4f), L64(0x391a650d0d340d68),
+ L64(0x35e979fafacffa83), L64(0x84a369dfdf5bdfb6), L64(0x9bfca97e7ee57ed7), L64(0xb44819242490243d),
+ L64(0xd776fe3b3bec3bc5), L64(0x3d4b9aabab96ab31), L64(0xd181f0cece1fce3e), L64(0x5522991111441188),
+ L64(0x8903838f8f068f0c), L64(0x6b9c044e4e254e4a), L64(0x517366b7b7e6b7d1), L64(0x60cbe0ebeb8beb0b),
+ L64(0xcc78c13c3cf03cfd), L64(0xbf1ffd81813e817c), L64(0xfe354094946a94d4), L64(0x0cf31cf7f7fbf7eb),
+ L64(0x676f18b9b9deb9a1), L64(0x5f268b13134c1398), L64(0x9c58512c2cb02c7d), L64(0xb8bb05d3d36bd3d6),
+ L64(0x5cd38ce7e7bbe76b), L64(0xcbdc396e6ea56e57), L64(0xf395aac4c437c46e), L64(0x0f061b03030c0318),
+ L64(0x13acdc565645568a), L64(0x49885e44440d441a), L64(0x9efea07f7fe17fdf), L64(0x374f88a9a99ea921),
+ L64(0x8254672a2aa82a4d), L64(0x6d6b0abbbbd6bbb1), L64(0xe29f87c1c123c146), L64(0x02a6f153535153a2),
+ L64(0x8ba572dcdc57dcae), L64(0x2716530b0b2c0b58), L64(0xd327019d9d4e9d9c), L64(0xc1d82b6c6cad6c47),
+ L64(0xf562a43131c43195), L64(0xb9e8f37474cd7487), L64(0x09f115f6f6fff6e3), L64(0x438c4c464605460a),
+ L64(0x2645a5acac8aac09), L64(0x970fb589891e893c), L64(0x4428b414145014a0), L64(0x42dfbae1e1a3e15b),
+ L64(0x4e2ca616165816b0), L64(0xd274f73a3ae83acd), L64(0xd0d2066969b9696f), L64(0x2d12410909240948),
+ L64(0xade0d77070dd70a7), L64(0x54716fb6b6e2b6d9), L64(0xb7bd1ed0d067d0ce), L64(0x7ec7d6eded93ed3b),
+ L64(0xdb85e2cccc17cc2e), L64(0x578468424215422a), L64(0xc22d2c98985a98b4), L64(0x0e55eda4a4aaa449),
+ L64(0x8850752828a0285d), L64(0x31b8865c5c6d5cda), L64(0x3fed6bf8f8c7f893), L64(0xa411c28686228644),
+};
+
+static const php_hash_uint64 C4[256] = {
+ L64(0xc07830d818186018), L64(0x05af462623238c23), L64(0x7ef991b8c6c63fc6), L64(0x136fcdfbe8e887e8),
+ L64(0x4ca113cb87872687), L64(0xa9626d11b8b8dab8), L64(0x0805020901010401), L64(0x426e9e0d4f4f214f),
+ L64(0xadee6c9b3636d836), L64(0x590451ffa6a6a2a6), L64(0xdebdb90cd2d26fd2), L64(0xfb06f70ef5f5f3f5),
+ L64(0xef80f2967979f979), L64(0x5fcede306f6fa16f), L64(0xfcef3f6d91917e91), L64(0xaa07a4f852525552),
+ L64(0x27fdc04760609d60), L64(0x89766535bcbccabc), L64(0xaccd2b379b9b569b), L64(0x048c018a8e8e028e),
+ L64(0x71155bd2a3a3b6a3), L64(0x603c186c0c0c300c), L64(0xff8af6847b7bf17b), L64(0xb5e16a803535d435),
+ L64(0xe8693af51d1d741d), L64(0x5347ddb3e0e0a7e0), L64(0xf6acb321d7d77bd7), L64(0x5eed999cc2c22fc2),
+ L64(0x6d965c432e2eb82e), L64(0x627a96294b4b314b), L64(0xa321e15dfefedffe), L64(0x8216aed557574157),
+ L64(0xa8412abd15155415), L64(0x9fb6eee87777c177), L64(0xa5eb6e923737dc37), L64(0x7b56d79ee5e5b3e5),
+ L64(0x8cd923139f9f469f), L64(0xd317fd23f0f0e7f0), L64(0x6a7f94204a4a354a), L64(0x9e95a944dada4fda),
+ L64(0xfa25b0a258587d58), L64(0x06ca8fcfc9c903c9), L64(0x558d527c2929a429), L64(0x5022145a0a0a280a),
+ L64(0xe14f7f50b1b1feb1), L64(0x691a5dc9a0a0baa0), L64(0x7fdad6146b6bb16b), L64(0x5cab17d985852e85),
+ L64(0x8173673cbdbdcebd), L64(0xd234ba8f5d5d695d), L64(0x8050209010104010), L64(0xf303f507f4f4f7f4),
+ L64(0x16c08bddcbcb0bcb), L64(0xedc67cd33e3ef83e), L64(0x28110a2d05051405), L64(0x1fe6ce7867678167),
+ L64(0x7353d597e4e4b7e4), L64(0x25bb4e0227279c27), L64(0x3258827341411941), L64(0x2c9d0ba78b8b168b),
+ L64(0x510153f6a7a7a6a7), L64(0xcf94fab27d7de97d), L64(0xdcfb374995956e95), L64(0x8e9fad56d8d847d8),
+ L64(0x8b30eb70fbfbcbfb), L64(0x2371c1cdeeee9fee), L64(0xc791f8bb7c7ced7c), L64(0x17e3cc7166668566),
+ L64(0xa68ea77bdddd53dd), L64(0xb84b2eaf17175c17), L64(0x02468e4547470147), L64(0x84dc211a9e9e429e),
+ L64(0x1ec589d4caca0fca), L64(0x75995a582d2db42d), L64(0x9179632ebfbfc6bf), L64(0x381b0e3f07071c07),
+ L64(0x012347acadad8ead), L64(0xea2fb4b05a5a755a), L64(0x6cb51bef83833683), L64(0x85ff66b63333cc33),
+ L64(0x3ff2c65c63639163), L64(0x100a041202020802), L64(0x39384993aaaa92aa), L64(0xafa8e2de7171d971),
+ L64(0x0ecf8dc6c8c807c8), L64(0xc87d32d119196419), L64(0x7270923b49493949), L64(0x869aaf5fd9d943d9),
+ L64(0xc31df931f2f2eff2), L64(0x4b48dba8e3e3abe3), L64(0xe22ab6b95b5b715b), L64(0x34920dbc88881a88),
+ L64(0xa4c8293e9a9a529a), L64(0x2dbe4c0b26269826), L64(0x8dfa64bf3232c832), L64(0xe94a7d59b0b0fab0),
+ L64(0x1b6acff2e9e983e9), L64(0x78331e770f0f3c0f), L64(0xe6a6b733d5d573d5), L64(0x74ba1df480803a80),
+ L64(0x997c6127bebec2be), L64(0x26de87ebcdcd13cd), L64(0xbde468893434d034), L64(0x7a75903248483d48),
+ L64(0xab24e354ffffdbff), L64(0xf78ff48d7a7af57a), L64(0xf4ea3d6490907a90), L64(0xc23ebe9d5f5f615f),
+ L64(0x1da0403d20208020), L64(0x67d5d00f6868bd68), L64(0xd07234ca1a1a681a), L64(0x192c41b7aeae82ae),
+ L64(0xc95e757db4b4eab4), L64(0x9a19a8ce54544d54), L64(0xece53b7f93937693), L64(0x0daa442f22228822),
+ L64(0x07e9c86364648d64), L64(0xdb12ff2af1f1e3f1), L64(0xbfa2e6cc7373d173), L64(0x905a248212124812),
+ L64(0x3a5d807a40401d40), L64(0x4028104808082008), L64(0x56e89b95c3c32bc3), L64(0x337bc5dfecec97ec),
+ L64(0x9690ab4ddbdb4bdb), L64(0x611f5fc0a1a1bea1), L64(0x1c8307918d8d0e8d), L64(0xf5c97ac83d3df43d),
+ L64(0xccf1335b97976697), L64(0x0000000000000000), L64(0x36d483f9cfcf1bcf), L64(0x4587566e2b2bac2b),
+ L64(0x97b3ece17676c576), L64(0x64b019e682823282), L64(0xfea9b128d6d67fd6), L64(0xd87736c31b1b6c1b),
+ L64(0xc15b7774b5b5eeb5), L64(0x112943beafaf86af), L64(0x77dfd41d6a6ab56a), L64(0xba0da0ea50505d50),
+ L64(0x124c8a5745450945), L64(0xcb18fb38f3f3ebf3), L64(0x9df060ad3030c030), L64(0x2b74c3c4efef9bef),
+ L64(0xe5c37eda3f3ffc3f), L64(0x921caac755554955), L64(0x791059dba2a2b2a2), L64(0x0365c9e9eaea8fea),
+ L64(0x0fecca6a65658965), L64(0xb9686903babad2ba), L64(0x65935e4a2f2fbc2f), L64(0x4ee79d8ec0c027c0),
+ L64(0xbe81a160dede5fde), L64(0xe06c38fc1c1c701c), L64(0xbb2ee746fdfdd3fd), L64(0x52649a1f4d4d294d),
+ L64(0xe4e0397692927292), L64(0x8fbceafa7575c975), L64(0x301e0c3606061806), L64(0x249809ae8a8a128a),
+ L64(0xf940794bb2b2f2b2), L64(0x6359d185e6e6bfe6), L64(0x70361c7e0e0e380e), L64(0xf8633ee71f1f7c1f),
+ L64(0x37f7c45562629562), L64(0xeea3b53ad4d477d4), L64(0x29324d81a8a89aa8), L64(0xc4f4315296966296),
+ L64(0x9b3aef62f9f9c3f9), L64(0x66f697a3c5c533c5), L64(0x35b14a1025259425), L64(0xf220b2ab59597959),
+ L64(0x54ae15d084842a84), L64(0xb7a7e4c57272d572), L64(0xd5dd72ec3939e439), L64(0x5a6198164c4c2d4c),
+ L64(0xca3bbc945e5e655e), L64(0xe785f09f7878fd78), L64(0xddd870e53838e038), L64(0x148605988c8c0a8c),
+ L64(0xc6b2bf17d1d163d1), L64(0x410b57e4a5a5aea5), L64(0x434dd9a1e2e2afe2), L64(0x2ff8c24e61619961),
+ L64(0xf1457b42b3b3f6b3), L64(0x15a5423421218421), L64(0x94d625089c9c4a9c), L64(0xf0663cee1e1e781e),
+ L64(0x2252866143431143), L64(0x76fc93b1c7c73bc7), L64(0xb32be54ffcfcd7fc), L64(0x2014082404041004),
+ L64(0xb208a2e351515951), L64(0xbcc72f2599995e99), L64(0x4fc4da226d6da96d), L64(0x68391a650d0d340d),
+ L64(0x8335e979fafacffa), L64(0xb684a369dfdf5bdf), L64(0xd79bfca97e7ee57e), L64(0x3db4481924249024),
+ L64(0xc5d776fe3b3bec3b), L64(0x313d4b9aabab96ab), L64(0x3ed181f0cece1fce), L64(0x8855229911114411),
+ L64(0x0c8903838f8f068f), L64(0x4a6b9c044e4e254e), L64(0xd1517366b7b7e6b7), L64(0x0b60cbe0ebeb8beb),
+ L64(0xfdcc78c13c3cf03c), L64(0x7cbf1ffd81813e81), L64(0xd4fe354094946a94), L64(0xeb0cf31cf7f7fbf7),
+ L64(0xa1676f18b9b9deb9), L64(0x985f268b13134c13), L64(0x7d9c58512c2cb02c), L64(0xd6b8bb05d3d36bd3),
+ L64(0x6b5cd38ce7e7bbe7), L64(0x57cbdc396e6ea56e), L64(0x6ef395aac4c437c4), L64(0x180f061b03030c03),
+ L64(0x8a13acdc56564556), L64(0x1a49885e44440d44), L64(0xdf9efea07f7fe17f), L64(0x21374f88a9a99ea9),
+ L64(0x4d8254672a2aa82a), L64(0xb16d6b0abbbbd6bb), L64(0x46e29f87c1c123c1), L64(0xa202a6f153535153),
+ L64(0xae8ba572dcdc57dc), L64(0x582716530b0b2c0b), L64(0x9cd327019d9d4e9d), L64(0x47c1d82b6c6cad6c),
+ L64(0x95f562a43131c431), L64(0x87b9e8f37474cd74), L64(0xe309f115f6f6fff6), L64(0x0a438c4c46460546),
+ L64(0x092645a5acac8aac), L64(0x3c970fb589891e89), L64(0xa04428b414145014), L64(0x5b42dfbae1e1a3e1),
+ L64(0xb04e2ca616165816), L64(0xcdd274f73a3ae83a), L64(0x6fd0d2066969b969), L64(0x482d124109092409),
+ L64(0xa7ade0d77070dd70), L64(0xd954716fb6b6e2b6), L64(0xceb7bd1ed0d067d0), L64(0x3b7ec7d6eded93ed),
+ L64(0x2edb85e2cccc17cc), L64(0x2a57846842421542), L64(0xb4c22d2c98985a98), L64(0x490e55eda4a4aaa4),
+ L64(0x5d8850752828a028), L64(0xda31b8865c5c6d5c), L64(0x933fed6bf8f8c7f8), L64(0x44a411c286862286),
+};
+
+static const php_hash_uint64 C5[256] = {
+ L64(0x18c07830d8181860), L64(0x2305af462623238c), L64(0xc67ef991b8c6c63f), L64(0xe8136fcdfbe8e887),
+ L64(0x874ca113cb878726), L64(0xb8a9626d11b8b8da), L64(0x0108050209010104), L64(0x4f426e9e0d4f4f21),
+ L64(0x36adee6c9b3636d8), L64(0xa6590451ffa6a6a2), L64(0xd2debdb90cd2d26f), L64(0xf5fb06f70ef5f5f3),
+ L64(0x79ef80f2967979f9), L64(0x6f5fcede306f6fa1), L64(0x91fcef3f6d91917e), L64(0x52aa07a4f8525255),
+ L64(0x6027fdc04760609d), L64(0xbc89766535bcbcca), L64(0x9baccd2b379b9b56), L64(0x8e048c018a8e8e02),
+ L64(0xa371155bd2a3a3b6), L64(0x0c603c186c0c0c30), L64(0x7bff8af6847b7bf1), L64(0x35b5e16a803535d4),
+ L64(0x1de8693af51d1d74), L64(0xe05347ddb3e0e0a7), L64(0xd7f6acb321d7d77b), L64(0xc25eed999cc2c22f),
+ L64(0x2e6d965c432e2eb8), L64(0x4b627a96294b4b31), L64(0xfea321e15dfefedf), L64(0x578216aed5575741),
+ L64(0x15a8412abd151554), L64(0x779fb6eee87777c1), L64(0x37a5eb6e923737dc), L64(0xe57b56d79ee5e5b3),
+ L64(0x9f8cd923139f9f46), L64(0xf0d317fd23f0f0e7), L64(0x4a6a7f94204a4a35), L64(0xda9e95a944dada4f),
+ L64(0x58fa25b0a258587d), L64(0xc906ca8fcfc9c903), L64(0x29558d527c2929a4), L64(0x0a5022145a0a0a28),
+ L64(0xb1e14f7f50b1b1fe), L64(0xa0691a5dc9a0a0ba), L64(0x6b7fdad6146b6bb1), L64(0x855cab17d985852e),
+ L64(0xbd8173673cbdbdce), L64(0x5dd234ba8f5d5d69), L64(0x1080502090101040), L64(0xf4f303f507f4f4f7),
+ L64(0xcb16c08bddcbcb0b), L64(0x3eedc67cd33e3ef8), L64(0x0528110a2d050514), L64(0x671fe6ce78676781),
+ L64(0xe47353d597e4e4b7), L64(0x2725bb4e0227279c), L64(0x4132588273414119), L64(0x8b2c9d0ba78b8b16),
+ L64(0xa7510153f6a7a7a6), L64(0x7dcf94fab27d7de9), L64(0x95dcfb374995956e), L64(0xd88e9fad56d8d847),
+ L64(0xfb8b30eb70fbfbcb), L64(0xee2371c1cdeeee9f), L64(0x7cc791f8bb7c7ced), L64(0x6617e3cc71666685),
+ L64(0xdda68ea77bdddd53), L64(0x17b84b2eaf17175c), L64(0x4702468e45474701), L64(0x9e84dc211a9e9e42),
+ L64(0xca1ec589d4caca0f), L64(0x2d75995a582d2db4), L64(0xbf9179632ebfbfc6), L64(0x07381b0e3f07071c),
+ L64(0xad012347acadad8e), L64(0x5aea2fb4b05a5a75), L64(0x836cb51bef838336), L64(0x3385ff66b63333cc),
+ L64(0x633ff2c65c636391), L64(0x02100a0412020208), L64(0xaa39384993aaaa92), L64(0x71afa8e2de7171d9),
+ L64(0xc80ecf8dc6c8c807), L64(0x19c87d32d1191964), L64(0x497270923b494939), L64(0xd9869aaf5fd9d943),
+ L64(0xf2c31df931f2f2ef), L64(0xe34b48dba8e3e3ab), L64(0x5be22ab6b95b5b71), L64(0x8834920dbc88881a),
+ L64(0x9aa4c8293e9a9a52), L64(0x262dbe4c0b262698), L64(0x328dfa64bf3232c8), L64(0xb0e94a7d59b0b0fa),
+ L64(0xe91b6acff2e9e983), L64(0x0f78331e770f0f3c), L64(0xd5e6a6b733d5d573), L64(0x8074ba1df480803a),
+ L64(0xbe997c6127bebec2), L64(0xcd26de87ebcdcd13), L64(0x34bde468893434d0), L64(0x487a75903248483d),
+ L64(0xffab24e354ffffdb), L64(0x7af78ff48d7a7af5), L64(0x90f4ea3d6490907a), L64(0x5fc23ebe9d5f5f61),
+ L64(0x201da0403d202080), L64(0x6867d5d00f6868bd), L64(0x1ad07234ca1a1a68), L64(0xae192c41b7aeae82),
+ L64(0xb4c95e757db4b4ea), L64(0x549a19a8ce54544d), L64(0x93ece53b7f939376), L64(0x220daa442f222288),
+ L64(0x6407e9c86364648d), L64(0xf1db12ff2af1f1e3), L64(0x73bfa2e6cc7373d1), L64(0x12905a2482121248),
+ L64(0x403a5d807a40401d), L64(0x0840281048080820), L64(0xc356e89b95c3c32b), L64(0xec337bc5dfecec97),
+ L64(0xdb9690ab4ddbdb4b), L64(0xa1611f5fc0a1a1be), L64(0x8d1c8307918d8d0e), L64(0x3df5c97ac83d3df4),
+ L64(0x97ccf1335b979766), L64(0x0000000000000000), L64(0xcf36d483f9cfcf1b), L64(0x2b4587566e2b2bac),
+ L64(0x7697b3ece17676c5), L64(0x8264b019e6828232), L64(0xd6fea9b128d6d67f), L64(0x1bd87736c31b1b6c),
+ L64(0xb5c15b7774b5b5ee), L64(0xaf112943beafaf86), L64(0x6a77dfd41d6a6ab5), L64(0x50ba0da0ea50505d),
+ L64(0x45124c8a57454509), L64(0xf3cb18fb38f3f3eb), L64(0x309df060ad3030c0), L64(0xef2b74c3c4efef9b),
+ L64(0x3fe5c37eda3f3ffc), L64(0x55921caac7555549), L64(0xa2791059dba2a2b2), L64(0xea0365c9e9eaea8f),
+ L64(0x650fecca6a656589), L64(0xbab9686903babad2), L64(0x2f65935e4a2f2fbc), L64(0xc04ee79d8ec0c027),
+ L64(0xdebe81a160dede5f), L64(0x1ce06c38fc1c1c70), L64(0xfdbb2ee746fdfdd3), L64(0x4d52649a1f4d4d29),
+ L64(0x92e4e03976929272), L64(0x758fbceafa7575c9), L64(0x06301e0c36060618), L64(0x8a249809ae8a8a12),
+ L64(0xb2f940794bb2b2f2), L64(0xe66359d185e6e6bf), L64(0x0e70361c7e0e0e38), L64(0x1ff8633ee71f1f7c),
+ L64(0x6237f7c455626295), L64(0xd4eea3b53ad4d477), L64(0xa829324d81a8a89a), L64(0x96c4f43152969662),
+ L64(0xf99b3aef62f9f9c3), L64(0xc566f697a3c5c533), L64(0x2535b14a10252594), L64(0x59f220b2ab595979),
+ L64(0x8454ae15d084842a), L64(0x72b7a7e4c57272d5), L64(0x39d5dd72ec3939e4), L64(0x4c5a6198164c4c2d),
+ L64(0x5eca3bbc945e5e65), L64(0x78e785f09f7878fd), L64(0x38ddd870e53838e0), L64(0x8c148605988c8c0a),
+ L64(0xd1c6b2bf17d1d163), L64(0xa5410b57e4a5a5ae), L64(0xe2434dd9a1e2e2af), L64(0x612ff8c24e616199),
+ L64(0xb3f1457b42b3b3f6), L64(0x2115a54234212184), L64(0x9c94d625089c9c4a), L64(0x1ef0663cee1e1e78),
+ L64(0x4322528661434311), L64(0xc776fc93b1c7c73b), L64(0xfcb32be54ffcfcd7), L64(0x0420140824040410),
+ L64(0x51b208a2e3515159), L64(0x99bcc72f2599995e), L64(0x6d4fc4da226d6da9), L64(0x0d68391a650d0d34),
+ L64(0xfa8335e979fafacf), L64(0xdfb684a369dfdf5b), L64(0x7ed79bfca97e7ee5), L64(0x243db44819242490),
+ L64(0x3bc5d776fe3b3bec), L64(0xab313d4b9aabab96), L64(0xce3ed181f0cece1f), L64(0x1188552299111144),
+ L64(0x8f0c8903838f8f06), L64(0x4e4a6b9c044e4e25), L64(0xb7d1517366b7b7e6), L64(0xeb0b60cbe0ebeb8b),
+ L64(0x3cfdcc78c13c3cf0), L64(0x817cbf1ffd81813e), L64(0x94d4fe354094946a), L64(0xf7eb0cf31cf7f7fb),
+ L64(0xb9a1676f18b9b9de), L64(0x13985f268b13134c), L64(0x2c7d9c58512c2cb0), L64(0xd3d6b8bb05d3d36b),
+ L64(0xe76b5cd38ce7e7bb), L64(0x6e57cbdc396e6ea5), L64(0xc46ef395aac4c437), L64(0x03180f061b03030c),
+ L64(0x568a13acdc565645), L64(0x441a49885e44440d), L64(0x7fdf9efea07f7fe1), L64(0xa921374f88a9a99e),
+ L64(0x2a4d8254672a2aa8), L64(0xbbb16d6b0abbbbd6), L64(0xc146e29f87c1c123), L64(0x53a202a6f1535351),
+ L64(0xdcae8ba572dcdc57), L64(0x0b582716530b0b2c), L64(0x9d9cd327019d9d4e), L64(0x6c47c1d82b6c6cad),
+ L64(0x3195f562a43131c4), L64(0x7487b9e8f37474cd), L64(0xf6e309f115f6f6ff), L64(0x460a438c4c464605),
+ L64(0xac092645a5acac8a), L64(0x893c970fb589891e), L64(0x14a04428b4141450), L64(0xe15b42dfbae1e1a3),
+ L64(0x16b04e2ca6161658), L64(0x3acdd274f73a3ae8), L64(0x696fd0d2066969b9), L64(0x09482d1241090924),
+ L64(0x70a7ade0d77070dd), L64(0xb6d954716fb6b6e2), L64(0xd0ceb7bd1ed0d067), L64(0xed3b7ec7d6eded93),
+ L64(0xcc2edb85e2cccc17), L64(0x422a578468424215), L64(0x98b4c22d2c98985a), L64(0xa4490e55eda4a4aa),
+ L64(0x285d8850752828a0), L64(0x5cda31b8865c5c6d), L64(0xf8933fed6bf8f8c7), L64(0x8644a411c2868622),
+};
+
+static const php_hash_uint64 C6[256] = {
+ L64(0x6018c07830d81818), L64(0x8c2305af46262323), L64(0x3fc67ef991b8c6c6), L64(0x87e8136fcdfbe8e8),
+ L64(0x26874ca113cb8787), L64(0xdab8a9626d11b8b8), L64(0x0401080502090101), L64(0x214f426e9e0d4f4f),
+ L64(0xd836adee6c9b3636), L64(0xa2a6590451ffa6a6), L64(0x6fd2debdb90cd2d2), L64(0xf3f5fb06f70ef5f5),
+ L64(0xf979ef80f2967979), L64(0xa16f5fcede306f6f), L64(0x7e91fcef3f6d9191), L64(0x5552aa07a4f85252),
+ L64(0x9d6027fdc0476060), L64(0xcabc89766535bcbc), L64(0x569baccd2b379b9b), L64(0x028e048c018a8e8e),
+ L64(0xb6a371155bd2a3a3), L64(0x300c603c186c0c0c), L64(0xf17bff8af6847b7b), L64(0xd435b5e16a803535),
+ L64(0x741de8693af51d1d), L64(0xa7e05347ddb3e0e0), L64(0x7bd7f6acb321d7d7), L64(0x2fc25eed999cc2c2),
+ L64(0xb82e6d965c432e2e), L64(0x314b627a96294b4b), L64(0xdffea321e15dfefe), L64(0x41578216aed55757),
+ L64(0x5415a8412abd1515), L64(0xc1779fb6eee87777), L64(0xdc37a5eb6e923737), L64(0xb3e57b56d79ee5e5),
+ L64(0x469f8cd923139f9f), L64(0xe7f0d317fd23f0f0), L64(0x354a6a7f94204a4a), L64(0x4fda9e95a944dada),
+ L64(0x7d58fa25b0a25858), L64(0x03c906ca8fcfc9c9), L64(0xa429558d527c2929), L64(0x280a5022145a0a0a),
+ L64(0xfeb1e14f7f50b1b1), L64(0xbaa0691a5dc9a0a0), L64(0xb16b7fdad6146b6b), L64(0x2e855cab17d98585),
+ L64(0xcebd8173673cbdbd), L64(0x695dd234ba8f5d5d), L64(0x4010805020901010), L64(0xf7f4f303f507f4f4),
+ L64(0x0bcb16c08bddcbcb), L64(0xf83eedc67cd33e3e), L64(0x140528110a2d0505), L64(0x81671fe6ce786767),
+ L64(0xb7e47353d597e4e4), L64(0x9c2725bb4e022727), L64(0x1941325882734141), L64(0x168b2c9d0ba78b8b),
+ L64(0xa6a7510153f6a7a7), L64(0xe97dcf94fab27d7d), L64(0x6e95dcfb37499595), L64(0x47d88e9fad56d8d8),
+ L64(0xcbfb8b30eb70fbfb), L64(0x9fee2371c1cdeeee), L64(0xed7cc791f8bb7c7c), L64(0x856617e3cc716666),
+ L64(0x53dda68ea77bdddd), L64(0x5c17b84b2eaf1717), L64(0x014702468e454747), L64(0x429e84dc211a9e9e),
+ L64(0x0fca1ec589d4caca), L64(0xb42d75995a582d2d), L64(0xc6bf9179632ebfbf), L64(0x1c07381b0e3f0707),
+ L64(0x8ead012347acadad), L64(0x755aea2fb4b05a5a), L64(0x36836cb51bef8383), L64(0xcc3385ff66b63333),
+ L64(0x91633ff2c65c6363), L64(0x0802100a04120202), L64(0x92aa39384993aaaa), L64(0xd971afa8e2de7171),
+ L64(0x07c80ecf8dc6c8c8), L64(0x6419c87d32d11919), L64(0x39497270923b4949), L64(0x43d9869aaf5fd9d9),
+ L64(0xeff2c31df931f2f2), L64(0xabe34b48dba8e3e3), L64(0x715be22ab6b95b5b), L64(0x1a8834920dbc8888),
+ L64(0x529aa4c8293e9a9a), L64(0x98262dbe4c0b2626), L64(0xc8328dfa64bf3232), L64(0xfab0e94a7d59b0b0),
+ L64(0x83e91b6acff2e9e9), L64(0x3c0f78331e770f0f), L64(0x73d5e6a6b733d5d5), L64(0x3a8074ba1df48080),
+ L64(0xc2be997c6127bebe), L64(0x13cd26de87ebcdcd), L64(0xd034bde468893434), L64(0x3d487a7590324848),
+ L64(0xdbffab24e354ffff), L64(0xf57af78ff48d7a7a), L64(0x7a90f4ea3d649090), L64(0x615fc23ebe9d5f5f),
+ L64(0x80201da0403d2020), L64(0xbd6867d5d00f6868), L64(0x681ad07234ca1a1a), L64(0x82ae192c41b7aeae),
+ L64(0xeab4c95e757db4b4), L64(0x4d549a19a8ce5454), L64(0x7693ece53b7f9393), L64(0x88220daa442f2222),
+ L64(0x8d6407e9c8636464), L64(0xe3f1db12ff2af1f1), L64(0xd173bfa2e6cc7373), L64(0x4812905a24821212),
+ L64(0x1d403a5d807a4040), L64(0x2008402810480808), L64(0x2bc356e89b95c3c3), L64(0x97ec337bc5dfecec),
+ L64(0x4bdb9690ab4ddbdb), L64(0xbea1611f5fc0a1a1), L64(0x0e8d1c8307918d8d), L64(0xf43df5c97ac83d3d),
+ L64(0x6697ccf1335b9797), L64(0x0000000000000000), L64(0x1bcf36d483f9cfcf), L64(0xac2b4587566e2b2b),
+ L64(0xc57697b3ece17676), L64(0x328264b019e68282), L64(0x7fd6fea9b128d6d6), L64(0x6c1bd87736c31b1b),
+ L64(0xeeb5c15b7774b5b5), L64(0x86af112943beafaf), L64(0xb56a77dfd41d6a6a), L64(0x5d50ba0da0ea5050),
+ L64(0x0945124c8a574545), L64(0xebf3cb18fb38f3f3), L64(0xc0309df060ad3030), L64(0x9bef2b74c3c4efef),
+ L64(0xfc3fe5c37eda3f3f), L64(0x4955921caac75555), L64(0xb2a2791059dba2a2), L64(0x8fea0365c9e9eaea),
+ L64(0x89650fecca6a6565), L64(0xd2bab9686903baba), L64(0xbc2f65935e4a2f2f), L64(0x27c04ee79d8ec0c0),
+ L64(0x5fdebe81a160dede), L64(0x701ce06c38fc1c1c), L64(0xd3fdbb2ee746fdfd), L64(0x294d52649a1f4d4d),
+ L64(0x7292e4e039769292), L64(0xc9758fbceafa7575), L64(0x1806301e0c360606), L64(0x128a249809ae8a8a),
+ L64(0xf2b2f940794bb2b2), L64(0xbfe66359d185e6e6), L64(0x380e70361c7e0e0e), L64(0x7c1ff8633ee71f1f),
+ L64(0x956237f7c4556262), L64(0x77d4eea3b53ad4d4), L64(0x9aa829324d81a8a8), L64(0x6296c4f431529696),
+ L64(0xc3f99b3aef62f9f9), L64(0x33c566f697a3c5c5), L64(0x942535b14a102525), L64(0x7959f220b2ab5959),
+ L64(0x2a8454ae15d08484), L64(0xd572b7a7e4c57272), L64(0xe439d5dd72ec3939), L64(0x2d4c5a6198164c4c),
+ L64(0x655eca3bbc945e5e), L64(0xfd78e785f09f7878), L64(0xe038ddd870e53838), L64(0x0a8c148605988c8c),
+ L64(0x63d1c6b2bf17d1d1), L64(0xaea5410b57e4a5a5), L64(0xafe2434dd9a1e2e2), L64(0x99612ff8c24e6161),
+ L64(0xf6b3f1457b42b3b3), L64(0x842115a542342121), L64(0x4a9c94d625089c9c), L64(0x781ef0663cee1e1e),
+ L64(0x1143225286614343), L64(0x3bc776fc93b1c7c7), L64(0xd7fcb32be54ffcfc), L64(0x1004201408240404),
+ L64(0x5951b208a2e35151), L64(0x5e99bcc72f259999), L64(0xa96d4fc4da226d6d), L64(0x340d68391a650d0d),
+ L64(0xcffa8335e979fafa), L64(0x5bdfb684a369dfdf), L64(0xe57ed79bfca97e7e), L64(0x90243db448192424),
+ L64(0xec3bc5d776fe3b3b), L64(0x96ab313d4b9aabab), L64(0x1fce3ed181f0cece), L64(0x4411885522991111),
+ L64(0x068f0c8903838f8f), L64(0x254e4a6b9c044e4e), L64(0xe6b7d1517366b7b7), L64(0x8beb0b60cbe0ebeb),
+ L64(0xf03cfdcc78c13c3c), L64(0x3e817cbf1ffd8181), L64(0x6a94d4fe35409494), L64(0xfbf7eb0cf31cf7f7),
+ L64(0xdeb9a1676f18b9b9), L64(0x4c13985f268b1313), L64(0xb02c7d9c58512c2c), L64(0x6bd3d6b8bb05d3d3),
+ L64(0xbbe76b5cd38ce7e7), L64(0xa56e57cbdc396e6e), L64(0x37c46ef395aac4c4), L64(0x0c03180f061b0303),
+ L64(0x45568a13acdc5656), L64(0x0d441a49885e4444), L64(0xe17fdf9efea07f7f), L64(0x9ea921374f88a9a9),
+ L64(0xa82a4d8254672a2a), L64(0xd6bbb16d6b0abbbb), L64(0x23c146e29f87c1c1), L64(0x5153a202a6f15353),
+ L64(0x57dcae8ba572dcdc), L64(0x2c0b582716530b0b), L64(0x4e9d9cd327019d9d), L64(0xad6c47c1d82b6c6c),
+ L64(0xc43195f562a43131), L64(0xcd7487b9e8f37474), L64(0xfff6e309f115f6f6), L64(0x05460a438c4c4646),
+ L64(0x8aac092645a5acac), L64(0x1e893c970fb58989), L64(0x5014a04428b41414), L64(0xa3e15b42dfbae1e1),
+ L64(0x5816b04e2ca61616), L64(0xe83acdd274f73a3a), L64(0xb9696fd0d2066969), L64(0x2409482d12410909),
+ L64(0xdd70a7ade0d77070), L64(0xe2b6d954716fb6b6), L64(0x67d0ceb7bd1ed0d0), L64(0x93ed3b7ec7d6eded),
+ L64(0x17cc2edb85e2cccc), L64(0x15422a5784684242), L64(0x5a98b4c22d2c9898), L64(0xaaa4490e55eda4a4),
+ L64(0xa0285d8850752828), L64(0x6d5cda31b8865c5c), L64(0xc7f8933fed6bf8f8), L64(0x228644a411c28686),
+};
+
+static const php_hash_uint64 C7[256] = {
+ L64(0x186018c07830d818), L64(0x238c2305af462623), L64(0xc63fc67ef991b8c6), L64(0xe887e8136fcdfbe8),
+ L64(0x8726874ca113cb87), L64(0xb8dab8a9626d11b8), L64(0x0104010805020901), L64(0x4f214f426e9e0d4f),
+ L64(0x36d836adee6c9b36), L64(0xa6a2a6590451ffa6), L64(0xd26fd2debdb90cd2), L64(0xf5f3f5fb06f70ef5),
+ L64(0x79f979ef80f29679), L64(0x6fa16f5fcede306f), L64(0x917e91fcef3f6d91), L64(0x525552aa07a4f852),
+ L64(0x609d6027fdc04760), L64(0xbccabc89766535bc), L64(0x9b569baccd2b379b), L64(0x8e028e048c018a8e),
+ L64(0xa3b6a371155bd2a3), L64(0x0c300c603c186c0c), L64(0x7bf17bff8af6847b), L64(0x35d435b5e16a8035),
+ L64(0x1d741de8693af51d), L64(0xe0a7e05347ddb3e0), L64(0xd77bd7f6acb321d7), L64(0xc22fc25eed999cc2),
+ L64(0x2eb82e6d965c432e), L64(0x4b314b627a96294b), L64(0xfedffea321e15dfe), L64(0x5741578216aed557),
+ L64(0x155415a8412abd15), L64(0x77c1779fb6eee877), L64(0x37dc37a5eb6e9237), L64(0xe5b3e57b56d79ee5),
+ L64(0x9f469f8cd923139f), L64(0xf0e7f0d317fd23f0), L64(0x4a354a6a7f94204a), L64(0xda4fda9e95a944da),
+ L64(0x587d58fa25b0a258), L64(0xc903c906ca8fcfc9), L64(0x29a429558d527c29), L64(0x0a280a5022145a0a),
+ L64(0xb1feb1e14f7f50b1), L64(0xa0baa0691a5dc9a0), L64(0x6bb16b7fdad6146b), L64(0x852e855cab17d985),
+ L64(0xbdcebd8173673cbd), L64(0x5d695dd234ba8f5d), L64(0x1040108050209010), L64(0xf4f7f4f303f507f4),
+ L64(0xcb0bcb16c08bddcb), L64(0x3ef83eedc67cd33e), L64(0x05140528110a2d05), L64(0x6781671fe6ce7867),
+ L64(0xe4b7e47353d597e4), L64(0x279c2725bb4e0227), L64(0x4119413258827341), L64(0x8b168b2c9d0ba78b),
+ L64(0xa7a6a7510153f6a7), L64(0x7de97dcf94fab27d), L64(0x956e95dcfb374995), L64(0xd847d88e9fad56d8),
+ L64(0xfbcbfb8b30eb70fb), L64(0xee9fee2371c1cdee), L64(0x7ced7cc791f8bb7c), L64(0x66856617e3cc7166),
+ L64(0xdd53dda68ea77bdd), L64(0x175c17b84b2eaf17), L64(0x47014702468e4547), L64(0x9e429e84dc211a9e),
+ L64(0xca0fca1ec589d4ca), L64(0x2db42d75995a582d), L64(0xbfc6bf9179632ebf), L64(0x071c07381b0e3f07),
+ L64(0xad8ead012347acad), L64(0x5a755aea2fb4b05a), L64(0x8336836cb51bef83), L64(0x33cc3385ff66b633),
+ L64(0x6391633ff2c65c63), L64(0x020802100a041202), L64(0xaa92aa39384993aa), L64(0x71d971afa8e2de71),
+ L64(0xc807c80ecf8dc6c8), L64(0x196419c87d32d119), L64(0x4939497270923b49), L64(0xd943d9869aaf5fd9),
+ L64(0xf2eff2c31df931f2), L64(0xe3abe34b48dba8e3), L64(0x5b715be22ab6b95b), L64(0x881a8834920dbc88),
+ L64(0x9a529aa4c8293e9a), L64(0x2698262dbe4c0b26), L64(0x32c8328dfa64bf32), L64(0xb0fab0e94a7d59b0),
+ L64(0xe983e91b6acff2e9), L64(0x0f3c0f78331e770f), L64(0xd573d5e6a6b733d5), L64(0x803a8074ba1df480),
+ L64(0xbec2be997c6127be), L64(0xcd13cd26de87ebcd), L64(0x34d034bde4688934), L64(0x483d487a75903248),
+ L64(0xffdbffab24e354ff), L64(0x7af57af78ff48d7a), L64(0x907a90f4ea3d6490), L64(0x5f615fc23ebe9d5f),
+ L64(0x2080201da0403d20), L64(0x68bd6867d5d00f68), L64(0x1a681ad07234ca1a), L64(0xae82ae192c41b7ae),
+ L64(0xb4eab4c95e757db4), L64(0x544d549a19a8ce54), L64(0x937693ece53b7f93), L64(0x2288220daa442f22),
+ L64(0x648d6407e9c86364), L64(0xf1e3f1db12ff2af1), L64(0x73d173bfa2e6cc73), L64(0x124812905a248212),
+ L64(0x401d403a5d807a40), L64(0x0820084028104808), L64(0xc32bc356e89b95c3), L64(0xec97ec337bc5dfec),
+ L64(0xdb4bdb9690ab4ddb), L64(0xa1bea1611f5fc0a1), L64(0x8d0e8d1c8307918d), L64(0x3df43df5c97ac83d),
+ L64(0x976697ccf1335b97), L64(0x0000000000000000), L64(0xcf1bcf36d483f9cf), L64(0x2bac2b4587566e2b),
+ L64(0x76c57697b3ece176), L64(0x82328264b019e682), L64(0xd67fd6fea9b128d6), L64(0x1b6c1bd87736c31b),
+ L64(0xb5eeb5c15b7774b5), L64(0xaf86af112943beaf), L64(0x6ab56a77dfd41d6a), L64(0x505d50ba0da0ea50),
+ L64(0x450945124c8a5745), L64(0xf3ebf3cb18fb38f3), L64(0x30c0309df060ad30), L64(0xef9bef2b74c3c4ef),
+ L64(0x3ffc3fe5c37eda3f), L64(0x554955921caac755), L64(0xa2b2a2791059dba2), L64(0xea8fea0365c9e9ea),
+ L64(0x6589650fecca6a65), L64(0xbad2bab9686903ba), L64(0x2fbc2f65935e4a2f), L64(0xc027c04ee79d8ec0),
+ L64(0xde5fdebe81a160de), L64(0x1c701ce06c38fc1c), L64(0xfdd3fdbb2ee746fd), L64(0x4d294d52649a1f4d),
+ L64(0x927292e4e0397692), L64(0x75c9758fbceafa75), L64(0x061806301e0c3606), L64(0x8a128a249809ae8a),
+ L64(0xb2f2b2f940794bb2), L64(0xe6bfe66359d185e6), L64(0x0e380e70361c7e0e), L64(0x1f7c1ff8633ee71f),
+ L64(0x62956237f7c45562), L64(0xd477d4eea3b53ad4), L64(0xa89aa829324d81a8), L64(0x966296c4f4315296),
+ L64(0xf9c3f99b3aef62f9), L64(0xc533c566f697a3c5), L64(0x25942535b14a1025), L64(0x597959f220b2ab59),
+ L64(0x842a8454ae15d084), L64(0x72d572b7a7e4c572), L64(0x39e439d5dd72ec39), L64(0x4c2d4c5a6198164c),
+ L64(0x5e655eca3bbc945e), L64(0x78fd78e785f09f78), L64(0x38e038ddd870e538), L64(0x8c0a8c148605988c),
+ L64(0xd163d1c6b2bf17d1), L64(0xa5aea5410b57e4a5), L64(0xe2afe2434dd9a1e2), L64(0x6199612ff8c24e61),
+ L64(0xb3f6b3f1457b42b3), L64(0x21842115a5423421), L64(0x9c4a9c94d625089c), L64(0x1e781ef0663cee1e),
+ L64(0x4311432252866143), L64(0xc73bc776fc93b1c7), L64(0xfcd7fcb32be54ffc), L64(0x0410042014082404),
+ L64(0x515951b208a2e351), L64(0x995e99bcc72f2599), L64(0x6da96d4fc4da226d), L64(0x0d340d68391a650d),
+ L64(0xfacffa8335e979fa), L64(0xdf5bdfb684a369df), L64(0x7ee57ed79bfca97e), L64(0x2490243db4481924),
+ L64(0x3bec3bc5d776fe3b), L64(0xab96ab313d4b9aab), L64(0xce1fce3ed181f0ce), L64(0x1144118855229911),
+ L64(0x8f068f0c8903838f), L64(0x4e254e4a6b9c044e), L64(0xb7e6b7d1517366b7), L64(0xeb8beb0b60cbe0eb),
+ L64(0x3cf03cfdcc78c13c), L64(0x813e817cbf1ffd81), L64(0x946a94d4fe354094), L64(0xf7fbf7eb0cf31cf7),
+ L64(0xb9deb9a1676f18b9), L64(0x134c13985f268b13), L64(0x2cb02c7d9c58512c), L64(0xd36bd3d6b8bb05d3),
+ L64(0xe7bbe76b5cd38ce7), L64(0x6ea56e57cbdc396e), L64(0xc437c46ef395aac4), L64(0x030c03180f061b03),
+ L64(0x5645568a13acdc56), L64(0x440d441a49885e44), L64(0x7fe17fdf9efea07f), L64(0xa99ea921374f88a9),
+ L64(0x2aa82a4d8254672a), L64(0xbbd6bbb16d6b0abb), L64(0xc123c146e29f87c1), L64(0x535153a202a6f153),
+ L64(0xdc57dcae8ba572dc), L64(0x0b2c0b582716530b), L64(0x9d4e9d9cd327019d), L64(0x6cad6c47c1d82b6c),
+ L64(0x31c43195f562a431), L64(0x74cd7487b9e8f374), L64(0xf6fff6e309f115f6), L64(0x4605460a438c4c46),
+ L64(0xac8aac092645a5ac), L64(0x891e893c970fb589), L64(0x145014a04428b414), L64(0xe1a3e15b42dfbae1),
+ L64(0x165816b04e2ca616), L64(0x3ae83acdd274f73a), L64(0x69b9696fd0d20669), L64(0x092409482d124109),
+ L64(0x70dd70a7ade0d770), L64(0xb6e2b6d954716fb6), L64(0xd067d0ceb7bd1ed0), L64(0xed93ed3b7ec7d6ed),
+ L64(0xcc17cc2edb85e2cc), L64(0x4215422a57846842), L64(0x985a98b4c22d2c98), L64(0xa4aaa4490e55eda4),
+ L64(0x28a0285d88507528), L64(0x5c6d5cda31b8865c), L64(0xf8c7f8933fed6bf8), L64(0x86228644a411c286),
+};
+
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */
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