Take two:
[www-register-wizard.git] / libraries / Sha1.php
1 <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');\r
2 /**\r
3  * CodeIgniter\r
4  *\r
5  * An open source application development framework for PHP 4.3.2 or newer\r
6  *\r
7  * @package             CodeIgniter\r
8  * @author              ExpressionEngine Dev Team\r
9  * @copyright   Copyright (c) 2008, EllisLab, Inc.\r
10  * @license             http://codeigniter.com/user_guide/license.html\r
11  * @link                http://codeigniter.com\r
12  * @since               Version 1.0\r
13  * @filesource\r
14  */\r
15 \r
16 // ------------------------------------------------------------------------\r
17 \r
18 /**\r
19  * SHA1 Encoding Class\r
20  *\r
21  * Purpose: Provides 160 bit hashing using The Secure Hash Algorithm\r
22  * developed at the National Institute of Standards and Technology. The 40\r
23  * character SHA1 message hash is computationally infeasible to crack.\r
24  *\r
25  * This class is a fallback for servers that are not running PHP greater than\r
26  * 4.3, or do not have the MHASH library.\r
27  *\r
28  * This class is based on two scripts:\r
29  *\r
30  * Marcus Campbell's PHP implementation (GNU license)\r
31  * http://www.tecknik.net/sha-1/\r
32  *\r
33  * ...which is based on Paul Johnston's JavaScript version\r
34  * (BSD license). http://pajhome.org.uk/\r
35  *\r
36  * I encapsulated the functions and wrote one additional method to fix\r
37  * a hex conversion bug. - Rick Ellis\r
38  *\r
39  * @package             CodeIgniter\r
40  * @subpackage  Libraries\r
41  * @category    Encryption\r
42  * @author              ExpressionEngine Dev Team\r
43  * @link                http://codeigniter.com/user_guide/general/encryption.html\r
44  */\r
45 class CI_SHA {\r
46 \r
47         function CI_SHA()\r
48         {\r
49                 log_message('debug', "SHA1 Class Initialized");\r
50         }\r
51 \r
52         /**\r
53          * Generate the Hash\r
54          *\r
55          * @access      public\r
56          * @param       string\r
57          * @return      string\r
58          */     \r
59         function generate($str)\r
60         {\r
61                 $n = ((strlen($str) + 8) >> 6) + 1;\r
62 \r
63                 for ($i = 0; $i < $n * 16; $i++)\r
64                 {\r
65                         $x[$i] = 0;\r
66                 }\r
67 \r
68                 for ($i = 0; $i < strlen($str); $i++)\r
69                 {\r
70                         $x[$i >> 2] |= ord(substr($str, $i, 1)) << (24 - ($i % 4) * 8);\r
71                 }\r
72 \r
73                 $x[$i >> 2] |= 0x80 << (24 - ($i % 4) * 8);\r
74 \r
75                 $x[$n * 16 - 1] = strlen($str) * 8;\r
76 \r
77                 $a =  1732584193;\r
78                 $b = -271733879;\r
79                 $c = -1732584194;\r
80                 $d =  271733878;\r
81                 $e = -1009589776;\r
82 \r
83                 for ($i = 0; $i < sizeof($x); $i += 16)\r
84                 {\r
85                         $olda = $a;\r
86                         $oldb = $b;\r
87                         $oldc = $c;\r
88                         $oldd = $d;\r
89                         $olde = $e;\r
90 \r
91                         for($j = 0; $j < 80; $j++)\r
92                         {\r
93                                 if ($j < 16)\r
94                                 {\r
95                                         $w[$j] = $x[$i + $j];\r
96                                 }\r
97                                 else\r
98                                 {\r
99                                         $w[$j] = $this->_rol($w[$j - 3] ^ $w[$j - 8] ^ $w[$j - 14] ^ $w[$j - 16], 1);\r
100                                 }\r
101 \r
102                                 $t = $this->_safe_add($this->_safe_add($this->_rol($a, 5), $this->_ft($j, $b, $c, $d)), $this->_safe_add($this->_safe_add($e, $w[$j]), $this->_kt($j)));\r
103 \r
104                                 $e = $d;\r
105                                 $d = $c;\r
106                                 $c = $this->_rol($b, 30);\r
107                                 $b = $a;\r
108                                 $a = $t;\r
109                         }\r
110 \r
111                         $a = $this->_safe_add($a, $olda);\r
112                         $b = $this->_safe_add($b, $oldb);\r
113                         $c = $this->_safe_add($c, $oldc);\r
114                         $d = $this->_safe_add($d, $oldd);\r
115                         $e = $this->_safe_add($e, $olde);\r
116                 }\r
117 \r
118                 return $this->_hex($a).$this->_hex($b).$this->_hex($c).$this->_hex($d).$this->_hex($e);\r
119         }\r
120         \r
121         // --------------------------------------------------------------------\r
122 \r
123         /**\r
124          * Convert a decimal to hex\r
125          *\r
126          * @access      private\r
127          * @param       string\r
128          * @return      string\r
129          */     \r
130         function _hex($str)\r
131         {\r
132                 $str = dechex($str);\r
133 \r
134                 if (strlen($str) == 7)\r
135                 {\r
136                         $str = '0'.$str;\r
137                 }\r
138 \r
139                 return $str;\r
140         }\r
141         \r
142         // --------------------------------------------------------------------\r
143 \r
144         /**\r
145          *  Return result based on iteration\r
146          *\r
147          * @access      private\r
148          * @return      string\r
149          */     \r
150         function _ft($t, $b, $c, $d)\r
151         {\r
152                 if ($t < 20)\r
153                         return ($b & $c) | ((~$b) & $d);\r
154                 if ($t < 40)\r
155                         return $b ^ $c ^ $d;\r
156                 if ($t < 60)\r
157                         return ($b & $c) | ($b & $d) | ($c & $d);\r
158 \r
159                 return $b ^ $c ^ $d;\r
160         }\r
161 \r
162         // --------------------------------------------------------------------\r
163 \r
164         /**\r
165          * Determine the additive constant\r
166          *\r
167          * @access      private\r
168          * @return      string\r
169          */     \r
170         function _kt($t)\r
171         {\r
172                 if ($t < 20)\r
173                 {\r
174                         return 1518500249;\r
175                 }\r
176                 else if ($t < 40)\r
177                 {\r
178                         return 1859775393;\r
179                 }\r
180                 else if ($t < 60)\r
181                 {\r
182                         return -1894007588;\r
183                 }\r
184                 else\r
185                 {\r
186                         return -899497514;\r
187                 }\r
188         }\r
189         \r
190         // --------------------------------------------------------------------\r
191 \r
192         /**\r
193          * Add integers, wrapping at 2^32\r
194          *\r
195          * @access      private\r
196          * @return      string\r
197          */     \r
198         function _safe_add($x, $y)\r
199         {\r
200                 $lsw = ($x & 0xFFFF) + ($y & 0xFFFF);\r
201                 $msw = ($x >> 16) + ($y >> 16) + ($lsw >> 16);\r
202 \r
203                 return ($msw << 16) | ($lsw & 0xFFFF);\r
204         }\r
205         \r
206         // --------------------------------------------------------------------\r
207 \r
208         /**\r
209          * Bitwise rotate a 32-bit number\r
210          *\r
211          * @access      private\r
212          * @return      integer\r
213          */     \r
214         function _rol($num, $cnt)\r
215         {\r
216                 return ($num << $cnt) | $this->_zero_fill($num, 32 - $cnt);\r
217         }\r
218 \r
219         // --------------------------------------------------------------------\r
220 \r
221         /**\r
222          * Pad string with zero\r
223          *\r
224          * @access      private\r
225          * @return      string\r
226          */     \r
227         function _zero_fill($a, $b)\r
228         {\r
229                 $bin = decbin($a);\r
230 \r
231                 if (strlen($bin) < $b)\r
232                 {\r
233                         $bin = 0;\r
234                 }\r
235                 else\r
236                 {\r
237                         $bin = substr($bin, 0, strlen($bin) - $b);\r
238                 }\r
239 \r
240                 for ($i=0; $i < $b; $i++)\r
241                 {\r
242                         $bin = "0".$bin;\r
243                 }\r
244 \r
245                 return bindec($bin);\r
246         }\r
247 }\r
248 // END CI_SHA\r
249 \r
250 /* End of file Sha1.php */\r
251 /* Location: ./system/libraries/Sha1.php */