$secret, 'issuer' => $issuer, 'algorithm' => 'SHA1', 'digits' => self::DIGITS, 'period' => self::PERIOD, ]); return "otpauth://totp/$label?$params"; } private static function base32Decode($b32) { $b32 = strtoupper(rtrim($b32, '=')); $buffer = 0; $bitsLeft = 0; $out = ''; for ($i = 0; $i < strlen($b32); $i++) { $val = strpos(self::BASE32, $b32[$i]); if ($val === false) continue; $buffer = ($buffer << 5) | $val; $bitsLeft += 5; if ($bitsLeft >= 8) { $bitsLeft -= 8; $out .= chr(($buffer >> $bitsLeft) & 0xFF); } } return $out; } }