├── TODO ├── EXPERIMENTAL ├── tests ├── 002.exp ├── keys.txt ├── input.php ├── output.phpe ├── 001.phpt ├── 002.out ├── 002.php ├── 002.diff └── 002.log ├── CREDITS ├── LICENSE ├── config.w32 ├── config.m4 ├── blenc.php ├── CHANGELOG ├── bf_algo.h ├── package.xml ├── blenc_protect.h ├── php_blenc.h ├── tools └── blencode.php ├── blenc.c └── bf_algo.c /TODO: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /EXPERIMENTAL: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/002.exp: -------------------------------------------------------------------------------- 1 | Hello, World! -------------------------------------------------------------------------------- /tests/keys.txt: -------------------------------------------------------------------------------- 1 | 646bdf72d4cdc5bb8a110ad0ec4627bc -------------------------------------------------------------------------------- /tests/input.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /CREDITS: -------------------------------------------------------------------------------- 1 | blenc 2 | John Coggeshall, Giuseppe Chiesa 3 | -------------------------------------------------------------------------------- /tests/output.phpe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/php/pecl-php-blenc/master/tests/output.phpe -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Package is released under the PHP License 2 | (http://www.php.net/license) 3 | 4 | 5 | -------------------------------------------------------------------------------- /config.w32: -------------------------------------------------------------------------------- 1 | // $Id$ 2 | // vim:ft=javascript 3 | 4 | ARG_ENABLE("blenc", "enable blenc support", "no"); 5 | 6 | if (PHP_BLENC != "no") { 7 | EXTENSION("blenc", "blenc.c bf_algo.c"); 8 | } 9 | -------------------------------------------------------------------------------- /tests/001.phpt: -------------------------------------------------------------------------------- 1 | --TEST-- 2 | Check for blenc presence 3 | --SKIPIF-- 4 | 5 | --FILE-- 6 | 9 | --EXPECT-- 10 | blenc extension is available 11 | -------------------------------------------------------------------------------- /tests/002.out: -------------------------------------------------------------------------------- 1 | Fatal error: Validation of script 'ext/blenc/tests/output.phpe' failed, cannot execute. in /home/john/working/php-src/ext/blenc/tests/002.php on line 6 2 | /home/john/working/php-src/main/streams/streams.c(374) : Stream of type 'STDIO' 0x401f9dc4 (path:ext/blenc/tests/output.phpe) was not closed 3 | /home/john/working/php-src/Zend/zend_hash.c(1276) : ht=0x824d2fc is already destroyed -------------------------------------------------------------------------------- /tests/002.php: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /tests/002.diff: -------------------------------------------------------------------------------- 1 | 001+ Fatal error: Validation of script 'ext/blenc/tests/output.phpe' failed, cannot execute. in /home/john/working/php-src/ext/blenc/tests/002.php on line 6 2 | 001- Hello, World! 3 | 002+ /home/john/working/php-src/main/streams/streams.c(374) : Stream of type 'STDIO' 0x401f9dc4 (path:ext/blenc/tests/output.phpe) was not closed 4 | 003+ /home/john/working/php-src/Zend/zend_hash.c(1276) : ht=0x824d2fc is already destroyed -------------------------------------------------------------------------------- /config.m4: -------------------------------------------------------------------------------- 1 | dnl $Id$ 2 | dnl config.m4 for extension blowfish 3 | 4 | dnl Comments in this file start with the string 'dnl'. 5 | dnl Remove where necessary. This file will not work 6 | dnl without editing. 7 | 8 | PHP_ARG_ENABLE(blenc, whether to enable blowfish script encryption, 9 | [ --enable-blenc Enable BLENC script encryption support]) 10 | 11 | if test "$PHP_BLENC" != "no"; then 12 | PHP_NEW_EXTENSION(blenc, blenc.c bf_algo.c, $ext_shared) 13 | fi 14 | -------------------------------------------------------------------------------- /tests/002.log: -------------------------------------------------------------------------------- 1 | 2 | ---- EXPECTED OUTPUT 3 | Hello, World! 4 | ---- ACTUAL OUTPUT 5 | Fatal error: Validation of script 'ext/blenc/tests/output.phpe' failed, cannot execute. in /home/john/working/php-src/ext/blenc/tests/002.php on line 6 6 | /home/john/working/php-src/main/streams/streams.c(374) : Stream of type 'STDIO' 0x401f9dc4 (path:ext/blenc/tests/output.phpe) was not closed 7 | /home/john/working/php-src/Zend/zend_hash.c(1276) : ht=0x824d2fc is already destroyed 8 | ---- FAILED 9 | -------------------------------------------------------------------------------- /blenc.php: -------------------------------------------------------------------------------- 1 | \n"; 8 | foreach($functions as $func) { 9 | echo $func."
\n"; 10 | } 11 | echo "
\n"; 12 | $function = 'confirm_' . $module . '_compiled'; 13 | if (extension_loaded($module)) { 14 | $str = $function($module); 15 | } else { 16 | $str = "Module $module is not compiled into PHP"; 17 | } 18 | echo "$str\n"; 19 | ?> 20 | -------------------------------------------------------------------------------- /CHANGELOG: -------------------------------------------------------------------------------- 1 | 2013-06-12 2 | -- 3 | Some fix on config.m4, new package.xml description, BLENC now display version in phpinfo. 4 | 5 | 6 | 2013-05-31 7 | -- 8 | Renamed blenc_protect.h.dist to blenc_protect.h in order to permit automatic installation with "pecl install" command. 9 | 10 | 11 | 2013-05-30 12 | -- 13 | Update package.xml to V2, added CHANGELOG and a simple script "blencode.php" to encode sources in tools/ directory. Tagged sources as 1.1.0b 14 | 15 | 16 | 2013-05-29 17 | -- 18 | Blenc now compile and works with PHP latest versions (tested with PHP <= 5.4.6) 19 | Implemented support for date expiration of module and key encryption with hardcoded main key (see blenc_protect.h.dist for examples of usage) 20 | Some minor bug fixes 21 | -------------------------------------------------------------------------------- /bf_algo.h: -------------------------------------------------------------------------------- 1 | /* 2 | blowfish.h: Header file for blowfish.c 3 | 4 | Copyright (C) 1997 by Paul Kocher 5 | 6 | This library is free software; you can redistribute it and/or 7 | modify it under the terms of the GNU Lesser General Public 8 | License as published by the Free Software Foundation; either 9 | version 2.1 of the License, or (at your option) any later version. 10 | This library is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 | Lesser General Public License for more details. 14 | You should have received a copy of the GNU Lesser General Public 15 | License along with this library; if not, write to the Free Software 16 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 | 18 | 19 | See blowfish.c for more information about this file. 20 | */ 21 | 22 | 23 | typedef struct { 24 | unsigned long P[16 + 2]; 25 | unsigned long S[4][256]; 26 | } BLOWFISH_CTX; 27 | 28 | void Blowfish_Init(BLOWFISH_CTX *ctx, unsigned char *key, int keyLen); 29 | void Blowfish_Encrypt(BLOWFISH_CTX *ctx, unsigned long *xl, unsigned long *xr); 30 | void Blowfish_Decrypt(BLOWFISH_CTX *ctx, unsigned long *xl, unsigned long *xr); 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /package.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | blenc 7 | pecl.php.net 8 | BLowfish ENCryption for PHP Scripts 9 | 10 | BLENC is an extension that permit to protect PHP source scripts with Blowfish Encription. 11 | BLENC hooks into the Zend Engine, allowing for transparent execution of PHP scripts previously encoded with BLENC. 12 | It is not designed for complete security (it is still possible to disassemble the script into op codes using a package such as XDebug), however it does keep people out of your code and make reverse engineering difficult. 13 | 14 | 15 | John Coggeshall 16 | john 17 | john@php.net 18 | yes 19 | 20 | 21 | Giuseppe Chiesa 22 | gchiesa 23 | gchiesa@php.net 24 | yes 25 | 26 | 2014-04-27 27 | 28 | 29 | 1.1.4b 30 | 1.1.4b 31 | 32 | 33 | beta 34 | beta 35 | 36 | PHP 37 | 38 | Upgraded to works with latest PHP version 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 4.3.0 62 | 63 | 64 | 1.4.0b1 65 | 66 | 67 | 68 | blenc 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /blenc_protect.h: -------------------------------------------------------------------------------- 1 | /* 2 | +----------------------------------------------------------------------+ 3 | | PHP Version 5 | 4 | +----------------------------------------------------------------------+ 5 | | Copyright (c) 1997-2013 The PHP Group | 6 | +----------------------------------------------------------------------+ 7 | | This source file is subject to version 3.0 of the PHP license, | 8 | | that is bundled with this package in the file LICENSE, and is | 9 | | available through the world-wide-web at the following url: | 10 | | http://www.php.net/license/3_0.txt. | 11 | | If you did not receive a copy of the PHP license and are unable to | 12 | | obtain it through the world-wide-web, please send a note to | 13 | | license@php.net so we can mail you a copy immediately. | 14 | +----------------------------------------------------------------------+ 15 | | Author: John Coggeshall | 16 | | Giuseppe Chiesa | 17 | +----------------------------------------------------------------------+ 18 | */ 19 | 20 | /* 21 | * BLENC_PROTECT.H 22 | */ 23 | #ifndef BLENC_PROTECT_H 24 | #define BLENC_PROTECT_H 25 | 26 | /* 27 | * BLENC_PROTECT_COMP3 : It's a better way to protect the expiration date into the module executable 28 | * and preventing reverse engineering. 29 | * With this declaration the expiration date must be into the comp3 format. 30 | * Please see below for further informations. 31 | */ 32 | #define BLENC_PROTECT_COMP3 33 | 34 | /* 35 | * BLENC_PROTECT_MAIN_KEY : It's the encryption key used to encode the keyfile available for powerusers on the 36 | * system. With this key hard encoded nobody could be able to decrypt the PHP sources 37 | * protected with BLENC. 38 | * Use a strong key! 39 | * ex: create a strong key using apg with command 40 | * ~$ apg -a1 -m32 -x32 -E "\\\/\"" 41 | */ 42 | #define BLENC_PROTECT_MAIN_KEY "0123456789abcdef0123456789abcdef" 43 | 44 | /* 45 | * BLENC_PROTECT_EXPIRE : It's the expiration date for the module extension. After this date the module will not 46 | * decrypt sources. 47 | * The date must have different formats according with BLENC_PROTECT_COMP3 definition: 48 | * - If BLENC_PROTECT_COMP3 is undefined the date must be in the format: 49 | * GG-MM-AAAA 50 | * (ex. 30-04-2013) 51 | * #define BLENC_PROTECT_EXPIRE "30-04-2013" 52 | * 53 | * 54 | * - If BLENC_PROTECT COMP3 id defined the date must follow the comp3 compression (stronger against 55 | * reverse engineering techniques). The format is the following: 56 | * { '\xAA', '\xAA', '\xMM', '\xGG' } 57 | * 58 | * ex. 30-04-2013 -> { '\x20', '\x13', '\x04', '\x30' } 59 | */ 60 | #define BLENC_PROTECT_EXPIRE { '\x99', '\x99', '\x99', '\x99' } 61 | 62 | #endif 63 | -------------------------------------------------------------------------------- /php_blenc.h: -------------------------------------------------------------------------------- 1 | /* 2 | +----------------------------------------------------------------------+ 3 | | PHP Version 5 | 4 | +----------------------------------------------------------------------+ 5 | | Copyright (c) 1997-2013 The PHP Group | 6 | +----------------------------------------------------------------------+ 7 | | This source file is subject to version 3.0 of the PHP license, | 8 | | that is bundled with this package in the file LICENSE, and is | 9 | | available through the world-wide-web at the following url: | 10 | | http://www.php.net/license/3_0.txt. | 11 | | If you did not receive a copy of the PHP license and are unable to | 12 | | obtain it through the world-wide-web, please send a note to | 13 | | license@php.net so we can mail you a copy immediately. | 14 | +----------------------------------------------------------------------+ 15 | | Author: John Coggeshall | 16 | | Giuseppe Chiesa | 17 | +----------------------------------------------------------------------+ 18 | */ 19 | 20 | /* $Id$ */ 21 | 22 | #ifndef PHP_BLENC_H 23 | #define PHP_BLENC_H 24 | 25 | #if ZEND_MODULE_API_NO >= 20100409 26 | #define ZEND_ENGINE_2_4 27 | #endif 28 | #if ZEND_MODULE_API_NO > 20060613 29 | #define ZEND_ENGINE_2_3 30 | #endif 31 | #if ZEND_MODULE_API_NO > 20050922 32 | #define ZEND_ENGINE_2_2 33 | #endif 34 | #if ZEND_MODULE_API_NO > 20050921 35 | #define ZEND_ENGINE_2_1 36 | #endif 37 | 38 | #define PHP_BLENC_VERSION "1.1.4b" 39 | #define BLENC_IDENT "BLENC" 40 | #define BLENC_BUFSIZE 4092 41 | 42 | #ifndef TRUE 43 | #define TRUE 1 44 | #endif 45 | #ifndef FALSE 46 | #define FALSE 0 47 | #endif 48 | 49 | extern zend_module_entry blenc_module_entry; 50 | #define phpext_blenc_ptr &blenc_module_entry 51 | 52 | #ifdef PHP_WIN32 53 | #define PHP_BLENC_API __declspec(dllexport) 54 | #else 55 | #define PHP_BLENC_API 56 | #endif 57 | 58 | #ifdef ZTS 59 | #include "TSRM.h" 60 | #endif 61 | 62 | PHP_MINIT_FUNCTION(blenc); 63 | PHP_MSHUTDOWN_FUNCTION(blenc); 64 | PHP_RINIT_FUNCTION(blenc); 65 | PHP_MINFO_FUNCTION(blenc); 66 | 67 | PHP_FUNCTION(blenc_encrypt); 68 | 69 | typedef unsigned char b_byte; 70 | typedef unsigned int b_uint; 71 | 72 | ZEND_BEGIN_MODULE_GLOBALS(blenc) 73 | char *key_file; 74 | char *decoded; 75 | unsigned int decoded_len; 76 | unsigned int index; 77 | zend_bool keys_loaded; 78 | zend_bool expired; 79 | char *expire_date; 80 | unsigned long expire_date_numerical; 81 | ZEND_END_MODULE_GLOBALS(blenc) 82 | 83 | size_t (*old_stream_reader)(void *, char *, size_t TSRMLS_DC); 84 | void (*old_stream_closer)(void * TSRMLS_DC); 85 | zend_op_array *(*zend_compile_file_old)(zend_file_handle *, int TSRMLS_DC); 86 | zend_op_array *blenc_compile(zend_file_handle *, int TSRMLS_DC); 87 | 88 | static void php_blenc_make_md5(char *, void *, unsigned int TSRMLS_DC); 89 | static char *php_blenc_file_to_mem(char * TSRMLS_DC); 90 | static int php_blenc_load_keyhash(TSRMLS_D); 91 | 92 | b_byte *php_blenc_encode(void *, unsigned char *, int, int * TSRMLS_DC); 93 | b_byte *php_blenc_decode(void *, unsigned char *, int, int * TSRMLS_DC); 94 | static unsigned char *php_blenc_gen_key(TSRMLS_D); 95 | void _php_blenc_pefree_wrapper(void **); 96 | 97 | #ifdef ZTS 98 | #define BL_G(v) TSRMG(blenc_globals_id, zend_blenc_globals *, v) 99 | #else 100 | #define BL_G(v) (blenc_globals.v) 101 | #endif 102 | 103 | #endif /* PHP_BLENC_H */ 104 | 105 | 106 | /* 107 | * Local variables: 108 | * tab-width: 4 109 | * c-basic-offset: 4 110 | * End: 111 | * vim600: noet sw=4 ts=4 fdm=marker 112 | * vim<600: noet sw=4 ts=4 113 | */ 114 | -------------------------------------------------------------------------------- /tools/blencode.php: -------------------------------------------------------------------------------- 1 | | 17 | +----------------------------------------------------------------------+ 18 | */ 19 | 20 | /** 21 | * blencode.php 22 | * Encode a php source file with BLENC 23 | * 24 | * This script will create an encoded version of SOURCEFILE.php with extension .phpenc 25 | * and link the old SOURCEFILE.php to the encoded version. 26 | * blencode.php also will create some other files: 27 | * blenc.key with the unencrypted blowfish encryption key 28 | * key_file.blenc with the encrypted version of blowfish key, in order to redistribute 29 | * them with your encoded sources. 30 | * ./backup directory where original SOURCE files will be saved. 31 | * 32 | */ 33 | function usage($prg) 34 | { 35 | echo "Usage : php -f $prg SOURCE "; 36 | echo "\n". 37 | "It will create a encoded version of SOURCE with extension .phpenc \n". 38 | "and will replace the code in SOURCE with a include request for the \n". 39 | "new encoded file.\n". 40 | "$prg also will create some other files:\n". 41 | " blenc.key with the unencrypted blowfish encryption key\n". 42 | " key_file.blenc with the encrypted version of blowfish key, in order to\n". 43 | " redistribute them with your encoded sources.\n". 44 | " ./backup directory where original SOURCE files will be saved\n\n"; 45 | 46 | } 47 | 48 | function minify($fname) 49 | { 50 | $retval = ''; 51 | $fdata = file($fname); 52 | 53 | foreach($fdata as $row) { 54 | 55 | $retval .= ' '.trim($row).' '; 56 | 57 | } 58 | 59 | return $retval; 60 | } 61 | 62 | 63 | 64 | /* 65 | +----------------------------------------------------------------------+ 66 | | MAIN | 67 | +----------------------------------------------------------------------+ 68 | */ 69 | ini_set("output_buffering", "16000"); 70 | 71 | if($argc < 2) { 72 | 73 | usage(basename($argv[0])); 74 | die(); 75 | 76 | } 77 | 78 | $B1=@system('tput smso'); 79 | $B0=@system('tput rmso'); 80 | 81 | if(!file_exists($argv[1])) { 82 | 83 | echo "$B1 BLENC $B0 file $argv[1] not found.\n"; 84 | die(); 85 | 86 | } 87 | 88 | if(file_exists('blenc.key')) 89 | $key_prev = $key = file_get_contents('blenc.key'); 90 | else { 91 | 92 | $key_prev = $key = md5(time()); 93 | file_put_contents('blenc.key', $key); 94 | } 95 | 96 | echo "$B1 BLENC $B0 blenc_protect starts...\n"; 97 | echo "$B1 BLENC $B0 blowfish unencrypted key: $key\n"; 98 | echo "$B1 BLENC $B0 file to encode: ".$argv[1]."\n"; 99 | 100 | if(file_exists($argv[1])) { 101 | 102 | if(!is_dir('backup')) { 103 | 104 | mkdir('backup'); 105 | 106 | } 107 | 108 | if(!file_exists('backup/'.basename($argv[1]))) { 109 | 110 | $backup_file = 'backup/'.basename($argv[1]); 111 | 112 | } else { 113 | 114 | $backup_file = 'backup/'.basename($argv[1]).'.'.date('Y_m_d_H_i_s', time()); 115 | 116 | } 117 | 118 | copy($argv[1], $backup_file); 119 | echo "$B1 BLENC $B0 backup file : $backup_file\n"; 120 | 121 | $contents = php_strip_whitespace($argv[1]); 122 | file_put_contents('/tmp/blencode-txt', $contents); 123 | $contents = minify('/tmp/blencode-txt'); 124 | $aS = array('', ' 149 | -------------------------------------------------------------------------------- /blenc.c: -------------------------------------------------------------------------------- 1 | /* 2 | +----------------------------------------------------------------------+ 3 | | PHP Version 5 | 4 | +----------------------------------------------------------------------+ 5 | | Copyright (c) 1997-2013 The PHP Group | 6 | +----------------------------------------------------------------------+ 7 | | This source file is subject to version 3.0 of the PHP license, | 8 | | that is bundled with this package in the file LICENSE, and is | 9 | | available through the world-wide-web at the following url: | 10 | | http://www.php.net/license/3_0.txt. | 11 | | If you did not receive a copy of the PHP license and are unable to | 12 | | obtain it through the world-wide-web, please send a note to | 13 | | license@php.net so we can mail you a copy immediately. | 14 | +----------------------------------------------------------------------+ 15 | | Author: John Coggeshall | 16 | | Giuseppe Chiesa | 17 | +----------------------------------------------------------------------+ 18 | */ 19 | 20 | /* $Id$ */ 21 | 22 | #ifdef HAVE_CONFIG_H 23 | #include "config.h" 24 | #endif 25 | 26 | #include "php.h" 27 | #include "php_ini.h" 28 | #include "ext/standard/info.h" 29 | #include "ext/standard/md5.h" 30 | #include "ext/standard/base64.h" 31 | #ifdef PHP_WIN32 32 | # include "win32/time.h" 33 | #endif 34 | #include "php_blenc.h" 35 | #include "blenc_protect.h" 36 | #include "bf_algo.h" 37 | 38 | ZEND_DECLARE_MODULE_GLOBALS(blenc) 39 | 40 | typedef struct _blenc_header { 41 | b_byte ident[8]; 42 | b_byte version[16]; 43 | b_byte md5[32]; 44 | b_byte reserved[16]; 45 | } blenc_header; 46 | 47 | /* True global - no need for thread safety here */ 48 | HashTable *php_bl_keys; 49 | 50 | /* {{{ blenc_functions[] */ 51 | zend_function_entry blenc_functions[] = { 52 | PHP_FE(blenc_encrypt, NULL) 53 | {NULL, NULL, NULL} 54 | }; 55 | /* }}} */ 56 | 57 | /* {{{ blenc_module_entry 58 | */ 59 | zend_module_entry blenc_module_entry = { 60 | #if ZEND_MODULE_API_NO >= 20010901 61 | STANDARD_MODULE_HEADER, 62 | #endif 63 | "blenc", 64 | blenc_functions, 65 | PHP_MINIT(blenc), 66 | PHP_MSHUTDOWN(blenc), 67 | PHP_RINIT(blenc), 68 | NULL, 69 | PHP_MINFO(blenc), 70 | #if ZEND_MODULE_API_NO >= 20010901 71 | PHP_BLENC_VERSION, /* Replace with version number for your extension */ 72 | #endif 73 | STANDARD_MODULE_PROPERTIES 74 | }; 75 | /* }}} */ 76 | 77 | #ifdef COMPILE_DL_BLENC 78 | ZEND_GET_MODULE(blenc) 79 | #endif 80 | 81 | /* {{{ PHP_INI */ 82 | PHP_INI_BEGIN() 83 | STD_PHP_INI_ENTRY("blenc.key_file", "/usr/local/etc/blenckeys", PHP_INI_ALL, OnUpdateString, key_file, zend_blenc_globals, blenc_globals) 84 | PHP_INI_END() 85 | /* }}} */ 86 | 87 | /* {{{ php_blenc_init_globals */ 88 | static void php_blenc_init_globals(zend_blenc_globals *blenc_globals) 89 | { 90 | blenc_globals->key_file = NULL; 91 | blenc_globals->keys_loaded = FALSE; 92 | blenc_globals->decoded = NULL; 93 | blenc_globals->decoded_len = 0; 94 | blenc_globals->index = 0; 95 | 96 | } 97 | /* }}} */ 98 | 99 | /* {{{ PHP_MINIT_FUNCTION 100 | */ 101 | PHP_MINIT_FUNCTION(blenc) 102 | { 103 | time_t now; 104 | struct tm *today; 105 | char today_char[16]; 106 | char expire_char[] = BLENC_PROTECT_EXPIRE; 107 | char buff[10]; 108 | int k = 0, j = 0, i = 0; 109 | 110 | ZEND_INIT_MODULE_GLOBALS(blenc, php_blenc_init_globals, NULL); 111 | REGISTER_INI_ENTRIES(); 112 | 113 | php_bl_keys = pemalloc(sizeof(HashTable), TRUE); 114 | zend_hash_init(php_bl_keys, 0, NULL, _php_blenc_pefree_wrapper, TRUE); 115 | 116 | zend_compile_file_old = zend_compile_file; 117 | zend_compile_file = blenc_compile; 118 | 119 | REGISTER_STRING_CONSTANT("BLENC_EXT_VERSION", PHP_BLENC_VERSION, CONST_CS | CONST_PERSISTENT); 120 | 121 | /* 122 | * check expire extension 123 | */ 124 | memset(today_char, '\0', sizeof(today_char)); 125 | now = time(NULL); 126 | today = localtime(&now); 127 | strftime(today_char, 16, "%Y%m%d", today); 128 | 129 | #ifndef BLENC_PROTECT_COMP3 130 | BL_G(expire_date) = pemalloc(sizeof(expire_char), TRUE); 131 | strcpy(BL_G(expire_date), expire_char); 132 | 133 | strncpy(buff, &expire_char[6], 4); 134 | strncpy(&buff[4], &expire_char[3], 2); 135 | strncpy(&buff[6], &expire_char[0], 2); 136 | buff[8] = '\0'; 137 | #else 138 | j = 0; 139 | for(k=0; k<4; k++) { 140 | 141 | if(expire_char[k] == 0) { 142 | 143 | buff[j++] = '0'; 144 | buff[j++] = '0'; 145 | 146 | } else { 147 | 148 | i = expire_char[k]; 149 | if(i < 0) 150 | i += 256; 151 | 152 | buff[j++] = i / 16 + '0'; 153 | buff[j++] = i % 16 + '0'; 154 | 155 | } 156 | 157 | } // for 158 | buff[j] = '\0'; 159 | 160 | BL_G(expire_date) = pemalloc(11, TRUE); 161 | strncpy(&BL_G(expire_date)[0], &buff[6], 2); 162 | BL_G(expire_date)[2] = '-'; 163 | strncpy(&BL_G(expire_date)[3], &buff[4], 2); 164 | BL_G(expire_date)[5] = '-'; 165 | strncpy(&BL_G(expire_date)[6], &buff[0], 4); 166 | BL_G(expire_date)[10] = '\0'; 167 | #endif 168 | 169 | if(atol(today_char) > atol(buff)) 170 | BL_G(expired) = TRUE; 171 | 172 | return SUCCESS; 173 | } 174 | /* }}} */ 175 | 176 | /* {{{ PHP_MSHUTDOWN_FUNCTION 177 | */ 178 | PHP_MSHUTDOWN_FUNCTION(blenc) 179 | { 180 | UNREGISTER_INI_ENTRIES(); 181 | 182 | zend_hash_destroy(php_bl_keys); 183 | pefree(php_bl_keys, TRUE); 184 | // FREE_HASHTABLE(php_bl_keys); 185 | zend_compile_file = zend_compile_file_old; 186 | 187 | return SUCCESS; 188 | } 189 | /* }}} */ 190 | 191 | /* Remove if there's nothing to do at request start */ 192 | /* {{{ PHP_RINIT_FUNCTION 193 | */ 194 | PHP_RINIT_FUNCTION(blenc) 195 | { 196 | if(!BL_G(keys_loaded)) { 197 | if(php_blenc_load_keyhash(TSRMLS_C) == FAILURE) { 198 | zend_error(E_WARNING, "BLENC: Could not load some or all of the Keys"); 199 | return FAILURE; 200 | } 201 | BL_G(keys_loaded) = TRUE; 202 | } 203 | 204 | return SUCCESS; 205 | } 206 | /* }}} */ 207 | 208 | /* {{{ PHP_MINFO_FUNCTION 209 | */ 210 | PHP_MINFO_FUNCTION(blenc) 211 | { 212 | php_info_print_table_start(); 213 | 214 | if(BL_G(expired)) 215 | php_info_print_table_row(2, "Blenc support", "Expired"); 216 | else 217 | php_info_print_table_row(2, "Blenc support", "Enabled"); 218 | 219 | php_info_print_table_row(2, "Blenc version", PHP_BLENC_VERSION); 220 | php_info_print_table_row(2, "Blenc expire date", BL_G(expire_date)); 221 | 222 | php_info_print_table_end(); 223 | 224 | DISPLAY_INI_ENTRIES(); 225 | 226 | } 227 | /* }}} */ 228 | 229 | PHP_FUNCTION(blenc_encrypt) { 230 | 231 | char *data = NULL, *retval = NULL, *key = NULL, *output_file = NULL; 232 | int output_len = 0, key_len = 0, data_len = 0, output_file_len = 0; 233 | php_stream *stream; 234 | zend_bool dup_key = FALSE; 235 | char main_key[] = BLENC_PROTECT_MAIN_KEY; 236 | char *main_hash[33]; 237 | b_byte *bfdata = NULL; 238 | int bfdata_len = 0; 239 | char *b64data = NULL; 240 | int b64data_len = 0; 241 | blenc_header header = {BLENC_IDENT, PHP_BLENC_VERSION}; 242 | 243 | memset(main_hash, '\0', sizeof(main_hash)); 244 | 245 | php_blenc_make_md5(main_hash, main_key, strlen(main_key) TSRMLS_CC); 246 | 247 | if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|s", &data, &data_len, 248 | &output_file, &output_file_len, 249 | &key, &key_len) == FAILURE) { 250 | RETURN_FALSE; 251 | } 252 | 253 | if(key == NULL) { 254 | key = php_blenc_gen_key(TSRMLS_C); 255 | } else { 256 | dup_key = TRUE; 257 | } 258 | 259 | php_blenc_make_md5((char *)&header.md5, data, data_len TSRMLS_CC); 260 | 261 | retval = php_blenc_encode(data, key, data_len, &output_len TSRMLS_CC); 262 | 263 | bfdata = php_blenc_encode(key, main_hash, strlen(key), &bfdata_len TSRMLS_CC); 264 | b64data = php_base64_encode(bfdata, bfdata_len, &b64data_len); 265 | 266 | if((stream = php_stream_open_wrapper(output_file, "wb", ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL))) { 267 | 268 | _php_stream_write(stream, (void *)&header, (int)sizeof(blenc_header) TSRMLS_CC); 269 | _php_stream_write(stream, retval, output_len TSRMLS_CC); 270 | php_stream_close(stream); 271 | 272 | /* RETVAL_STRING(key, dup_key); */ 273 | RETVAL_STRINGL(b64data, b64data_len, TRUE); 274 | } 275 | 276 | efree(retval); 277 | } 278 | 279 | static void php_blenc_make_md5(char *result, void *data, unsigned int data_len TSRMLS_DC) 280 | { 281 | PHP_MD5_CTX context; 282 | unsigned char digest[16]; 283 | 284 | PHP_MD5Init(&context); 285 | PHP_MD5Update(&context, data, data_len); 286 | PHP_MD5Final(digest, &context); 287 | 288 | make_digest(result, digest); 289 | 290 | } 291 | 292 | static char *php_blenc_file_to_mem(char *filename TSRMLS_DC) 293 | { 294 | php_stream *stream; 295 | int len; 296 | char *data = NULL; 297 | 298 | if (!(stream = php_stream_open_wrapper(filename, "rb", ENFORCE_SAFE_MODE, NULL))) { 299 | return NULL; 300 | } 301 | 302 | if ((len = php_stream_copy_to_mem(stream, &data, PHP_STREAM_COPY_ALL, 0)) == 0) { 303 | data = estrdup(""); 304 | } 305 | 306 | php_stream_close(stream); 307 | 308 | if(data == NULL) { 309 | return NULL; 310 | } 311 | 312 | return data; 313 | } 314 | 315 | static int php_blenc_load_keyhash(TSRMLS_D) 316 | { 317 | char *strtok_buf = NULL; 318 | char *key = NULL; 319 | char *keys = NULL; 320 | char main_key[] = BLENC_PROTECT_MAIN_KEY; 321 | char main_hash[33]; 322 | b_byte *buff = NULL; 323 | int buff_len = 0; 324 | char *bfdata = NULL; 325 | int bfdata_len = 0; 326 | 327 | keys = php_blenc_file_to_mem(BL_G(key_file) TSRMLS_CC); 328 | 329 | memset(main_hash, '\0', sizeof(main_hash)); 330 | php_blenc_make_md5(main_hash, main_key, strlen(main_key) TSRMLS_CC); 331 | 332 | if(keys) { 333 | char *t = keys; 334 | 335 | while((key = php_strtok_r(t, "\n", &strtok_buf))) { 336 | char *temp; 337 | t = NULL; 338 | 339 | if(!key) { 340 | continue; 341 | } 342 | 343 | bfdata = php_base64_decode(key, strlen(key), &bfdata_len); 344 | buff = php_blenc_decode(bfdata, main_hash, bfdata_len, &buff_len TSRMLS_CC); 345 | 346 | temp = pestrdup(buff, TRUE); 347 | if(zend_hash_next_index_insert(php_bl_keys, &temp, sizeof(char *), NULL) == FAILURE) { 348 | zend_error(E_WARNING, "Could not add a key to the keyhash!"); 349 | } 350 | 351 | temp = NULL; 352 | 353 | } 354 | 355 | efree(keys); 356 | 357 | } 358 | 359 | return SUCCESS; 360 | 361 | } 362 | 363 | 364 | b_byte *php_blenc_encode(void *script, unsigned char *key, int in_len, int *out_len TSRMLS_DC) 365 | { 366 | BLOWFISH_CTX *ctx = NULL; 367 | unsigned long hi = 0, low = 0; 368 | int i, pad_size = 0; 369 | b_byte *input = NULL; 370 | 371 | ctx = emalloc(sizeof(BLOWFISH_CTX)); 372 | 373 | Blowfish_Init (ctx, (unsigned char *)key, strlen(key)); 374 | 375 | 376 | if((pad_size = in_len % 8)) { 377 | pad_size = 8 - pad_size; 378 | 379 | input = (b_byte*) estrdup(script); 380 | input = erealloc(input, in_len + pad_size); 381 | 382 | memset(&input[in_len], '\0', pad_size); 383 | 384 | } else { 385 | 386 | input = (b_byte*) estrdup(script); 387 | pad_size = 0; 388 | 389 | } 390 | 391 | hi = 0x0L; 392 | low = 0x0L; 393 | 394 | for(i = 0; i < (in_len + pad_size); i+=8) { 395 | 396 | hi |= (unsigned int)((char *)input)[i] & 0xFF; 397 | hi = hi << 8; 398 | hi |= (unsigned int)((char *)input)[i+1] & 0xFF; 399 | hi = hi << 8; 400 | hi |= (unsigned int)((char *)input)[i+2] & 0xFF; 401 | hi = hi << 8; 402 | hi |= (unsigned int)((char *)input)[i+3] & 0xFF; 403 | 404 | low |= (unsigned int)((char *)input)[i+4] & 0xFF; 405 | low = low << 8; 406 | low |= (unsigned int)((char *)input)[i+5] & 0xFF; 407 | low = low << 8; 408 | low |= (unsigned int)((char *)input)[i+6] & 0xFF; 409 | low = low << 8; 410 | low |= (unsigned int)((char *)input)[i+7] & 0xFF; 411 | 412 | Blowfish_Encrypt(ctx, &hi, &low); 413 | 414 | input[i] = hi >> 24; 415 | input[i+1] = hi >> 16; 416 | input[i+2] = hi >> 8; 417 | input[i+3] = hi; 418 | input[i+4] = low >> 24; 419 | input[i+5] = low >> 16; 420 | input[i+6] = low >> 8; 421 | input[i+7] = low; 422 | 423 | hi = 0x0L; 424 | low = 0x0L; 425 | } 426 | 427 | *out_len = in_len + pad_size; 428 | 429 | efree(ctx); 430 | 431 | return input; 432 | } 433 | 434 | b_byte *php_blenc_decode(void *input, unsigned char *key, int in_len, int *out_len TSRMLS_DC) 435 | { 436 | BLOWFISH_CTX ctx; 437 | unsigned long hi, low; 438 | int i; 439 | b_byte *retval; 440 | 441 | Blowfish_Init (&ctx, (unsigned char*)key, strlen(key)); 442 | 443 | if(in_len % 8) { 444 | 445 | zend_error(E_WARNING, "Attempted to decode non-blenc encrytped file."); 446 | return estrdup(""); 447 | 448 | } else { 449 | 450 | retval = emalloc(in_len + 1); 451 | 452 | } 453 | 454 | memset(retval, '\0', sizeof(retval)); 455 | 456 | hi = 0x0L; 457 | low = 0x0L; 458 | 459 | for(i = 0; i < in_len; i+=8) { 460 | 461 | hi |= (unsigned int)((char *)input)[i] & 0xFF; 462 | hi = hi << 8; 463 | hi |= (unsigned int)((char *)input)[i+1] & 0xFF; 464 | hi = hi << 8; 465 | hi |= (unsigned int)((char *)input)[i+2] & 0xFF; 466 | hi = hi << 8; 467 | hi |= (unsigned int)((char *)input)[i+3] & 0xFF; 468 | 469 | low |= (unsigned int)((char *)input)[i+4] & 0xFF; 470 | low = low << 8; 471 | low |= (unsigned int)((char *)input)[i+5] & 0xFF; 472 | low = low << 8; 473 | low |= (unsigned int)((char *)input)[i+6] & 0xFF; 474 | low = low << 8; 475 | low |= (unsigned int)((char *)input)[i+7] & 0xFF; 476 | 477 | Blowfish_Decrypt(&ctx, &hi, &low); 478 | 479 | retval[i] = hi >> 24; 480 | retval[i+1] = hi >> 16; 481 | retval[i+2] = hi >> 8; 482 | retval[i+3] = hi; 483 | retval[i+4] = low >> 24; 484 | retval[i+5] = low >> 16; 485 | retval[i+6] = low >> 8; 486 | retval[i+7] = low; 487 | 488 | hi = 0x0L; 489 | low = 0x0L; 490 | 491 | } 492 | 493 | retval[in_len] = '\0'; 494 | *out_len = strlen(retval); 495 | 496 | return retval; 497 | } 498 | 499 | static unsigned char *php_blenc_gen_key(TSRMLS_D) 500 | { 501 | 502 | int sec = 0 , usec = 0; 503 | struct timeval tv; 504 | char *retval = NULL, *tmp = NULL; 505 | PHP_MD5_CTX context; 506 | unsigned char digest[16]; 507 | 508 | gettimeofday((struct timeval *) &tv, (struct timezone *) NULL); 509 | sec = (int) tv.tv_sec; 510 | usec = (int) (tv.tv_usec % 0x100000); 511 | 512 | spprintf(&tmp, 0, "%08x%05x", sec, usec); 513 | 514 | retval = emalloc(33); 515 | 516 | PHP_MD5Init(&context); 517 | PHP_MD5Update(&context, tmp, strlen(tmp)); 518 | PHP_MD5Final(digest, &context); 519 | make_digest(retval, digest); 520 | efree(tmp); 521 | 522 | return retval; 523 | } 524 | 525 | zend_op_array *blenc_compile(zend_file_handle *file_handle, int type TSRMLS_DC) { 526 | 527 | int i = 0, res = 0; 528 | size_t bytes; 529 | php_stream *stream; 530 | char *script = NULL; 531 | b_byte *decoded = NULL; 532 | unsigned int decoded_len = 0; 533 | unsigned int index = 0; 534 | unsigned int script_len = 0; 535 | zend_op_array *retval = NULL; 536 | blenc_header *header; 537 | zval *code; 538 | zend_bool validated = FALSE; 539 | MAKE_STD_ZVAL(code); 540 | 541 | 542 | /* 543 | * using php_stream instead zend internals 544 | */ 545 | if( (stream = php_stream_open_wrapper(file_handle->filename, "r", ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL)) == NULL) { 546 | 547 | zend_error(E_NOTICE, "blenc_compile: unable to open stream, compiling with default compiler."); 548 | return retval = zend_compile_file_old(file_handle, type TSRMLS_CC); 549 | 550 | } 551 | 552 | script = emalloc(BLENC_BUFSIZE); 553 | for(i = 2; (bytes = php_stream_read(stream, &script[index], BLENC_BUFSIZE)) > 0; i++) { 554 | 555 | script_len += bytes; 556 | if(bytes == BLENC_BUFSIZE) { 557 | 558 | script = erealloc(script, BLENC_BUFSIZE * i); 559 | index += bytes; 560 | 561 | } 562 | 563 | } 564 | 565 | script_len += bytes; 566 | 567 | php_stream_close(stream); 568 | 569 | if(!script_len) { 570 | 571 | zend_error(E_NOTICE, "blenc_compile: unable to read stream, compiling with default compiler."); 572 | return retval = zend_compile_file_old(file_handle, type TSRMLS_CC); 573 | 574 | } 575 | 576 | /* 577 | * check if it's a blenc script 578 | */ 579 | header = (blenc_header *)script; 580 | 581 | if(!strncmp(script, BLENC_IDENT, strlen(BLENC_IDENT))) { 582 | 583 | char *md5; 584 | char *encoded = &script[sizeof(blenc_header)]; 585 | char **key = NULL; 586 | 587 | if(BL_G(expired)) { 588 | 589 | zend_error(E_ERROR, "blenc_compile: Module php_blenc was expired. Please buy a new license key or disable the module."); 590 | return NULL; 591 | 592 | } 593 | 594 | for (zend_hash_internal_pointer_reset(php_bl_keys); 595 | zend_hash_get_current_data(php_bl_keys, (void **)&key) == SUCCESS; 596 | zend_hash_move_forward(php_bl_keys)) { 597 | 598 | decoded = php_blenc_decode(encoded, *key, script_len - sizeof(blenc_header), &decoded_len TSRMLS_CC); 599 | 600 | md5 = emalloc(33); 601 | php_blenc_make_md5(md5, decoded, decoded_len TSRMLS_CC); 602 | 603 | if(!strncmp(md5, header->md5, 32)) { 604 | 605 | validated = TRUE; 606 | efree(md5); 607 | break; 608 | 609 | } 610 | 611 | zend_error(E_WARNING, "blenc_compile: Validation of script '%s' failed. MD5_FILE: %s MD5_CALC: %s\n", 612 | file_handle->filename, header->md5, md5); 613 | 614 | efree(md5); 615 | md5 = NULL; 616 | 617 | efree(decoded); 618 | decoded_len = 0; 619 | 620 | } 621 | 622 | if(!validated) { 623 | 624 | zend_error(E_ERROR, "blenc_compile: Validation of script '%s' failed, cannot execute.", file_handle->filename); 625 | return NULL; 626 | 627 | } 628 | 629 | } 630 | 631 | if(validated && decoded != NULL) { 632 | 633 | ZVAL_STRINGL(code, decoded, decoded_len, TRUE); 634 | retval = zend_compile_string(code, file_handle->filename TSRMLS_CC); 635 | 636 | } else { 637 | 638 | retval = zend_compile_file_old(file_handle, type TSRMLS_CC); 639 | 640 | } 641 | 642 | return retval; 643 | } 644 | 645 | void _php_blenc_pefree_wrapper(void **data) 646 | { 647 | pefree(*data, TRUE); 648 | 649 | } 650 | 651 | /* 652 | * Local variables: 653 | * tab-width: 4 654 | * c-basic-offset: 4 655 | * End: 656 | * vim600: noet sw=4 ts=4 fdm=marker 657 | * vim<600: noet sw=4 ts=4 658 | */ 659 | -------------------------------------------------------------------------------- /bf_algo.c: -------------------------------------------------------------------------------- 1 | /* 2 | blowfish.c: C implementation of the Blowfish algorithm. 3 | 4 | Copyright (C) 1997 by Paul Kocher 5 | 6 | This library is free software; you can redistribute it and/or 7 | modify it under the terms of the GNU Lesser General Public 8 | License as published by the Free Software Foundation; either 9 | version 2.1 of the License, or (at your option) any later version. 10 | This library is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 | Lesser General Public License for more details. 14 | You should have received a copy of the GNU Lesser General Public 15 | License along with this library; if not, write to the Free Software 16 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 | 18 | COMMENTS ON USING THIS CODE: 19 | 20 | Normal usage is as follows: 21 | [1] Allocate a BLOWFISH_CTX. (It may be too big for the stack.) 22 | [2] Call Blowfish_Init with a pointer to your BLOWFISH_CTX, a pointer to 23 | the key, and the number of bytes in the key. 24 | [3] To encrypt a 64-bit block, call Blowfish_Encrypt with a pointer to 25 | BLOWFISH_CTX, a pointer to the 32-bit left half of the plaintext 26 | and a pointer to the 32-bit right half. The plaintext will be 27 | overwritten with the ciphertext. 28 | [4] Decryption is the same as encryption except that the plaintext and 29 | ciphertext are reversed. 30 | 31 | Warning #1: The code does not check key lengths. (Caveat encryptor.) 32 | Warning #2: Beware that Blowfish keys repeat such that "ab" = "abab". 33 | Warning #3: It is normally a good idea to zeroize the BLOWFISH_CTX before 34 | freeing it. 35 | Warning #4: Endianness conversions are the responsibility of the caller. 36 | (To encrypt bytes on a little-endian platforms, you'll probably want 37 | to swap bytes around instead of just casting.) 38 | Warning #5: Make sure to use a reasonable mode of operation for your 39 | application. (If you don't know what CBC mode is, see Warning #7.) 40 | Warning #6: This code is susceptible to timing attacks. 41 | Warning #7: Security engineering is risky and non-intuitive. Have someone 42 | check your work. If you don't know what you are doing, get help. 43 | 44 | 45 | This is code is fast enough for most applications, but is not optimized for 46 | speed. 47 | 48 | If you require this code under a license other than LGPL, please ask. (I 49 | can be located using your favorite search engine.) Unfortunately, I do not 50 | have time to provide unpaid support for everyone who uses this code. 51 | 52 | -- Paul Kocher 53 | */ 54 | 55 | #include "bf_algo.h" 56 | 57 | #define N 16 58 | 59 | static const unsigned long ORIG_P[16 + 2] = { 60 | 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L, 61 | 0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L, 62 | 0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL, 63 | 0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L, 64 | 0x9216D5D9L, 0x8979FB1BL 65 | }; 66 | 67 | static const unsigned long ORIG_S[4][256] = { 68 | { 0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L, 69 | 0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L, 70 | 0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L, 71 | 0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL, 72 | 0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL, 73 | 0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L, 74 | 0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL, 75 | 0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL, 76 | 0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L, 77 | 0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L, 78 | 0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL, 79 | 0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL, 80 | 0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL, 81 | 0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L, 82 | 0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L, 83 | 0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L, 84 | 0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L, 85 | 0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L, 86 | 0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL, 87 | 0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L, 88 | 0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L, 89 | 0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L, 90 | 0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L, 91 | 0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL, 92 | 0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L, 93 | 0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL, 94 | 0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL, 95 | 0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L, 96 | 0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL, 97 | 0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L, 98 | 0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL, 99 | 0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L, 100 | 0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L, 101 | 0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL, 102 | 0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L, 103 | 0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L, 104 | 0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL, 105 | 0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L, 106 | 0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL, 107 | 0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L, 108 | 0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L, 109 | 0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL, 110 | 0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L, 111 | 0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L, 112 | 0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L, 113 | 0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L, 114 | 0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L, 115 | 0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL, 116 | 0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL, 117 | 0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L, 118 | 0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L, 119 | 0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L, 120 | 0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L, 121 | 0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL, 122 | 0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L, 123 | 0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL, 124 | 0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL, 125 | 0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L, 126 | 0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L, 127 | 0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L, 128 | 0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L, 129 | 0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L, 130 | 0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L, 131 | 0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076AL }, 132 | { 0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L, 133 | 0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L, 134 | 0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L, 135 | 0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL, 136 | 0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L, 137 | 0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L, 138 | 0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL, 139 | 0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L, 140 | 0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L, 141 | 0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L, 142 | 0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL, 143 | 0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL, 144 | 0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L, 145 | 0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L, 146 | 0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L, 147 | 0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L, 148 | 0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL, 149 | 0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL, 150 | 0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL, 151 | 0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L, 152 | 0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL, 153 | 0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L, 154 | 0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L, 155 | 0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL, 156 | 0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL, 157 | 0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L, 158 | 0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL, 159 | 0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L, 160 | 0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL, 161 | 0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL, 162 | 0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L, 163 | 0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L, 164 | 0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L, 165 | 0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L, 166 | 0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L, 167 | 0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L, 168 | 0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L, 169 | 0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL, 170 | 0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L, 171 | 0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL, 172 | 0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L, 173 | 0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L, 174 | 0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L, 175 | 0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L, 176 | 0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L, 177 | 0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L, 178 | 0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L, 179 | 0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L, 180 | 0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L, 181 | 0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L, 182 | 0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L, 183 | 0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L, 184 | 0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L, 185 | 0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L, 186 | 0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L, 187 | 0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L, 188 | 0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL, 189 | 0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL, 190 | 0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L, 191 | 0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL, 192 | 0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L, 193 | 0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L, 194 | 0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L, 195 | 0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L }, 196 | { 0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L, 197 | 0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L, 198 | 0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL, 199 | 0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L, 200 | 0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L, 201 | 0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L, 202 | 0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL, 203 | 0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL, 204 | 0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL, 205 | 0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L, 206 | 0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L, 207 | 0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL, 208 | 0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L, 209 | 0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL, 210 | 0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L, 211 | 0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL, 212 | 0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L, 213 | 0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL, 214 | 0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L, 215 | 0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL, 216 | 0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L, 217 | 0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L, 218 | 0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL, 219 | 0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L, 220 | 0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L, 221 | 0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L, 222 | 0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L, 223 | 0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL, 224 | 0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L, 225 | 0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL, 226 | 0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L, 227 | 0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL, 228 | 0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L, 229 | 0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL, 230 | 0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL, 231 | 0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL, 232 | 0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L, 233 | 0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L, 234 | 0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL, 235 | 0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL, 236 | 0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL, 237 | 0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL, 238 | 0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL, 239 | 0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L, 240 | 0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L, 241 | 0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L, 242 | 0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L, 243 | 0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL, 244 | 0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL, 245 | 0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L, 246 | 0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L, 247 | 0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L, 248 | 0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L, 249 | 0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L, 250 | 0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L, 251 | 0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L, 252 | 0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L, 253 | 0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L, 254 | 0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L, 255 | 0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL, 256 | 0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L, 257 | 0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL, 258 | 0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L, 259 | 0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L }, 260 | { 0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL, 261 | 0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL, 262 | 0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL, 263 | 0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L, 264 | 0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L, 265 | 0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L, 266 | 0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L, 267 | 0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L, 268 | 0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L, 269 | 0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L, 270 | 0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L, 271 | 0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L, 272 | 0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L, 273 | 0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L, 274 | 0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L, 275 | 0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL, 276 | 0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL, 277 | 0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L, 278 | 0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL, 279 | 0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL, 280 | 0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL, 281 | 0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L, 282 | 0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL, 283 | 0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL, 284 | 0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L, 285 | 0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L, 286 | 0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L, 287 | 0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L, 288 | 0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL, 289 | 0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL, 290 | 0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L, 291 | 0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L, 292 | 0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L, 293 | 0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL, 294 | 0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L, 295 | 0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L, 296 | 0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L, 297 | 0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL, 298 | 0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L, 299 | 0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L, 300 | 0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L, 301 | 0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL, 302 | 0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL, 303 | 0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L, 304 | 0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L, 305 | 0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L, 306 | 0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L, 307 | 0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL, 308 | 0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L, 309 | 0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL, 310 | 0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL, 311 | 0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L, 312 | 0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L, 313 | 0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL, 314 | 0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L, 315 | 0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL, 316 | 0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L, 317 | 0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL, 318 | 0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L, 319 | 0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L, 320 | 0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL, 321 | 0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L, 322 | 0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL, 323 | 0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L } 324 | }; 325 | 326 | 327 | static unsigned long F(BLOWFISH_CTX *ctx, unsigned long x) { 328 | unsigned short a, b, c, d; 329 | unsigned long y; 330 | 331 | d = (unsigned short)(x & 0xFF); 332 | x >>= 8; 333 | c = (unsigned short)(x & 0xFF); 334 | x >>= 8; 335 | b = (unsigned short)(x & 0xFF); 336 | x >>= 8; 337 | a = (unsigned short)(x & 0xFF); 338 | y = ctx->S[0][a] + ctx->S[1][b]; 339 | y = y ^ ctx->S[2][c]; 340 | y = y + ctx->S[3][d]; 341 | 342 | return y; 343 | } 344 | 345 | 346 | void Blowfish_Encrypt(BLOWFISH_CTX *ctx, unsigned long *xl, unsigned long *xr){ 347 | unsigned long Xl; 348 | unsigned long Xr; 349 | unsigned long temp; 350 | short i; 351 | 352 | Xl = *xl; 353 | Xr = *xr; 354 | 355 | for (i = 0; i < N; ++i) { 356 | Xl = Xl ^ ctx->P[i]; 357 | Xr = F(ctx, Xl) ^ Xr; 358 | 359 | temp = Xl; 360 | Xl = Xr; 361 | Xr = temp; 362 | } 363 | 364 | temp = Xl; 365 | Xl = Xr; 366 | Xr = temp; 367 | 368 | Xr = Xr ^ ctx->P[N]; 369 | Xl = Xl ^ ctx->P[N + 1]; 370 | 371 | *xl = Xl; 372 | *xr = Xr; 373 | } 374 | 375 | 376 | void Blowfish_Decrypt(BLOWFISH_CTX *ctx, unsigned long *xl, unsigned long *xr){ 377 | unsigned long Xl; 378 | unsigned long Xr; 379 | unsigned long temp; 380 | short i; 381 | 382 | Xl = *xl; 383 | Xr = *xr; 384 | 385 | for (i = N + 1; i > 1; --i) { 386 | Xl = Xl ^ ctx->P[i]; 387 | Xr = F(ctx, Xl) ^ Xr; 388 | 389 | /* Exchange Xl and Xr */ 390 | temp = Xl; 391 | Xl = Xr; 392 | Xr = temp; 393 | } 394 | 395 | /* Exchange Xl and Xr */ 396 | temp = Xl; 397 | Xl = Xr; 398 | Xr = temp; 399 | 400 | Xr = Xr ^ ctx->P[1]; 401 | Xl = Xl ^ ctx->P[0]; 402 | 403 | *xl = Xl; 404 | *xr = Xr; 405 | } 406 | 407 | 408 | void Blowfish_Init(BLOWFISH_CTX *ctx, unsigned char *key, int keyLen) { 409 | int i, j, k; 410 | unsigned long data, datal, datar; 411 | 412 | for (i = 0; i < 4; i++) { 413 | for (j = 0; j < 256; j++) 414 | ctx->S[i][j] = ORIG_S[i][j]; 415 | } 416 | 417 | j = 0; 418 | for (i = 0; i < N + 2; ++i) { 419 | data = 0x00000000; 420 | for (k = 0; k < 4; ++k) { 421 | data = (data << 8) | key[j]; 422 | j = j + 1; 423 | if (j >= keyLen) 424 | j = 0; 425 | } 426 | ctx->P[i] = ORIG_P[i] ^ data; 427 | } 428 | 429 | datal = 0x00000000; 430 | datar = 0x00000000; 431 | 432 | for (i = 0; i < N + 2; i += 2) { 433 | Blowfish_Encrypt(ctx, &datal, &datar); 434 | ctx->P[i] = datal; 435 | ctx->P[i + 1] = datar; 436 | } 437 | 438 | for (i = 0; i < 4; ++i) { 439 | for (j = 0; j < 256; j += 2) { 440 | Blowfish_Encrypt(ctx, &datal, &datar); 441 | ctx->S[i][j] = datal; 442 | ctx->S[i][j + 1] = datar; 443 | } 444 | } 445 | } 446 | 447 | 448 | --------------------------------------------------------------------------------