secretKey), true); $offset = ord($hash[strlen($hash) - 1]) & 0x0F; $bin = 0; $bin |= (ord($hash[$offset]) & 0x7F) << 24; $bin |= (ord($hash[$offset + 1]) & 0xFF) << 16; $bin |= (ord($hash[$offset + 2]) & 0xFF) << 8; $bin |= (ord($hash[$offset + 3]) & 0xFF); $otp = $bin % pow(10, self::DIGITS); return str_pad((string)$otp, self::DIGITS, '0', STR_PAD_LEFT); } public function generateRange(int $range = 1, ?int $timecode = null): array { if($range < 1) throw new InvalidArgumentException('$range must be greater than 0.'); $timecode ??= self::timecode(); $tokens = [$this->generate($timecode)]; for($i = 1; $i <= $range; ++$i) $tokens[] = $this->generate($timecode - $i); for($i = 1; $i <= $range; ++$i) $tokens[] = $this->generate($timecode + $i); return $tokens; } }