-
-
Notifications
You must be signed in to change notification settings - Fork 9
/
Crypt.php
139 lines (126 loc) · 3.71 KB
/
Crypt.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
<?php
/**
* Part of the Joomla Framework Crypt Package
*
* @copyright Copyright (C) 2005 - 2021 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE
*/
namespace Joomla\Crypt;
use Joomla\Crypt\Cipher\Crypto;
use Joomla\Crypt\Exception\DecryptionException;
use Joomla\Crypt\Exception\EncryptionException;
use Joomla\Crypt\Exception\InvalidKeyException;
use Joomla\Crypt\Exception\InvalidKeyTypeException;
use Joomla\Crypt\Exception\UnsupportedCipherException;
/**
* Crypt is a Joomla Framework class for handling basic encryption/decryption of data.
*
* @since 1.0
*/
class Crypt
{
/**
* The encryption cipher object.
*
* @var CipherInterface
* @since 1.0
*/
private $cipher;
/**
* The encryption key[/pair)].
*
* @var Key
* @since 1.0
*/
private $key;
/**
* Object Constructor takes an optional key to be used for encryption/decryption. If no key is given then the
* secret word from the configuration object is used.
*
* @param ?CipherInterface $cipher The encryption cipher object.
* @param ?Key $key The encryption key[/pair)].
*
* @since 1.0
*/
public function __construct(?CipherInterface $cipher = null, ?Key $key = null)
{
// Set the encryption cipher.
$this->cipher = $cipher ?: new Crypto();
// Set the encryption key[/pair)].
$this->key = $key ?: $this->generateKey();
}
/**
* Method to decrypt a data string.
*
* @param string $data The encrypted string to decrypt.
*
* @return string The decrypted data string.
*
* @since 1.0
* @throws DecryptionException if the data cannot be decrypted
* @throws InvalidKeyTypeException if the key is not valid for the cipher
* @throws UnsupportedCipherException if the cipher is not supported on the current environment
*/
public function decrypt($data)
{
return $this->cipher->decrypt($data, $this->key);
}
/**
* Method to encrypt a data string.
*
* @param string $data The data string to encrypt.
*
* @return string The encrypted data string.
*
* @since 1.0
* @throws EncryptionException if the data cannot be encrypted
* @throws InvalidKeyTypeException if the key is not valid for the cipher
* @throws UnsupportedCipherException if the cipher is not supported on the current environment
*/
public function encrypt($data)
{
return $this->cipher->encrypt($data, $this->key);
}
/**
* Method to generate a new encryption key[/pair] object.
*
* @param array $options Key generation options.
*
* @return Key
*
* @since 1.0
* @throws InvalidKeyException if the key cannot be generated
* @throws UnsupportedCipherException if the cipher is not supported on the current environment
*/
public function generateKey(array $options = [])
{
return $this->cipher->generateKey($options);
}
/**
* Method to set the encryption key[/pair] object.
*
* @param Key $key The key object to set.
*
* @return Crypt Instance of $this to allow chaining.
*
* @since 1.0
*/
public function setKey(Key $key)
{
$this->key = $key;
return $this;
}
/**
* Generate random bytes.
*
* @param integer $length Length of the random data to generate
*
* @return string Random binary data
*
* @since 1.0
*/
public static function genRandomBytes($length = 16)
{
return random_bytes($length);
}
}