All checks were successful
The build was successful.
In most (all?) modern OOP languages class members visibility is assumed to be private and programmer has to consciously set it to public or protected. PHP has the different approach what can cause a security flaws in written scripts. AerScript will not follow this way, as it seems to be conceptually broken.
76 lines
2.7 KiB
Plaintext
76 lines
2.7 KiB
Plaintext
class Base32 {
|
|
private static char[] $map = {
|
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
|
|
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
|
|
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
|
|
'Y', 'Z', '2', '3', '4', '5', '6', '7',
|
|
'='
|
|
};
|
|
|
|
private static int[] $flippedMap = {
|
|
'A'=>0, 'B'=>1, 'C'=>2, 'D'=>3, 'E'=>4, 'F'=>5, 'G'=>6, 'H'=>7,
|
|
'I'=>8, 'J'=>9, 'K'=>10, 'L'=>11, 'M'=>12, 'N'=>13, 'O'=>14, 'P'=>15,
|
|
'Q'=>16, 'R'=>17, 'S'=>18, 'T'=>19, 'U'=>20, 'V'=>21, 'W'=>22, 'X'=>23,
|
|
'Y'=>24, 'Z'=>25, '2'=>26, '3'=>27, '4'=>28, '5'=>29, '6'=>30, '7'=>31
|
|
};
|
|
|
|
public static string encode(string $input, bool $padding = true) {
|
|
if(!$input) return '';
|
|
char[] $aInput = str_split($input);
|
|
string $binaryString = '';
|
|
for(int $i = 0; $i < sizeof($aInput); $i++) {
|
|
$binaryString += str_pad(base_convert(ord($aInput[$i]), 10, 2), 8, '0', STR_PAD_LEFT);
|
|
}
|
|
string[] $fiveBitBinaryArray = str_split($binaryString, 5);
|
|
string $base32 = '';
|
|
$i = 0;
|
|
while($i < sizeof($fiveBitBinaryArray)) {
|
|
$base32 += self::$map[base_convert(str_pad($fiveBitBinaryArray[$i], 5,'0'), 2, 10)];
|
|
$i++;
|
|
}
|
|
int $x;
|
|
if($padding && ($x = strlen($binaryString) % 40) != 0) {
|
|
if($x == 8) $base32 += str_repeat(self::$map[32], 6);
|
|
else if($x == 16) $base32 += str_repeat(self::$map[32], 4);
|
|
else if($x == 24) $base32 += str_repeat(self::$map[32], 3);
|
|
else if($x == 32) $base32 += self::$map[32];
|
|
}
|
|
return $base32;
|
|
}
|
|
|
|
public static string decode(string $input) {
|
|
if(!$input) return '';
|
|
int $paddingCharCount = substr_count($input, self::$map[32]);
|
|
int[] $allowedValues = {6, 4, 3, 1, 0};
|
|
if(!in_array($paddingCharCount, $allowedValues)) return NULL;
|
|
for(int $i = 0; $i < 4; $i++) {
|
|
if($paddingCharCount == $allowedValues[$i] && substr($input, -($allowedValues[$i])) != str_repeat(self::$map[32], $allowedValues[$i]))
|
|
return false;
|
|
}
|
|
$input = str_replace('=','', $input);
|
|
char[] $aInput = str_split($input);
|
|
string $binaryString = '';
|
|
for($i = 0; $i < sizeof($aInput); $i = $i + 8) {
|
|
string $x = '';
|
|
if(!in_array($input[$i], self::$map))
|
|
return false;
|
|
for(int $j = 0; $j < 8; $j++) {
|
|
$x += str_pad(base_convert(self::$flippedMap[$input[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT);
|
|
}
|
|
string[] $eightBits = str_split($x, 8);
|
|
for(int $z = 0; $z < sizeof($eightBits); $z++) {
|
|
char $y;
|
|
$binaryString += (($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48) ? $y : '';
|
|
}
|
|
}
|
|
return $binaryString;
|
|
}
|
|
}
|
|
|
|
class Program {
|
|
public void main() {
|
|
var_dump(Base32::encode('Test String'), Base32::encode('DS27DEC985'), Base32::encode('AerScript rocks!'));
|
|
var_dump(Base32::decode('KRSXG5BAKN2HE2LOM4======'), Base32::decode('IRJTEN2EIVBTSOBV'), Base32::decode('IFSXEU3DOJUXA5BAOJXWG23TEE======'));
|
|
}
|
|
}
|