Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
57.14% |
4 / 7 |
CRAP | |
96.40% |
107 / 111 |
| JCryptCipherSimple | |
0.00% |
0 / 1 |
|
57.14% |
4 / 7 |
30 | |
96.40% |
107 / 111 |
| decrypt($data, JCryptKey $key) | |
0.00% |
0 / 1 |
4.01 | |
92.86% |
13 / 14 |
|||
| encrypt($data, JCryptKey $key) | |
0.00% |
0 / 1 |
4.01 | |
92.86% |
13 / 14 |
|||
| generateKey(array $options = array() | |
100.00% |
1 / 1 |
1 | |
100.00% |
4 / 4 |
|||
| _getRandomKey($length = 256) | |
100.00% |
1 / 1 |
2 | |
100.00% |
7 / 7 |
|||
| _hexToInt($s, $i) | |
0.00% |
0 / 1 |
15 | |
96.43% |
54 / 56 |
|||
| _hexToIntArray($hex) | |
100.00% |
1 / 1 |
2 | |
100.00% |
6 / 6 |
|||
| _intToHex($i) | |
100.00% |
1 / 1 |
2 | |
100.00% |
10 / 10 |
|||
| <?php | |
| /** | |
| * @package Joomla.Platform | |
| * @subpackage Crypt | |
| * | |
| * @copyright Copyright (C) 2005 - 2011 Open Source Matters, Inc. All rights reserved. | |
| * @license GNU General Public License version 2 or later; see LICENSE | |
| */ | |
| defined('JPATH_PLATFORM') or die; | |
| /** | |
| * JCrypt cipher for Simple encryption, decryption and key generation. | |
| * | |
| * @package Joomla.Platform | |
| * @subpackage Crypt | |
| * @since 12.1 | |
| */ | |
| class JCryptCipherSimple implements JCryptCipher | |
| { | |
| /** | |
| * Method to decrypt a data string. | |
| * | |
| * @param string $data The encrypted string to decrypt. | |
| * @param JCryptKey $key The key[/pair] object to use for decryption. | |
| * | |
| * @return string The decrypted data string. | |
| * | |
| * @since 12.1 | |
| * @throws InvalidArgumentException | |
| */ | |
| public function decrypt($data, JCryptKey $key) | |
| { | |
| // Validate key. | |
| if ($key->type != 'simple') | |
| { | |
| throw new InvalidArgumentException('Invalid key of type: ' . $key->type . '. Expected simple.'); | |
| } | |
| $decrypted = ''; | |
| $tmp = $key->public; | |
| // Convert the HEX input into an array of integers and get the number of characters. | |
| $chars = $this->_hexToIntArray($data); | |
| $charCount = count($chars); | |
| // Repeat the key as many times as necessary to ensure that the key is at least as long as the input. | |
| for ($i = 0; $i < $charCount; $i = strlen($tmp)) | |
| { | |
| $tmp = $tmp . $tmp; | |
| } | |
| // Get the XOR values between the ASCII values of the input and key characters for all input offsets. | |
| for ($i = 0; $i < $charCount; $i++) | |
| { | |
| $decrypted .= chr($chars[$i] ^ ord($tmp[$i])); | |
| } | |
| return $decrypted; | |
| } | |
| /** | |
| * Method to encrypt a data string. | |
| * | |
| * @param string $data The data string to encrypt. | |
| * @param JCryptKey $key The key[/pair] object to use for encryption. | |
| * | |
| * @return string The encrypted data string. | |
| * | |
| * @since 12.1 | |
| * @throws InvalidArgumentException | |
| */ | |
| public function encrypt($data, JCryptKey $key) | |
| { | |
| // Validate key. | |
| if ($key->type != 'simple') | |
| { | |
| throw new InvalidArgumentException('Invalid key of type: ' . $key->type . '. Expected simple.'); | |
| } | |
| $encrypted = ''; | |
| $tmp = $key->private; | |
| // Split up the input into a character array and get the number of characters. | |
| $chars = preg_split('//', $data, -1, PREG_SPLIT_NO_EMPTY); | |
| $charCount = count($chars); | |
| // Repeat the key as many times as necessary to ensure that the key is at least as long as the input. | |
| for ($i = 0; $i < $charCount; $i = strlen($tmp)) | |
| { | |
| $tmp = $tmp . $tmp; | |
| } | |
| // Get the XOR values between the ASCII values of the input and key characters for all input offsets. | |
| for ($i = 0; $i < $charCount; $i++) | |
| { | |
| $encrypted .= $this->_intToHex(ord($tmp[$i]) ^ ord($chars[$i])); | |
| } | |
| return $encrypted; | |
| } | |
| /** | |
| * Method to generate a new encryption key[/pair] object. | |
| * | |
| * @param array $options Key generation options. | |
| * | |
| * @return JCryptKey | |
| * | |
| * @since 12.1 | |
| */ | |
| public function generateKey(array $options = array()) | |
| { | |
| // Create the new encryption key[/pair] object. | |
| $key = new JCryptKey('simple'); | |
| // Just a random key of a given length. | |
| $key->private = $this->_getRandomKey(); | |
| $key->public = $key->private; | |
| return $key; | |
| } | |
| /** | |
| * Method to generate a random key of a given length. | |
| * | |
| * @param integer $length The length of the key to generate. | |
| * | |
| * @return string | |
| * | |
| * @since 12.1 | |
| */ | |
| private function _getRandomKey($length = 256) | |
| { | |
| $key = ''; | |
| $salt = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; | |
| $saltLength = strlen($salt); | |
| // Build the random key. | |
| for ($i = 0; $i < $length; $i++) | |
| { | |
| $key .= $salt[mt_rand(0, $saltLength - 1)]; | |
| } | |
| return $key; | |
| } | |
| /** | |
| * Convert hex to an integer | |
| * | |
| * @param string $s The hex string to convert. | |
| * @param integer $i The offset? | |
| * | |
| * @return integer | |
| * | |
| * @since 11.1 | |
| */ | |
| private function _hexToInt($s, $i) | |
| { | |
| $j = (int) $i * 2; | |
| $k = 0; | |
| $s1 = (string) $s; | |
| // Get the character at position $j. | |
| $c = substr($s1, $j, 1); | |
| // Get the character at position $j + 1. | |
| $c1 = substr($s1, $j + 1, 1); | |
| switch ($c) | |
| { | |
| case 'A': | |
| $k += 160; | |
| break; | |
| case 'B': | |
| $k += 176; | |
| break; | |
| case 'C': | |
| $k += 192; | |
| break; | |
| case 'D': | |
| $k += 208; | |
| break; | |
| case 'E': | |
| $k += 224; | |
| break; | |
| case 'F': | |
| $k += 240; | |
| break; | |
| case ' ': | |
| $k += 0; | |
| break; | |
| default: | |
| (int) $k = $k + (16 * (int) $c); | |
| break; | |
| } | |
| switch ($c1) | |
| { | |
| case 'A': | |
| $k += 10; | |
| break; | |
| case 'B': | |
| $k += 11; | |
| break; | |
| case 'C': | |
| $k += 12; | |
| break; | |
| case 'D': | |
| $k += 13; | |
| break; | |
| case 'E': | |
| $k += 14; | |
| break; | |
| case 'F': | |
| $k += 15; | |
| break; | |
| case ' ': | |
| $k += 0; | |
| break; | |
| default: | |
| $k += (int) $c1; | |
| break; | |
| } | |
| return $k; | |
| } | |
| /** | |
| * Convert hex to an array of integers | |
| * | |
| * @param string $hex The hex string to convert to an integer array. | |
| * | |
| * @return array An array of integers. | |
| * | |
| * @since 11.1 | |
| */ | |
| private function _hexToIntArray($hex) | |
| { | |
| $array = array(); | |
| $j = (int) strlen($hex) / 2; | |
| for ($i = 0; $i < $j; $i++) | |
| { | |
| $array[$i] = (int) $this->_hexToInt($hex, $i); | |
| } | |
| return $array; | |
| } | |
| /** | |
| * Convert an integer to a hexadecimal string. | |
| * | |
| * @param integer $i An integer value to convert to a hex string. | |
| * | |
| * @return string | |
| * | |
| * @since 11.1 | |
| */ | |
| private function _intToHex($i) | |
| { | |
| // Sanitize the input. | |
| $i = (int) $i; | |
| // Get the first character of the hexadecimal string if there is one. | |
| $j = (int) ($i / 16); | |
| if ($j === 0) | |
| { | |
| $s = ' '; | |
| } | |
| else | |
| { | |
| $s = strtoupper(dechex($j)); | |
| } | |
| // Get the second character of the hexadecimal string. | |
| $k = $i - $j * 16; | |
| $s = $s . strtoupper(dechex($k)); | |
| return $s; | |
| } | |
| } |