1: <?php
2: /**
3: * PHPExcel
4: *
5: * Copyright (c) 2006 - 2014 PHPExcel
6: *
7: * This library is free software; you can redistribute it and/or
8: * modify it under the terms of the GNU Lesser General Public
9: * License as published by the Free Software Foundation; either
10: * version 2.1 of the License, or (at your option) any later version.
11: *
12: * This library is distributed in the hope that it will be useful,
13: * but WITHOUT ANY WARRANTY; without even the implied warranty of
14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15: * Lesser General Public License for more details.
16: *
17: * You should have received a copy of the GNU Lesser General Public
18: * License along with this library; if not, write to the Free Software
19: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20: *
21: * @category PHPExcel
22: * @package PHPExcel_Shared
23: * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
24: * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
25: * @version 1.8.0, 2014-03-02
26: */
27:
28:
29: /**
30: * PHPExcel_Shared_PasswordHasher
31: *
32: * @category PHPExcel
33: * @package PHPExcel_Shared
34: * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
35: */
36: class PHPExcel_Shared_PasswordHasher
37: {
38: /**
39: * Create a password hash from a given string.
40: *
41: * This method is based on the algorithm provided by
42: * Daniel Rentz of OpenOffice and the PEAR package
43: * Spreadsheet_Excel_Writer by Xavier Noguer <xnoguer@rezebra.com>.
44: *
45: * @param string $pPassword Password to hash
46: * @return string Hashed password
47: */
48: public static function hashPassword($pPassword = '') {
49: $password = 0x0000;
50: $charPos = 1; // char position
51:
52: // split the plain text password in its component characters
53: $chars = preg_split('//', $pPassword, -1, PREG_SPLIT_NO_EMPTY);
54: foreach ($chars as $char) {
55: $value = ord($char) << $charPos++; // shifted ASCII value
56: $rotated_bits = $value >> 15; // rotated bits beyond bit 15
57: $value &= 0x7fff; // first 15 bits
58: $password ^= ($value | $rotated_bits);
59: }
60:
61: $password ^= strlen($pPassword);
62: $password ^= 0xCE4B;
63:
64: return(strtoupper(dechex($password)));
65: }
66: }
67: