1200) { return false; } $url = strtoupper($url); $data = pack('N', strlen($token)) . $token . pack('N', strlen($url)) . $url . pack('N', 8) . pack('J', $ticks); return $this->verify($keys, '', $proof, $data) || $this->verify($keys, '', $oldProof, $data) || $this->verify($keys, 'old', $proof, $data); } private function verify(array $keys, string $prefix, string $signature, string $data): bool { $signature = base64_decode($signature, true); $modulus = base64_decode($keys[$prefix . 'modulus'] ?? '', true); $exponent = base64_decode($keys[$prefix . 'exponent'] ?? '', true); if (!$signature || !$modulus || !$exponent || strlen($modulus) > 1024 || strlen($exponent) > 8) { return false; } try { $key = RSA::loadPublicKey(['n' => new BigInteger($modulus, 256), 'e' => new BigInteger($exponent, 256)]); return $key->withPadding(RSA::SIGNATURE_PKCS1)->withHash('sha256')->verify($data, $signature); } catch (\Throwable) { return false; } } }