Passed
Branch development (e0e718)
by Nils
04:45
created

PHP_Crypt   F

Complexity

Total Complexity 44

Size/Duplication

Total Lines 421
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 29

Importance

Changes 0
Metric Value
dl 0
loc 421
rs 3.9115
c 0
b 0
f 0
wmc 44
lcom 2
cbo 29

How to fix   Complexity   

Complex Class

Complex classes like PHP_Crypt often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use PHP_Crypt, and based on these observations, apply Extract Interface, too.

1
<?php
2
/*
3
 * Author: Ryan Gilfether
4
 * URL: http://www.gilfether.com/phpCrypt
5
 * Date: Sep 4, 2005
6
 * Copyright (C) 2005 Ryan Gilfether
7
 *
8
 * This file is part of phpCrypt
9
 *
10
 * phpCrypt is free software; you can redistribute it and/or modify
11
 * it under the terms of the GNU General Public License as published by
12
 * the Free Software Foundation; either version 3 of the License, or
13
 * (at your option) any later version
14
 *
15
 * This program is distributed in the hope that it will be useful,
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
 * GNU General Public License for more details.
19
 *
20
 * You should have received a copy of the GNU General Public License
21
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
22
 */
23
24
namespace PHP_Crypt;
25
26
require_once(dirname(__FILE__)."/Core.php");
27
require_once(dirname(__FILE__)."/Includes.inc.php");
28
29
/**
30
 * The phpCrypt class, a front end to all the Ciphers and Modes phpCrypt supports
31
 *
32
 * @author Ryan Gilfether
33
 * @link http://www.gilfether.com/phpcrypt
34
 * @copyright 2005 Ryan Gilfether
35
 */
36
class PHP_Crypt
37
{
38
    // Ciphers
39
    const CIPHER_3DES			= "3DES";
40
    const CIPHER_3WAY			= "3-Way";
41
    const CIPHER_AES_128		= "AES-128";
42
    const CIPHER_AES_192		= "AES-192";
43
    const CIPHER_AES_256		= "AES-256";
44
    const CIPHER_ARC4 = "ARC4"; // Alternative RC4
45
    const CIPHER_BLOWFISH		= "Blowfish";
46
    const CIPHER_CAST_128		= "CAST-128";
47
    const CIPHER_CAST_256		= "CAST-256";
48
    const CIPHER_DES			= "DES";
49
    const CIPHER_ENIGMA = "Enigma";
50
    const CIPHER_GOST = "GOST";
51
    const CIPHER_RC2			= "RC2";
52
    const CIPHER_RIJNDAEL_128	= "Rijndael-128";
53
    const CIPHER_RIJNDAEL_192	= "Rijndael-192";
54
    const CIPHER_RIJNDAEL_256	= "Rijndael-256";
55
    const CIPHER_SKIPJACK		= "Skipjack";
56
    const CIPHER_SIMPLEXOR = "SimpleXOR";
57
    const CIPHER_VIGENERE		= "Vigenere"; // historical
58
59
    // Modes
60
    const MODE_CBC	= "CBC";
61
    const MODE_CFB	= "CFB"; // 8 bit cfb mode
62
    const MODE_CTR	= "CTR";
63
    const MODE_ECB	= "ECB";
64
    const MODE_NCFB	= "NCFB"; // blocksize cfb mode
65
    const MODE_NOFB	= "NOFB"; // blocksize ofb mode
66
    const MODE_OFB	= "OFB"; // 8 bit ofb mode
67
    const MODE_PCBC	= "PCBC";
68
    const MODE_RAW	= "Raw"; // raw encryption, with no mode
69
    const MODE_STREAM = "Stream"; // used only for stream ciphers
70
71
    // The source of random data used to create keys and IV's
72
    // Used for PHP_Crypt::createKey(), PHP_Crypt::createIV()
73
    const RAND = "rand"; // uses mt_rand(), windows & unix
74
    const RAND_DEV_RAND = "/dev/random"; // unix only
75
    const RAND_DEV_URAND = "/dev/urandom"; // unix only
76
    const RAND_WIN_COM = "wincom"; // windows only, COM extension
77
    const RAND_DEFAULT_SZ = 32; // the default number of bytes returned
78
79
    // Padding types
80
    const PAD_ZERO = 0;
81
    const PAD_ANSI_X923		= 1;
82
    const PAD_ISO_10126		= 2;
83
    const PAD_PKCS7 = 3;
84
    const PAD_ISO_7816_4	= 4;
85
86
87
    /** @type object $cipher An instance of the cipher object selected */
88
    private $cipher = null;
89
90
    /** @type object $mode An instance of the mode object selected */
91
    private $mode = null;
92
93
94
    /**
95
     * Constructor
96
     *
97
     * @param string $key The key to use for the selected Cipher
98
     * @param string $cipher The type of cipher to use
99
     * @param string $mode The encrypt mode to use with the cipher
100
     * @param integer $padding The padding type to use. Defaults to PAD_ZERO
101
     * @return string
102
     */
103
    public function __construct($key, $cipher = self::CIPHER_AES_128, $mode = self::MODE_ECB, $padding = self::PAD_ZERO)
104
    {
105
        /*
106
		 * CIPHERS
107
		 */
108
        switch ($cipher)
109
        {
110
            case self::CIPHER_3DES:
111
                $this->cipher = new Cipher_3DES($key);
112
                break;
113
114
            case self::CIPHER_3WAY:
115
                $this->cipher = new Cipher_3WAY($key);
116
                break;
117
118
            case self::CIPHER_AES_128:
119
                $this->cipher = new Cipher_AES_128($key);
120
                break;
121
122
            case self::CIPHER_AES_192:
123
                $this->cipher = new Cipher_AES_192($key);
124
                break;
125
126
            case self::CIPHER_AES_256:
127
                $this->cipher = new Cipher_AES_256($key);
128
                break;
129
130
            case self::CIPHER_ARC4: // an alternative to RC4
131
                $this->cipher = new Cipher_ARC4($key);
132
                break;
133
134
            case self::CIPHER_BLOWFISH:
135
                $this->cipher = new Cipher_Blowfish($key);
136
                break;
137
138
            case self::CIPHER_CAST_128:
139
                $this->cipher = new Cipher_CAST_128($key);
140
                break;
141
142
            case self::CIPHER_CAST_256:
143
                $this->cipher = new Cipher_CAST_256($key);
144
                break;
145
146
            case self::CIPHER_DES:
147
                $this->cipher = new Cipher_DES($key);
148
                break;
149
150
            case self::CIPHER_ENIGMA:
151
                $this->cipher = new Cipher_Enigma($key);
152
                break;
153
154
            case self::CIPHER_GOST:
155
                $this->cipher = new Cipher_GOST($key);
156
                break;
157
158
            case self::CIPHER_RC2:
159
                $this->cipher = new Cipher_RC2($key);
160
                break;
161
162
            case self::CIPHER_RIJNDAEL_128:
163
                $this->cipher = new Cipher_Rijndael_128($key);
164
                break;
165
166
            case self::CIPHER_RIJNDAEL_192:
167
                $this->cipher = new Cipher_Rijndael_192($key);
168
                break;
169
170
            case self::CIPHER_RIJNDAEL_256:
171
                $this->cipher = new Cipher_Rijndael_256($key);
172
                break;
173
174
            case self::CIPHER_SIMPLEXOR:
175
                $this->cipher = new Cipher_Simple_XOR($key);
176
                break;
177
178
            case self::CIPHER_SKIPJACK:
179
                $this->cipher = new Cipher_Skipjack($key);
180
                break;
181
182
            case self::CIPHER_VIGENERE:
183
                $this->cipher = new Cipher_Vigenere($key);
184
                break;
185
186
            default:
187
                trigger_error("$cipher is not a valid cipher", E_USER_WARNING);
188
        }
189
190
191
        /*
192
		 * MODES
193
		 */
194
        switch ($mode)
195
        {
196
            case self::MODE_CBC:
197
                $this->mode = new Mode_CBC($this->cipher);
198
                break;
199
200
            case self::MODE_CFB:
201
                $this->mode = new Mode_CFB($this->cipher);
202
                break;
203
204
            case self::MODE_CTR:
205
                $this->mode = new Mode_CTR($this->cipher);
206
                break;
207
208
            case self::MODE_ECB:
209
                $this->mode = new Mode_ECB($this->cipher);
210
                break;
211
212
            case self::MODE_NCFB:
213
                $this->mode = new Mode_NCFB($this->cipher);
214
                break;
215
216
            case self::MODE_NOFB:
217
                $this->mode = new Mode_NOFB($this->cipher);
218
                break;
219
220
            case self::MODE_OFB:
221
                $this->mode = new Mode_OFB($this->cipher);
222
                break;
223
224
            case self::MODE_PCBC:
225
                $this->mode = new Mode_PCBC($this->cipher);
226
                break;
227
228
            case self::MODE_RAW:
229
                $this->mode = new Mode_RAW($this->cipher);
230
                break;
231
232
            case self::MODE_STREAM:
233
                $this->mode = new Mode_Stream($this->cipher);
234
                break;
235
236
            default:
237
                trigger_error("$mode is not a valid mode", E_USER_WARNING);
238
        }
239
240
        // set the default padding
241
        $this->padding($padding);
242
    }
243
244
245
    /**
246
     * Destructor
247
     *
248
     * @return void
249
     */
250
    public function __destruct()
251
    {
252
253
    }
254
255
256
    /**
257
     * Encrypt a plain text message using the Mode and Cipher selected.
258
     * Some stream modes require this function to be called in a loop
259
     * which requires the use of $result parameter to retrieve
260
     * the decrypted data.
261
     *
262
     * @param string $text The plain text string
263
     * @return string The encrypted string
264
     */
265
    public function encrypt($text)
266
    {
267
        // check that an iv is set, if required by the mode
268
        $this->mode->checkIV();
269
270
        // the encryption is done inside the mode
271
        $this->mode->encrypt($text);
272
        return $text;
273
    }
274
275
276
    /**
277
     * Decrypt an encrypted message using the Mode and Cipher selected.
278
     * Some stream modes require this function to be called in a loop
279
     * which requires the use of $result parameter to retrieve
280
     * the decrypted data.
281
     *
282
     * @param string $text The encrypted string
283
     * @return string The decrypted string
284
     */
285
    public function decrypt($text)
286
    {
287
        // check that an iv is set, if required by the mode
288
        $this->mode->checkIV();
289
290
        // the decryption is done inside the mode
291
        $this->mode->decrypt($text);
292
        return $text;
293
    }
294
295
296
    /**
297
     * Return the cipher object being used
298
     *
299
     * @return object The Cipher object
300
     */
301
    public function cipher()
302
    {
303
        return $this->cipher;
304
    }
305
306
307
    /**
308
     * Return the mode object being used
309
     *
310
     * @return object The Mode object
311
     */
312
    public function mode()
313
    {
314
        return $this->mode;
315
    }
316
317
318
    /**
319
     * Returns the name of the cipher being used
320
     *
321
     * @return string The name of the cipher currently in use,
322
     *	it will be one of the predefined phpCrypt cipher constants
323
     */
324
    public function cipherName()
325
    {
326
        return $this->cipher->name();
327
    }
328
329
330
    /**
331
     * Return the name of the mode being used
332
     *
333
     * @return string The name of the mode in use, it will
334
     * be one of the predefined phpCrypt mode constants
335
     */
336
    public function modeName()
337
    {
338
        return $this->mode->name();
339
    }
340
341
342
    /**
343
     * Returns Ciphers required block size in bytes
344
     *
345
     * @return integer The cipher data block size, in bytes
346
     */
347
    public function cipherBlockSize()
348
    {
349
        return $this->cipher->blockSize();
350
    }
351
352
353
    /**
354
     * Returns the cipher's required key size, in bytes
355
     *
356
     * @return integer The cipher's key size requirement, in bytes
357
     */
358
    public function cipherKeySize()
359
    {
360
        return $this->cipher->keySize();
361
    }
362
363
364
    /**
365
     * Sets and/or returns the key to be used. Normally you set
366
     * the key in the phpCrypt constructor. This can be usefully
367
     * if you need to change the key on the fly and don't want
368
     * to create a new instance of phpCrypt.
369
     *
370
     * If the $key parameter is not given, this function will simply
371
     * return the key currently in use.
372
     *
373
     * @param string $key Optional, The key to set
374
     * @return string The key being used
375
     */
376
    public function cipherKey($key = "")
377
    {
378
        return $this->cipher->key($key);
379
    }
380
381
382
    /**
383
     * A helper function which will create a random key. Calls
384
     * Core::randBytes(). By default it will use PHP_Crypt::RAND for
385
     * the random source of bytes, and return a PHP_Crypt::RAND_DEFAULT_SZ
386
     * byte string. There are 4 ways to create a random byte string by
387
     * setting the $src parameter:
388
     * PHP_Crypt::RAND - Default, uses mt_rand()
389
     * PHP_Crypt::RAND_DEV_RAND - Unix only, uses /dev/random
390
     * PHP_Crypt::RAND_DEV_URAND - Unix only, uses /dev/urandom
391
     * PHP_Crypt::RAND_WIN_COM - Windows only, uses Microsoft's CAPICOM SDK
392
     *
393
     * @param string $src Optional, The source to use to create random bytes
394
     * @param integer $len Optional, The number of random bytes to return
395
     * @return string A random string of bytes
396
     */
397
    public static function createKey($src = self::RAND, $len = self::RAND_DEFAULT_SZ)
398
    {
399
        return Core::randBytes($src, $len);
400
    }
401
402
403
    /**
404
     * Sets the IV to use. Note that you do not need to call
405
     * this function if creating an IV using createIV(). This
406
     * function is used when an IV has already been created
407
     * outside of phpCrypt and needs to be set. Alternatively
408
     * you can just pass the $iv parameter to the encrypt()
409
     * or decrypt() functions
410
     *
411
     * When the $iv parameter is not given, the function will
412
     * return the current IV being used. See createIV() if you
413
     * need to create an IV.
414
     *
415
     * @param string $iv Optional, The IV to use during Encryption/Decryption
416
     * @return void
417
     */
418
    public function IV($iv = "")
419
    {
420
        return $this->mode->IV($iv);
421
    }
422
423
424
    /**
425
     * Creates an IV for the the Cipher selected, if one is required.
426
     * If you already have an IV to use, this function does not need
427
     * to be called, instead set it with setIV(). If you create an
428
     * IV with createIV(), you do not need to set it with setIV(),
429
     * as it is automatically set in this function
430
     *
431
     * $src values are:
432
     * PHP_Crypt::RAND - Default, uses mt_rand()
433
     * PHP_Crypt::RAND_DEV_RAND - Unix only, uses /dev/random
434
     * PHP_Crypt::RAND_DEV_URAND - Unix only, uses /dev/urandom
435
     * PHP_Crypt::RAND_WIN_COM - Windows only, uses Microsoft's CAPICOM SDK
436
     *
437
     * @param string $src Optional, how the IV is generated
438
     * @return string The IV that was created, and set for the mode
439
     */
440
    public function createIV($src = self::RAND)
441
    {
442
        return $this->mode->createIV($src);
443
    }
444
445
446
    /**
447
     * Sets the type of padding to be used within the specified Mode
448
     *
449
     * @param string $type One of the predefined padding types
450
     * @return void
451
     */
452
    public function padding($type = "")
453
    {
454
        return $this->mode->padding($type);
455
    }
456
}
457
?>
458