116 lines
3.5 KiB
Python
116 lines
3.5 KiB
Python
from pathlib import Path
|
|
from typing import List
|
|
|
|
from blspy import AugSchemeMPL
|
|
|
|
from chia.util.ints import uint32
|
|
from chia.util.keychain import Keychain
|
|
from chia.util.validate_alert import create_alert_file, create_not_ready_alert_file, validate_alert_file
|
|
|
|
bitcoin_hash = None
|
|
bram_message = None
|
|
|
|
status = None
|
|
while True:
|
|
status_input = input("What is the status of this alert? (ready/not ready)").lower()
|
|
if status_input == "ready":
|
|
status = True
|
|
break
|
|
elif status_input == "not ready":
|
|
status = False
|
|
break
|
|
else:
|
|
print("Unknown input")
|
|
|
|
keychain: Keychain = Keychain()
|
|
print("\n___________ SELECT KEY ____________")
|
|
|
|
private_keys = keychain.get_all_private_keys()
|
|
if len(private_keys) == 0:
|
|
print("There are no saved private keys.")
|
|
quit()
|
|
print("Showing all private keys:")
|
|
for sk, seed in private_keys:
|
|
print("\nFingerprint:", sk.get_g1().get_fingerprint())
|
|
|
|
selected_key = None
|
|
while True:
|
|
user_input = input("\nEnter fingerprint of the key you want to use, or enter Q to quit: ").lower()
|
|
if user_input == "q":
|
|
quit()
|
|
for sk, seed in private_keys:
|
|
fingerprint = sk.get_g1().get_fingerprint()
|
|
pub = sk.get_g1()
|
|
if int(user_input) == fingerprint:
|
|
print(f"Selected: {fingerprint}")
|
|
selected_key = sk
|
|
break
|
|
|
|
if selected_key is not None:
|
|
break
|
|
|
|
print("\n___________ HD PATH ____________")
|
|
while True:
|
|
hd_path = input("Enter the HD path in the form 'm/12381/8444/n/n', or enter Q to quit: ").lower()
|
|
if hd_path == "q":
|
|
quit()
|
|
verify = input(f"Is this correct path: {hd_path}? (y/n) ").lower()
|
|
if verify == "y":
|
|
break
|
|
|
|
|
|
k = Keychain()
|
|
private_keys = k.get_all_private_keys()
|
|
path: List[uint32] = [uint32(int(i)) for i in hd_path.split("/") if i != "m"]
|
|
|
|
# Derive HD key using path form input
|
|
for c in path:
|
|
selected_key = AugSchemeMPL.derive_child_sk(selected_key, c)
|
|
print("Public key:", selected_key.get_g1())
|
|
|
|
# get file path
|
|
file_path = None
|
|
while True:
|
|
file_path = input("Enter the path where you want to save signed alert file, or q to quit: ")
|
|
if file_path == "q" or file_path == "Q":
|
|
quit()
|
|
file_path = file_path.strip()
|
|
y_n = input(f"Is this correct path (y/n)?: {file_path} ").lower()
|
|
if y_n == "y":
|
|
break
|
|
f_path: Path = Path(file_path)
|
|
|
|
if status is True:
|
|
print("")
|
|
print("___________ BITCOIN BLOCK HASH ____________")
|
|
while True:
|
|
bitcoin_hash = input("Insert Bitcoin block hash: ")
|
|
print(f"Bitcoin block hash = {bitcoin_hash}")
|
|
y_n = input("Does this look good (y/n): ").lower()
|
|
if y_n == "y":
|
|
break
|
|
|
|
print("")
|
|
print("___________ BRAM MESSAGE ____________")
|
|
while True:
|
|
bram_message = input("Insert message from Bram: ")
|
|
print(f"Bram message = {bram_message}")
|
|
y_n = input("Does this look good (y/n): ").lower()
|
|
if y_n == "y":
|
|
break
|
|
|
|
genesis_challenge_preimage = f"bitcoin_hash:{bitcoin_hash},bram_message:{bram_message}"
|
|
|
|
create_alert_file(f_path, selected_key, genesis_challenge_preimage)
|
|
print(f"Alert written to file {f_path}")
|
|
pubkey = f"{bytes(selected_key.get_g1()).hex()}"
|
|
validated = validate_alert_file(f_path, pubkey)
|
|
if validated:
|
|
print(f"Signature has passed validation for pubkey: {pubkey}")
|
|
else:
|
|
print(f"Signature has failed validation for pubkey: {pubkey}")
|
|
assert False
|
|
else:
|
|
create_not_ready_alert_file(f_path, selected_key)
|
|
print(f"Alert written to file {f_path}")
|