import os, base64, json
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import ec
def stringify_transaction_details():
transaction_details = {
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
return json.dumps(transaction_details, sort_keys=True, separators=(',', ':'))
def sign_transaction_details(details, user):
with open(os.path.join("keys", user + ".private.pem"), "rb") as private_key_in:
ec_private_key = serialization.load_pem_private_key(private_key_in.read(),
password=None,
backend=default_backend())
signed_payload = ec_private_key.sign(str.encode(details), ec.ECDSA(hashes.SHA256()))
b64_signed_payload = base64.b64encode(signed_payload).decode('UTF-8')
return b64_signed_payload
def create_transaction_payload(details, signature):
payload = {
"request": json.loads(details),
"signature": signature # this is signature of the json i.e. transaction_details
}
}
return json.dumps(payload, sort_keys=True, separators=(',', ':'))
if __name__ == "__main__":
stringified_details = stringify_transaction_details()
user_signature = sign_transaction_details(stringified_details, "api-maker@zodia.io")
transaction_payload = create_transaction_payload(stringified_details, user_signature)
print(transaction_payload)