# test_secret_exhaustive.py
import jwt as pyjwt, base64, hashlib, hmac, struct

TOKEN = "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbkBjYW1lbC1zb2Z0LmNvbSIsImlzQ3VzdG9tZXIiOmZhbHNlLCJjb21wYW55SWQiOjUsImNyZWF0ZWQiOjE3Nzk1NzE4MzQ0NjQsImlzU3VwZXJBZG1pbiI6ZmFsc2UsInRlbmFudFNjaGVtYSI6ImNvbXBhbnlfNSIsImV4cCI6MTc3OTY1ODIzNH0.5n-b6cYA-1C7w-EE43zQTxbuP2nZnyq7lPpLAvH-_deCYmGyTh-ElUAT4hgr3sB6bZz0ujC1nbzUrt0kZlri0Q"
RAW = "camelsoft3200"

def try_decode(name, secret):
    try:
        if isinstance(secret, str):
            secret = secret.encode("utf-8")
        p = pyjwt.decode(TOKEN, secret, algorithms=["HS512"])
        print(f"✅ [{name}] FONCTIONNE — tenant={p.get('tenantSchema')}")
        return secret
    except pyjwt.ExpiredSignatureError:
        print(f"⚠️  [{name}] Token expiré MAIS signature valide ← UTILISER CELUI-CI")
        return secret
    except Exception as e:
        print(f"❌ [{name}] {e}")
        return None

# 1. Raw UTF-8
try_decode("raw UTF-8", RAW)

# 2. JJWT simulation : prend les 12 premiers chars (multiples de 4) et décode
try_decode("b64 12chars", base64.b64decode(RAW[:12] + "="))

# 3. Standard b64 avec padding forcé
for extra in ["", "=", "==", "==="]:
    try:
        try_decode(f"b64+'{extra}'", base64.b64decode(RAW + extra))
    except: pass

# 4. URL-safe b64
for extra in ["", "=", "==", "==="]:
    try:
        try_decode(f"urlsafe+'{extra}'", base64.urlsafe_b64decode(RAW + extra))
    except: pass

# 5. Hex
try:
    try_decode("hex", bytes.fromhex(RAW))
except: pass

# 6. UTF-16
try_decode("UTF-16 LE", RAW.encode("utf-16-le"))
try_decode("UTF-16 BE", RAW.encode("utf-16-be"))

# 7. MIME base64 lenient — ignore dernier char invalide
try_decode("b64 12chars urlsafe", base64.urlsafe_b64decode(RAW[:12] + "="))

# 8. JJWT TextCodec.BASE64 exact simulation
# DatatypeConverter traite "camelsoft3200" → ignore le dernier '0' seul
try_decode("JJWT simulation (12 chars)", base64.b64decode("camelsoft320="))

print("\n--- Vérification token header ---")
import json
header = TOKEN.split(".")[0]
pad = 4 - len(header) % 4
print(json.dumps(json.loads(base64.urlsafe_b64decode(header + "=" * pad)), indent=2))