phpgroupware-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Phpgroupware-cvs] phpgwapi/inc/class.crypto.inc.php, 1.22


From: nomail
Subject: [Phpgroupware-cvs] phpgwapi/inc/class.crypto.inc.php, 1.22
Date: Thu, 30 Dec 2004 07:47:30 +0100

Update of /phpgwapi/inc
Added Files:
        Branch: 
          class.crypto.inc.php

date: 2004/12/30 06:47:30;  author: skwashd;  state: Exp;  lines: +17 -25

Log Message:
new HEAD
=====================================================================
<?php
        /**
        * Handles encrypting strings based on various encryption schemes
        * @author Joseph Engo <address@hidden>
        * @copyright Copyright (C) 2000-2004 Free Software Foundation, Inc. 
http://www.fsf.org/
        * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General 
Public License
        * @package phpgwapi
        * @subpackage network
        * @version $Id: class.crypto.inc.php,v 1.22 2004/12/30 06:47:30 skwashd 
Exp $
        */

        /**
        * Handles encrypting strings based on various encryption schemes
        *
        * @package phpgwapi
        * @subpackage network
        */
        class crypto
        {
                var $enabled = False;
                var $debug = False;

                var $mcrypt_version = '';
                var $algo = MCRYPT_TRIPLEDES;
                var $mode = MCRYPT_MODE_CBC;
                var $td = False; /* Handle for mcrypt */
                var $iv = '';
                var $key = '';

                function crypto($vars='')
                {
                        if(is_array($vars))
                        {
                                $this->init($vars);
                        }
                }

                function init($vars)
                {
                        /* _debug_array(mcrypt_list_algorithms()); */
                        $key = $vars[0];
                        $iv  = $vars[1];

                        if ($GLOBALS['phpgw_info']['server']['mcrypt_enabled'] 
&& extension_loaded('mcrypt'))
                        {
                                
if($GLOBALS['phpgw_info']['server']['mcrypt_algo'])
                                {
                                        $this->algo = 
$GLOBALS['phpgw_info']['server']['mcrypt_algo'];
                                }
                                
if($GLOBALS['phpgw_info']['server']['mcrypt_mode'])
                                {
                                        $this->mode = 
$GLOBALS['phpgw_info']['server']['mcrypt_mode'];
                                }

                                if($this->debug)
                                {
                                        echo '<br>crypto: algorithm=' . 
$this->algo;
                                        echo '<br>crypto: mode     =' . 
$this->mode;
                                }

                                $this->enabled = True;
                                $this->mcrypt_version = 
$GLOBALS['phpgw_info']['server']['versions']['mcrypt'];
                                if ($this->mcrypt_version == 'old')
                                {
                                        $this->td = False;
                                        if (phpversion() > '4.0.2pl1')
                                        {
                                                $keysize = 
mcrypt_get_key_size($this->algo);
                                                $ivsize  = 
mcrypt_get_iv_size($this->algo,$this->mode);
                                        }
                                        else
                                        {
                                                $keysize = 8;
                                                $ivsize  = 8;
                                        }
                                }
                                else
                                {
                                        /* Start up mcrypt */
                                        $this->td = mcrypt_module_open 
($this->algo, '', $this->mode, '');

                                        $ivsize  = 
mcrypt_enc_get_iv_size($this->td);
                                        $keysize = 
mcrypt_enc_get_key_size($this->td);
                                }

                                /* Hack IV to be the correct size */
                                $x = strlen($iv);
                                for ($i = 0; $i < $ivsize; $i++)
                                {
                                        $this->iv .= $iv[$i % $x];
                                }

                                /* Hack Key to be the correct size */
                                $x = strlen($key);

                                for ($i = 0; $i < $keysize; $i++)
                                {
                                        $this->key .= $key[$i % $x];
                                }
                        }
                        /* If mcrypt isn't loaded, key and iv are not needed. */
                }

                function cleanup()
                {
                        if ($this->enabled)
                        {
                                if ($this->mcrypt_version != 'old')
                                {
                                        mcrypt_generic_deinit($this->td);
                                }
                        }
                }

                function hex2bin($data)
                {
                        $len = strlen($data);
                        return pack('H'.$len, $data);
                }

                function encrypt($data)
                {
                        if($this->debug)
                        {
                                echo '<br>' . time() . ' crypto->encrypt() 
unencrypted data: ---->>>>' . $data . "\n";
                        }

                        if(is_array($data) || is_object($data))
                        {
                                if($this->debug)
                                {
                                        echo '<br>' . time() . ' 
crypto->encrypt() found an "' . gettype($data) . '".  Serializing...' . "\n";
                                }
                                $data = serialize($data);
                                $_obj = True;
                        }
                        else
                        {
                                if($this->debug)
                                {
                                        echo '<br>' . time() . ' 
crypto->encrypt() found "' . gettype($data) . '". No serialization...' . "\n";
                                }
                        }

                        /* Disable all encryption if the admin didn't set it up 
*/
                        if ($this->enabled)
                        {
                                if($_obj)
                                {
                                        if($this->debug)
                                        {
                                                echo '<br>' . time() . ' 
crypto->encrypt() adding slashes' . "\n";
                                        }
                                        $data = addslashes($data);
                                }

                                if($this->debug)
                                {
                                        echo '<br>' . time() . ' 
crypto->encrypt() data: ---->>>>' . $data;
                                }

                                switch ($this->mcrypt_version)
                                {
                                        case 'old':
                                                /* The old code, only works 
with mcrypt <= 2.2.x */
                                                $encrypteddata = 
mcrypt_cbc($this->algo, $this->key, $data, MCRYPT_ENCRYPT);
                                                break;
                                        default:
                                                /* Handle 2.4 and newer API */
                                                mcrypt_generic_init ($this->td, 
$this->key, $this->iv);
                                                $encrypteddata = 
mcrypt_generic($this->td, $data);
                                                break;
                                }
                                $encrypteddata = bin2hex($encrypteddata);
                                if($this->debug)
                                {
                                        echo '<br>' . time() . ' 
crypto->encrypt() crypted data: ---->>>>' . $encrypteddata;
                                }
                                return $encrypteddata;
                        }
                        else
                        {
                                /* No mcrypt == insecure ! */
                                if($this->debug)
                                {
                                        echo '<br>' . time() . ' 
crypto->encrypt() crypted data: ---->>>>' . $data;
                                }
                                return $data;
                        }
                }

                function decrypt($encrypteddata)
                {
                        if($this->debug)
                        {
                                echo '<br>' . time() . ' crypto->decrypt() 
crypted data: ---->>>>' . $encrypteddata;
                        }
                        /* Disable all encryption if the admin didn't set it up 
*/
                        if ($this->enabled)
                        {
                                $data = $this->hex2bin($encrypteddata);
                                switch ($this->mcrypt_version)
                                {
                                        case 'old':
                                                /* The old code, only works 
with mcrypt <= 2.2.x */
                                                $data = mcrypt_cbc($this->algo, 
$this->key, $data, MCRYPT_DECRYPT);
                                                break;
                                        default:
                                                /* Handle 2.4 and newer API */
                                                mcrypt_generic_init ($this->td, 
$this->key, $this->iv);
                                                $data = 
mdecrypt_generic($this->td, $data);
                                                break;
                                }

                                if($this->debug)
                                {
                                        echo '<br>' . time() . ' 
crypto->decrypt() decrypted data: ---->>>>' . $data;
                                }
                                $test = stripslashes($data);
                                if(@unserialize($test))
                                {
                                        if($this->debug)
                                        {
                                                echo '<br>' . time() . ' 
crypto->decrypt() stripping slashes' . "\n";
                                        }
                                        $data = $test;
                                }
                                unset($test);

                                if($this->debug)
                                {
                                        echo '<br>' . time() . ' 
crypto->decrypt() data: ---->>>>' . $data . "\n";
                                }
                        }
                        else
                        {
                                /* No mcrypt == insecure ! */
                                $data = $encrypteddata;
                        }

                        $newdata = @unserialize($data);
                        if($newdata)
                        {
                                if($this->debug)
                                {
                                        echo '<br>' . time() . ' 
crypto->decrypt() found serialized "' . gettype($newdata) . '".  
Unserializing...' . "\n";
                                        echo '<br>' . time() . ' 
crypto->decrypt() returning: '; _debug_array($newdata);
                                }
                                return $newdata;
                        }
                        else
                        {
                                if($this->debug)
                                {
                                        echo '<br>' . time() . ' 
crypto->decrypt() found UNserialized "' . gettype($data) . '".  No 
unserialization...' . "\n";
                                        echo '<br>' . time() . ' 
crypto->decrypt() returning: ' . $data;
                                }
                                return $data;
                        }
                }
        } // class crypto
?>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]