PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / 2.4.6
Booking for Appointments and Events Calendar – Amelia v2.4.6
2.4.7 2.4.6 2.4.5 2.4.4 2.4.3 2.4.2 2.4.1 2.4 trunk 1.2.1 1.2.10 1.2.11 1.2.12 1.2.13 1.2.14 1.2.15 1.2.16 1.2.17 1.2.18 1.2.19 1.2.2 1.2.20 1.2.21 1.2.22 1.2.23 1.2.24 1.2.25 1.2.26 1.2.27 1.2.28 1.2.29 1.2.3 1.2.30 1.2.31 1.2.32 1.2.33 1.2.34 1.2.35 1.2.36 1.2.37 1.2.38 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 2.0 2.0.1 2.0.2 2.1 2.1.1 2.1.2 2.1.3 2.2 2.2.1 2.3
ameliabooking / vendor / paragonie / constant_time_encoding / src / Base64.php
ameliabooking / vendor / paragonie / constant_time_encoding / src Last commit date
Base32.php 7 months ago Base32Hex.php 7 months ago Base64.php 7 months ago Base64DotSlash.php 7 months ago Base64DotSlashOrdered.php 7 months ago Base64UrlSafe.php 7 months ago Binary.php 7 months ago EncoderInterface.php 7 months ago Encoding.php 7 months ago Hex.php 7 months ago RFC4648.php 7 months ago
Base64.php
338 lines
1 <?php
2
3 declare (strict_types=1);
4 namespace AmeliaVendor\ParagonIE\ConstantTime;
5
6 use InvalidArgumentException;
7 use RangeException;
8 use SensitiveParameter;
9 use SodiumException;
10 use TypeError;
11 use function extension_loaded;
12 use function pack;
13 use function rtrim;
14 use function sodium_base642bin;
15 use function sodium_bin2base64;
16 use function unpack;
17 use const SODIUM_BASE64_VARIANT_ORIGINAL;
18 use const SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING;
19 use const SODIUM_BASE64_VARIANT_URLSAFE;
20 use const SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING;
21 /**
22 * Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
23 * Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
24 *
25 * Permission is hereby granted, free of charge, to any person obtaining a copy
26 * of this software and associated documentation files (the "Software"), to deal
27 * in the Software without restriction, including without limitation the rights
28 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
29 * copies of the Software, and to permit persons to whom the Software is
30 * furnished to do so, subject to the following conditions:
31 *
32 * The above copyright notice and this permission notice shall be included in all
33 * copies or substantial portions of the Software.
34 *
35 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
36 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
37 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
38 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
39 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
40 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
41 * SOFTWARE.
42 */
43 /**
44 * Class Base64
45 * [A-Z][a-z][0-9]+/
46 *
47 * @package \ParagonIE\ConstantTime
48 */
49 abstract class Base64 implements EncoderInterface
50 {
51 /**
52 * Encode into Base64
53 *
54 * Base64 character set "[A-Z][a-z][0-9]+/"
55 *
56 * @param string $binString
57 * @return string
58 *
59 * @throws TypeError
60 */
61 public static function encode(
62 #[SensitiveParameter]
63 string $binString
64 ): string
65 {
66 if (extension_loaded('sodium')) {
67 switch (static::class) {
68 case Base64::class:
69 $variant = SODIUM_BASE64_VARIANT_ORIGINAL;
70 break;
71 case Base64UrlSafe::class:
72 $variant = SODIUM_BASE64_VARIANT_URLSAFE;
73 break;
74 default:
75 $variant = 0;
76 }
77 if ($variant > 0) {
78 try {
79 return sodium_bin2base64($binString, $variant);
80 } catch (SodiumException $ex) {
81 throw new RangeException($ex->getMessage(), $ex->getCode(), $ex);
82 }
83 }
84 }
85 return static::doEncode($binString, true);
86 }
87 /**
88 * Encode into Base64, no = padding
89 *
90 * Base64 character set "[A-Z][a-z][0-9]+/"
91 *
92 * @param string $src
93 * @return string
94 *
95 * @throws TypeError
96 */
97 public static function encodeUnpadded(
98 #[SensitiveParameter]
99 string $src
100 ): string
101 {
102 if (extension_loaded('sodium')) {
103 switch (static::class) {
104 case Base64::class:
105 $variant = SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING;
106 break;
107 case Base64UrlSafe::class:
108 $variant = SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING;
109 break;
110 default:
111 $variant = 0;
112 }
113 if ($variant > 0) {
114 try {
115 return sodium_bin2base64($src, $variant);
116 } catch (SodiumException $ex) {
117 throw new RangeException($ex->getMessage(), $ex->getCode(), $ex);
118 }
119 }
120 }
121 return static::doEncode($src, false);
122 }
123 /**
124 * @param string $src
125 * @param bool $pad Include = padding?
126 * @return string
127 *
128 * @throws TypeError
129 */
130 protected static function doEncode(
131 #[SensitiveParameter]
132 string $src,
133 bool $pad = true
134 ): string
135 {
136 $dest = '';
137 $srcLen = Binary::safeStrlen($src);
138 // Main loop (no padding):
139 for ($i = 0; $i + 3 <= $srcLen; $i += 3) {
140 /** @var array<int, int> $chunk */
141 $chunk = unpack('C*', Binary::safeSubstr($src, $i, 3));
142 $b0 = $chunk[1];
143 $b1 = $chunk[2];
144 $b2 = $chunk[3];
145 $dest .= static::encode6Bits($b0 >> 2) . static::encode6Bits(($b0 << 4 | $b1 >> 4) & 63) . static::encode6Bits(($b1 << 2 | $b2 >> 6) & 63) . static::encode6Bits($b2 & 63);
146 }
147 // The last chunk, which may have padding:
148 if ($i < $srcLen) {
149 /** @var array<int, int> $chunk */
150 $chunk = unpack('C*', Binary::safeSubstr($src, $i, $srcLen - $i));
151 $b0 = $chunk[1];
152 if ($i + 1 < $srcLen) {
153 $b1 = $chunk[2];
154 $dest .= static::encode6Bits($b0 >> 2) . static::encode6Bits(($b0 << 4 | $b1 >> 4) & 63) . static::encode6Bits($b1 << 2 & 63);
155 if ($pad) {
156 $dest .= '=';
157 }
158 } else {
159 $dest .= static::encode6Bits($b0 >> 2) . static::encode6Bits($b0 << 4 & 63);
160 if ($pad) {
161 $dest .= '==';
162 }
163 }
164 }
165 return $dest;
166 }
167 /**
168 * decode from base64 into binary
169 *
170 * Base64 character set "./[A-Z][a-z][0-9]"
171 *
172 * @param string $encodedString
173 * @param bool $strictPadding
174 * @return string
175 *
176 * @throws RangeException
177 * @throws TypeError
178 */
179 public static function decode(
180 #[SensitiveParameter]
181 string $encodedString,
182 bool $strictPadding = false
183 ): string
184 {
185 // Remove padding
186 $srcLen = Binary::safeStrlen($encodedString);
187 if ($srcLen === 0) {
188 return '';
189 }
190 if ($strictPadding) {
191 if (($srcLen & 3) === 0) {
192 if ($encodedString[$srcLen - 1] === '=') {
193 $srcLen--;
194 if ($encodedString[$srcLen - 1] === '=') {
195 $srcLen--;
196 }
197 }
198 }
199 if (($srcLen & 3) === 1) {
200 throw new RangeException('Incorrect padding');
201 }
202 if ($encodedString[$srcLen - 1] === '=') {
203 throw new RangeException('Incorrect padding');
204 }
205 if (extension_loaded('sodium')) {
206 switch (static::class) {
207 case Base64::class:
208 $variant = SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING;
209 break;
210 case Base64UrlSafe::class:
211 $variant = SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING;
212 break;
213 default:
214 $variant = 0;
215 }
216 if ($variant > 0) {
217 try {
218 return sodium_base642bin(Binary::safeSubstr($encodedString, 0, $srcLen), $variant);
219 } catch (SodiumException $ex) {
220 throw new RangeException($ex->getMessage(), $ex->getCode(), $ex);
221 }
222 }
223 }
224 } else {
225 $encodedString = rtrim($encodedString, '=');
226 $srcLen = Binary::safeStrlen($encodedString);
227 }
228 $err = 0;
229 $dest = '';
230 // Main loop (no padding):
231 for ($i = 0; $i + 4 <= $srcLen; $i += 4) {
232 /** @var array<int, int> $chunk */
233 $chunk = unpack('C*', Binary::safeSubstr($encodedString, $i, 4));
234 $c0 = static::decode6Bits($chunk[1]);
235 $c1 = static::decode6Bits($chunk[2]);
236 $c2 = static::decode6Bits($chunk[3]);
237 $c3 = static::decode6Bits($chunk[4]);
238 $dest .= pack('CCC', ($c0 << 2 | $c1 >> 4) & 0xff, ($c1 << 4 | $c2 >> 2) & 0xff, ($c2 << 6 | $c3) & 0xff);
239 $err |= ($c0 | $c1 | $c2 | $c3) >> 8;
240 }
241 // The last chunk, which may have padding:
242 if ($i < $srcLen) {
243 /** @var array<int, int> $chunk */
244 $chunk = unpack('C*', Binary::safeSubstr($encodedString, $i, $srcLen - $i));
245 $c0 = static::decode6Bits($chunk[1]);
246 if ($i + 2 < $srcLen) {
247 $c1 = static::decode6Bits($chunk[2]);
248 $c2 = static::decode6Bits($chunk[3]);
249 $dest .= pack('CC', ($c0 << 2 | $c1 >> 4) & 0xff, ($c1 << 4 | $c2 >> 2) & 0xff);
250 $err |= ($c0 | $c1 | $c2) >> 8;
251 if ($strictPadding) {
252 $err |= $c2 << 6 & 0xff;
253 }
254 } elseif ($i + 1 < $srcLen) {
255 $c1 = static::decode6Bits($chunk[2]);
256 $dest .= pack('C', ($c0 << 2 | $c1 >> 4) & 0xff);
257 $err |= ($c0 | $c1) >> 8;
258 if ($strictPadding) {
259 $err |= $c1 << 4 & 0xff;
260 }
261 } elseif ($strictPadding) {
262 $err |= 1;
263 }
264 }
265 $check = $err === 0;
266 if (!$check) {
267 throw new RangeException('Base64::decode() only expects characters in the correct base64 alphabet');
268 }
269 return $dest;
270 }
271 /**
272 * @param string $encodedString
273 * @return string
274 */
275 public static function decodeNoPadding(
276 #[SensitiveParameter]
277 string $encodedString
278 ): string
279 {
280 $srcLen = Binary::safeStrlen($encodedString);
281 if ($srcLen === 0) {
282 return '';
283 }
284 if (($srcLen & 3) === 0) {
285 // If $strLen is not zero, and it is divisible by 4, then it's at least 4.
286 if ($encodedString[$srcLen - 1] === '=' || $encodedString[$srcLen - 2] === '=') {
287 throw new InvalidArgumentException("decodeNoPadding() doesn't tolerate padding");
288 }
289 }
290 return static::decode($encodedString, true);
291 }
292 /**
293 * Uses bitwise operators instead of table-lookups to turn 6-bit integers
294 * into 8-bit integers.
295 *
296 * Base64 character set:
297 * [A-Z] [a-z] [0-9] + /
298 * 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f
299 *
300 * @param int $src
301 * @return int
302 */
303 protected static function decode6Bits(int $src): int
304 {
305 $ret = -1;
306 // if ($src > 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64
307 $ret += (0x40 - $src & $src - 0x5b) >> 8 & $src - 64;
308 // if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70
309 $ret += (0x60 - $src & $src - 0x7b) >> 8 & $src - 70;
310 // if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5
311 $ret += (0x2f - $src & $src - 0x3a) >> 8 & $src + 5;
312 // if ($src == 0x2b) $ret += 62 + 1;
313 $ret += (0x2a - $src & $src - 0x2c) >> 8 & 63;
314 // if ($src == 0x2f) ret += 63 + 1;
315 $ret += (0x2e - $src & $src - 0x30) >> 8 & 64;
316 return $ret;
317 }
318 /**
319 * Uses bitwise operators instead of table-lookups to turn 8-bit integers
320 * into 6-bit integers.
321 *
322 * @param int $src
323 * @return string
324 */
325 protected static function encode6Bits(int $src): string
326 {
327 $diff = 0x41;
328 // if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6
329 $diff += 25 - $src >> 8 & 6;
330 // if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75
331 $diff -= 51 - $src >> 8 & 75;
332 // if ($src > 61) $diff += 0x2b - 0x30 - 10; // -15
333 $diff -= 61 - $src >> 8 & 15;
334 // if ($src > 62) $diff += 0x2f - 0x2b - 1; // 3
335 $diff += 62 - $src >> 8 & 3;
336 return pack('C', $src + $diff);
337 }
338 }