Original.php in Automatic Updates 8
File
vendor/paragonie/sodium_compat/src/Core/Base64/Original.php
View source
<?php
class ParagonIE_Sodium_Core_Base64_Original {
public static function encode($src) {
return self::doEncode($src, true);
}
public static function encodeUnpadded($src) {
return self::doEncode($src, false);
}
protected static function doEncode($src, $pad = true) {
$dest = '';
$srcLen = ParagonIE_Sodium_Core_Util::strlen($src);
for ($i = 0; $i + 3 <= $srcLen; $i += 3) {
$chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 3));
$b0 = $chunk[1];
$b1 = $chunk[2];
$b2 = $chunk[3];
$dest .= self::encode6Bits($b0 >> 2) . self::encode6Bits(($b0 << 4 | $b1 >> 4) & 63) . self::encode6Bits(($b1 << 2 | $b2 >> 6) & 63) . self::encode6Bits($b2 & 63);
}
if ($i < $srcLen) {
$chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i));
$b0 = $chunk[1];
if ($i + 1 < $srcLen) {
$b1 = $chunk[2];
$dest .= self::encode6Bits($b0 >> 2) . self::encode6Bits(($b0 << 4 | $b1 >> 4) & 63) . self::encode6Bits($b1 << 2 & 63);
if ($pad) {
$dest .= '=';
}
}
else {
$dest .= self::encode6Bits($b0 >> 2) . self::encode6Bits($b0 << 4 & 63);
if ($pad) {
$dest .= '==';
}
}
}
return $dest;
}
public static function decode($src, $strictPadding = false) {
$srcLen = ParagonIE_Sodium_Core_Util::strlen($src);
if ($srcLen === 0) {
return '';
}
if ($strictPadding) {
if (($srcLen & 3) === 0) {
if ($src[$srcLen - 1] === '=') {
$srcLen--;
if ($src[$srcLen - 1] === '=') {
$srcLen--;
}
}
}
if (($srcLen & 3) === 1) {
throw new RangeException('Incorrect padding');
}
if ($src[$srcLen - 1] === '=') {
throw new RangeException('Incorrect padding');
}
}
else {
$src = rtrim($src, '=');
$srcLen = ParagonIE_Sodium_Core_Util::strlen($src);
}
$err = 0;
$dest = '';
for ($i = 0; $i + 4 <= $srcLen; $i += 4) {
$chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 4));
$c0 = self::decode6Bits($chunk[1]);
$c1 = self::decode6Bits($chunk[2]);
$c2 = self::decode6Bits($chunk[3]);
$c3 = self::decode6Bits($chunk[4]);
$dest .= pack('CCC', ($c0 << 2 | $c1 >> 4) & 0xff, ($c1 << 4 | $c2 >> 2) & 0xff, ($c2 << 6 | $c3) & 0xff);
$err |= ($c0 | $c1 | $c2 | $c3) >> 8;
}
if ($i < $srcLen) {
$chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i));
$c0 = self::decode6Bits($chunk[1]);
if ($i + 2 < $srcLen) {
$c1 = self::decode6Bits($chunk[2]);
$c2 = self::decode6Bits($chunk[3]);
$dest .= pack('CC', ($c0 << 2 | $c1 >> 4) & 0xff, ($c1 << 4 | $c2 >> 2) & 0xff);
$err |= ($c0 | $c1 | $c2) >> 8;
}
elseif ($i + 1 < $srcLen) {
$c1 = self::decode6Bits($chunk[2]);
$dest .= pack('C', ($c0 << 2 | $c1 >> 4) & 0xff);
$err |= ($c0 | $c1) >> 8;
}
elseif ($i < $srcLen && $strictPadding) {
$err |= 1;
}
}
$check = $err === 0;
if (!$check) {
throw new RangeException('Base64::decode() only expects characters in the correct base64 alphabet');
}
return $dest;
}
protected static function decode6Bits($src) {
$ret = -1;
$ret += (0x40 - $src & $src - 0x5b) >> 8 & $src - 64;
$ret += (0x60 - $src & $src - 0x7b) >> 8 & $src - 70;
$ret += (0x2f - $src & $src - 0x3a) >> 8 & $src + 5;
$ret += (0x2a - $src & $src - 0x2c) >> 8 & 63;
$ret += (0x2e - $src & $src - 0x30) >> 8 & 64;
return $ret;
}
protected static function encode6Bits($src) {
$diff = 0x41;
$diff += 25 - $src >> 8 & 6;
$diff -= 51 - $src >> 8 & 75;
$diff -= 61 - $src >> 8 & 15;
$diff += 62 - $src >> 8 & 3;
return pack('C', $src + $diff);
}
}