#!/usr/bin/env python3

from base64 import b64decode
from hashlib import pbkdf2_hmac

from Crypto.Cipher import AES

#TODO perhaps load the vault from tools/2hashcat_tests/metamask/metamask2hashcat.json similar as in tools/2hashcat_tests/metamask2hashcat.py
vault = {"data":"R95fzGt4UQ0uwrcrVYnIi4UcSlWn9wlmer+//526ZDwYAp50K82F1u1oacYcdjjhuEvbZnWk/uBG00UkgLLlO3WbINljqmu2QWdDEwjTgo/qWR6MU9d/82rxNiONHQE8UrZ8SV+htVr6XIB0ze3aCV0E+fwI93EeP79ZeDxuOEhuHoiYT0bHWMv5nA48AdluG4DbOo7SrDAWBVCBsEdXsOfYsS3/TIh0a/iFCMX4uhxY2824JwcWp4H36SFWyBYMZCJ3/U4DYFbbjWZtGRthoJlIik5BJq4FLu3Y1jEgza0AWlAvu4MKTEqrYSpUIghfxf1a1f+kPvxsHNq0as0kRwCXu09DObbdsiggbmeoBkxMZiFq0d9ar/3Gon0r3hfc3c124Wlivzbzu1JcZ3wURhLSsUS7b5cfG86aXHJkxmQDA5urBz6lw3bsIvlEUB2ErkQy/zD+cPwCG1Rs/WKt7KNh45lppCUkHccbf+xlpdc8OfUwj01Xp7BdH8LMR7Vx1C4hZCvSdtURVl0VaAMxHDX0MjRkwmqS","iv":"h+BoIf2CQ5BEjaIOShFE7g==","salt":"jfGI3TXguhb8GPnKSXFrMzRk2NCEc131Gt5G3kZr5+s="}
password = "hashcat1"

salt = b64decode(vault["salt"])
key = pbkdf2_hmac("sha256", password.encode(), salt, 10_000)

iv = b64decode(vault["iv"])
payload = b64decode(vault["data"])
ciphertext = payload[:-16]
print(f"ciphertext.hex()={ciphertext.hex()[0:128]}")
tag = payload[-16:]

cipher = AES.new(key, AES.MODE_GCM, nonce=iv)
plaintext = cipher.decrypt(ciphertext)

print(plaintext.hex()[0:128])
print(str(plaintext[0:128]))

print()
try:
    cipher.verify(tag)
    print("The message is authentic:", plaintext.decode())
except ValueError:
    print("Key incorrect or message corrupted")
print()

cipher = AES.new(key, AES.MODE_GCM, nonce=iv)
plaintext = cipher.decrypt(ciphertext[:32])
print("Partially encrypted message (32 bytes):", plaintext.decode())

cipher = AES.new(key, AES.MODE_GCM, nonce=iv)
plaintext = cipher.decrypt(ciphertext[:450])
print("Partially encrypted message (450 bytes):", plaintext.decode())
