mirror of
https://github.com/aljazceru/python-teos.git
synced 2025-12-17 14:14:22 +01:00
41 lines
1.4 KiB
Python
41 lines
1.4 KiB
Python
import re
|
|
from hashlib import sha256
|
|
from binascii import hexlify, unhexlify
|
|
from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305
|
|
|
|
from apps.cli import logger
|
|
|
|
|
|
class Blob:
|
|
def __init__(self, data):
|
|
if type(data) is not str or re.search(r"^[0-9A-Fa-f]+$", data) is None:
|
|
raise ValueError("Non-Hex character found in txid.")
|
|
|
|
self.data = data
|
|
|
|
def encrypt(self, tx_id):
|
|
if len(tx_id) != 64:
|
|
raise ValueError("txid does not matches the expected size (32-byte / 64 hex chars).")
|
|
|
|
elif re.search(r"^[0-9A-Fa-f]+$", tx_id) is None:
|
|
raise ValueError("Non-Hex character found in txid.")
|
|
|
|
# Transaction to be encrypted
|
|
# FIXME: The blob data should contain more things that just the transaction. Leaving like this for now.
|
|
tx = unhexlify(self.data)
|
|
|
|
# sk is the H(txid) (32-byte) and nonce is set to 0 (12-byte)
|
|
sk = sha256(unhexlify(tx_id)).digest()
|
|
nonce = bytearray(12)
|
|
|
|
# Encrypt the data
|
|
cipher = ChaCha20Poly1305(sk)
|
|
encrypted_blob = cipher.encrypt(nonce=nonce, data=tx, associated_data=None)
|
|
encrypted_blob = hexlify(encrypted_blob).decode()
|
|
|
|
logger.info(
|
|
"Creating new blob", sk=hexlify(sk).decode(), nonce=hexlify(nonce).decode(), encrypted_blob=encrypted_blob
|
|
)
|
|
|
|
return encrypted_blob
|