diff options
| author | Bharat Mediratta <bharat@menalto.com> | 2008-12-15 08:56:18 +0000 |
|---|---|---|
| committer | Bharat Mediratta <bharat@menalto.com> | 2008-12-15 08:56:18 +0000 |
| commit | 3b35e8b91ce94c292b46a296d034542ac5f0f6da (patch) | |
| tree | 7a1444b5e16475b66300be105b8fc39e5117c881 /kohana/libraries/Encrypt.php | |
| parent | 628058b4ed5aefb543ceb6ca9d3b87828c66bef1 (diff) | |
Refresh kohana from upstream svn trunk r3771.
During this process, remove a considerable number of files from kohana
that we will not be needing in Gallery3, including the following files
and directories:
kohana/application
kohana/example.htaccess
kohana/index.php
kohana/install.php
kohana/kohana.png
kohana/modules/archive
kohana/modules/auth
kohana/modules/flot
kohana/modules/gmaps
kohana/modules/kodoc
kohana/modules/payment
kohana/modules/smarty
kohana/modules/unit_test/i18n
kohana/modules/unit_test/tests/Example_Test.php
kohana/modules/unit_test/tests/Valid_Test.php
kohana/system/config/captcha.php
kohana/system/controllers/captcha.php
kohana/system/fonts
kohana/system/i18n
kohana/system/libraries/Calendar.php
kohana/system/libraries/Calendar_Event.php
kohana/system/libraries/Captcha.php
kohana/system/libraries/Tagcloud.php
kohana/system/vendor
kohana/system/views/pagination
kohana/system/views/kohana_calendar.php
Diffstat (limited to 'kohana/libraries/Encrypt.php')
| -rw-r--r-- | kohana/libraries/Encrypt.php | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/kohana/libraries/Encrypt.php b/kohana/libraries/Encrypt.php new file mode 100644 index 00000000..bfa4c625 --- /dev/null +++ b/kohana/libraries/Encrypt.php @@ -0,0 +1,164 @@ +<?php defined('SYSPATH') OR die('No direct access allowed.'); +/** + * The Encrypt library provides two-way encryption of text and binary strings + * using the MCrypt extension. + * @see http://php.net/mcrypt + * + * $Id$ + * + * @package Core + * @author Kohana Team + * @copyright (c) 2007-2008 Kohana Team + * @license http://kohanaphp.com/license.html + */ +class Encrypt_Core { + + // OS-dependant RAND type to use + protected static $rand; + + // Configuration + protected $config; + + /** + * Returns a singleton instance of Encrypt. + * + * @param array configuration options + * @return Encrypt_Core + */ + public static function instance($config = NULL) + { + static $instance; + + // Create the singleton + empty($instance) and $instance = new Encrypt((array) $config); + + return $instance; + } + + /** + * Loads encryption configuration and validates the data. + * + * @param array|string custom configuration or config group name + * @throws Kohana_Exception + */ + public function __construct($config = FALSE) + { + if ( ! defined('MCRYPT_ENCRYPT')) + throw new Kohana_Exception('encrypt.requires_mcrypt'); + + if (is_string($config)) + { + $name = $config; + + // Test the config group name + if (($config = Kohana::config('encryption.'.$config)) === NULL) + throw new Kohana_Exception('encrypt.undefined_group', $name); + } + + if (is_array($config)) + { + // Append the default configuration options + $config += Kohana::config('encryption.default'); + } + else + { + // Load the default group + $config = Kohana::config('encryption.default'); + } + + if (empty($config['key'])) + throw new Kohana_Exception('encrypt.no_encryption_key'); + + // Find the max length of the key, based on cipher and mode + $size = mcrypt_get_key_size($config['cipher'], $config['mode']); + + if (strlen($config['key']) > $size) + { + // Shorten the key to the maximum size + $config['key'] = substr($config['key'], 0, $size); + } + + // Find the initialization vector size + $config['iv_size'] = mcrypt_get_iv_size($config['cipher'], $config['mode']); + + // Cache the config in the object + $this->config = $config; + + Kohana::log('debug', 'Encrypt Library initialized'); + } + + /** + * Encrypts a string and returns an encrypted string that can be decoded. + * + * @param string data to be encrypted + * @return string encrypted data + */ + public function encode($data) + { + // Set the rand type if it has not already been set + if (self::$rand === NULL) + { + if (KOHANA_IS_WIN) + { + // Windows only supports the system random number generator + self::$rand = MCRYPT_RAND; + } + else + { + if (defined('MCRYPT_DEV_URANDOM')) + { + // Use /dev/urandom + self::$rand = MCRYPT_DEV_URANDOM; + } + elseif (defined('MCRYPT_DEV_RANDOM')) + { + // Use /dev/random + self::$rand = MCRYPT_DEV_RANDOM; + } + else + { + // Use the system random number generator + self::$rand = MCRYPT_RAND; + } + } + } + + if (self::$rand === MCRYPT_RAND) + { + // The system random number generator must always be seeded each + // time it is used, or it will not produce true random results + mt_srand(); + } + + // Create a random initialization vector of the proper size for the current cipher + $iv = mcrypt_create_iv($this->config['iv_size'], self::$rand); + + // Encrypt the data using the configured options and generated iv + $data = mcrypt_encrypt($this->config['cipher'], $this->config['key'], $data, $this->config['mode'], $iv); + + // Use base64 encoding to convert to a string + return base64_encode($iv.$data); + } + + /** + * Decrypts an encoded string back to its original value. + * + * @param string encoded string to be decrypted + * @return string decrypted data + */ + public function decode($data) + { + // Convert the data back to binary + $data = base64_decode($data); + + // Extract the initialization vector from the data + $iv = substr($data, 0, $this->config['iv_size']); + + // Remove the iv from the data + $data = substr($data, $this->config['iv_size']); + + // Return the decrypted data, trimming the \0 padding bytes from the end of the data + return rtrim(mcrypt_decrypt($this->config['cipher'], $this->config['key'], $data, $this->config['mode'], $iv), "\0"); + } + +} // End Encrypt |
