import hashlib import json import time import uuid from lib.contract import Contract from cryptography.fernet import Fernet import rsa class Transaction: def __init__(self): self.id = None self.data = None self.hash_value = None self.locked = False self.timestamp = 0 self.sender = None self.receiver = None def from_serialized(self, jsonobj: str): obj = json.loads(jsonobj) self.id = obj['id'] self.data = obj['data'] self.timestamp = obj['timestamp'] self.sender = obj['sender'] self.receiver = obj['receiver'] def set_serialized_contract(self, serialized): if not self.locked: self.id = str(uuid.uuid1()) self.data = serialized self.log('Serialized contract set') return True return False def set_contract(self, contract: Contract): if not self.locked: self.id = str(uuid.uuid1()) self.data = contract.serialize() self.log(f'Contract set: {contract.id} | {contract.title}') return True return False def serialize(self, out_json=False): obj = { 'id': self.id, 'timestamp': self.timestamp, 'data': self.data, 'sender': self.sender, 'receiver': self.receiver } self.log(f'Serialized') if out_json: return json.dumps(obj, sort_keys=True) return obj def lock_hash_finish(self): if not self.locked: self.timestamp = int(time.time()) self.locked = True self.hash() self.log('Locked') return True return False def file_open(file): key_file = open(file, 'rb') key_data = key_file.read() key_file.close() return key_data def hash(self): string_object = json.dumps(self.data, sort_keys=True) block_string = string_object.encode() # open the public key file pubkey = rsa.PublicKey.load_pkcs1(file_open('publickey.key')) #Sender public key - input field neccessary # create the cipher cipher = Fernet(pubkey) # encrypt the data encrypted_data = cipher.encrypt(block_string) #these lines only neccessary for key_encryption - solve the problem of bytes # open the symmetric key file for encryoting the file #skey = open('symmetric.key','rb') #key = skey.read() # encrypt the symmetric key file with the public key #encrypted_key = rsa.encrypt(key,pubkey) self.hash_value = encrypted_data self.log(f'Hashed: {self.hash_value}') return encrypted_data def log(self, text): print(f'[ TRANS ] {text}')