mirror of
https://github.com/aljazceru/python-teos.git
synced 2026-02-09 08:34:27 +01:00
Removes hash/cipher configuration and changes AESGCM128 for CHACHA20POLY1305
Updates tests accordingly
This commit is contained in:
@@ -79,7 +79,7 @@ def get_appointment():
|
||||
response = []
|
||||
|
||||
# ToDo: #15-add-system-monitor
|
||||
if not isinstance(locator, str) or len(locator) != 64:
|
||||
if not isinstance(locator, str) or len(locator) != 32:
|
||||
response.append({"locator": locator, "status": "not_found"})
|
||||
return jsonify(response)
|
||||
|
||||
|
||||
@@ -6,16 +6,12 @@ from pisa.encrypted_blob import EncryptedBlob
|
||||
# Basic appointment structure
|
||||
class Appointment:
|
||||
# DISCUSS: 35-appointment-checks
|
||||
def __init__(
|
||||
self, locator, start_time, end_time, dispute_delta, encrypted_blob, cipher, hash_function, triggered=False
|
||||
):
|
||||
def __init__(self, locator, start_time, end_time, dispute_delta, encrypted_blob, triggered=False):
|
||||
self.locator = locator
|
||||
self.start_time = start_time # ToDo: #4-standardize-appointment-fields
|
||||
self.end_time = end_time # ToDo: #4-standardize-appointment-fields
|
||||
self.dispute_delta = dispute_delta
|
||||
self.encrypted_blob = EncryptedBlob(encrypted_blob)
|
||||
self.cipher = cipher
|
||||
self.hash_function = hash_function
|
||||
self.triggered = triggered
|
||||
|
||||
@classmethod
|
||||
@@ -25,30 +21,14 @@ class Appointment:
|
||||
end_time = appointment_data.get("end_time") # ToDo: #4-standardize-appointment-fields
|
||||
dispute_delta = appointment_data.get("dispute_delta")
|
||||
encrypted_blob_data = appointment_data.get("encrypted_blob")
|
||||
cipher = appointment_data.get("cipher")
|
||||
hash_function = appointment_data.get("hash_function")
|
||||
|
||||
triggered = True if appointment_data.get("triggered") is True else False
|
||||
|
||||
if any(
|
||||
v is None
|
||||
for v in [
|
||||
locator,
|
||||
start_time,
|
||||
end_time,
|
||||
dispute_delta,
|
||||
encrypted_blob_data,
|
||||
cipher,
|
||||
hash_function,
|
||||
triggered,
|
||||
]
|
||||
):
|
||||
if any(v is None for v in [locator, start_time, end_time, dispute_delta, encrypted_blob_data, triggered]):
|
||||
raise ValueError("Wrong appointment data, some fields are missing")
|
||||
|
||||
else:
|
||||
appointment = cls(
|
||||
locator, start_time, end_time, dispute_delta, encrypted_blob_data, cipher, hash_function, triggered
|
||||
)
|
||||
appointment = cls(locator, start_time, end_time, dispute_delta, encrypted_blob_data, triggered)
|
||||
|
||||
return appointment
|
||||
|
||||
@@ -60,8 +40,6 @@ class Appointment:
|
||||
"end_time": self.end_time,
|
||||
"dispute_delta": self.dispute_delta,
|
||||
"encrypted_blob": self.encrypted_blob.data,
|
||||
"cipher": self.cipher,
|
||||
"hash_function": self.hash_function,
|
||||
"triggered": self.triggered,
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
from hashlib import sha256
|
||||
from binascii import unhexlify, hexlify
|
||||
from cryptography.exceptions import InvalidTag
|
||||
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
|
||||
from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305
|
||||
|
||||
from pisa.logger import Logger
|
||||
|
||||
@@ -23,24 +23,19 @@ class Cryptographer:
|
||||
)
|
||||
return None
|
||||
|
||||
# master_key = H(tx_id | tx_id)
|
||||
key = unhexlify(key)
|
||||
master_key = sha256(key + key).digest()
|
||||
|
||||
# The 16 MSB of the master key will serve as the AES GCM 128 secret key. The 16 LSB will serve as the IV.
|
||||
sk = master_key[:16]
|
||||
nonce = master_key[16:]
|
||||
# sk is the H(txid) (32-byte) and nonce is set to 0 (12-byte)
|
||||
sk = sha256(unhexlify(key)).digest()
|
||||
nonce = bytearray(12)
|
||||
|
||||
logger.info(
|
||||
"Creating new blob.",
|
||||
master_key=hexlify(master_key).decode(),
|
||||
sk=hexlify(sk).decode(),
|
||||
nonce=hexlify(nonce).decode(),
|
||||
encrypted_blob=encrypted_blob.data,
|
||||
)
|
||||
|
||||
# Decrypt
|
||||
cipher = AESGCM(sk)
|
||||
cipher = ChaCha20Poly1305(sk)
|
||||
data = unhexlify(encrypted_blob.data.encode())
|
||||
|
||||
try:
|
||||
|
||||
@@ -1,20 +1,5 @@
|
||||
from pisa.conf import SUPPORTED_CIPHERS, SUPPORTED_HASH_FUNCTIONS
|
||||
|
||||
|
||||
class EncryptedBlob:
|
||||
def __init__(self, data, cipher="AES-GCM-128", hash_function="SHA256"):
|
||||
if cipher in SUPPORTED_CIPHERS:
|
||||
self.cipher = cipher
|
||||
|
||||
else:
|
||||
raise ValueError("Cipher not supported")
|
||||
|
||||
if hash_function in SUPPORTED_HASH_FUNCTIONS:
|
||||
self.hash_function = hash_function
|
||||
|
||||
else:
|
||||
raise ValueError("Hash function not supported")
|
||||
|
||||
def __init__(self, data):
|
||||
self.data = data
|
||||
|
||||
def __eq__(self, other):
|
||||
|
||||
@@ -6,8 +6,6 @@ APPOINTMENT_WRONG_FIELD_FORMAT = -4
|
||||
APPOINTMENT_FIELD_TOO_SMALL = -5
|
||||
APPOINTMENT_FIELD_TOO_BIG = -6
|
||||
APPOINTMENT_WRONG_FIELD = -7
|
||||
APPOINTMENT_CIPHER_NOT_SUPPORTED = -8
|
||||
APPOINTMENT_HASH_FUNCTION_NOT_SUPPORTED = -9
|
||||
APPOINTMENT_INVALID_SIGNATURE = -10
|
||||
|
||||
# Custom RPC errors
|
||||
|
||||
@@ -37,10 +37,6 @@ class Inspector:
|
||||
rcode, message = self.check_delta(appt.get("dispute_delta"))
|
||||
if rcode == 0:
|
||||
rcode, message = self.check_blob(appt.get("encrypted_blob"))
|
||||
if rcode == 0:
|
||||
rcode, message = self.check_cipher(appt.get("cipher"))
|
||||
if rcode == 0:
|
||||
rcode, message = self.check_hash_function(appt.get("hash_function"))
|
||||
if rcode == 0:
|
||||
rcode, message = self.check_appointment_signature(appt, signature, public_key)
|
||||
|
||||
@@ -68,7 +64,7 @@ class Inspector:
|
||||
rcode = errors.APPOINTMENT_WRONG_FIELD_TYPE
|
||||
message = "wrong locator data type ({})".format(type(locator))
|
||||
|
||||
elif len(locator) != 64:
|
||||
elif len(locator) != 32:
|
||||
rcode = errors.APPOINTMENT_WRONG_FIELD_SIZE
|
||||
message = "wrong locator size ({})".format(len(locator))
|
||||
# TODO: #12-check-txid-regexp
|
||||
@@ -200,54 +196,6 @@ class Inspector:
|
||||
|
||||
return rcode, message
|
||||
|
||||
@staticmethod
|
||||
def check_cipher(cipher):
|
||||
message = None
|
||||
rcode = 0
|
||||
|
||||
t = type(cipher)
|
||||
|
||||
if cipher is None:
|
||||
rcode = errors.APPOINTMENT_EMPTY_FIELD
|
||||
message = "empty cipher received"
|
||||
|
||||
elif t != str:
|
||||
rcode = errors.APPOINTMENT_WRONG_FIELD_TYPE
|
||||
message = "wrong cipher data type ({})".format(t)
|
||||
|
||||
elif cipher.upper() not in conf.SUPPORTED_CIPHERS:
|
||||
rcode = errors.APPOINTMENT_CIPHER_NOT_SUPPORTED
|
||||
message = "cipher not supported: {}".format(cipher)
|
||||
|
||||
if message is not None:
|
||||
logger.error(message)
|
||||
|
||||
return rcode, message
|
||||
|
||||
@staticmethod
|
||||
def check_hash_function(hash_function):
|
||||
message = None
|
||||
rcode = 0
|
||||
|
||||
t = type(hash_function)
|
||||
|
||||
if hash_function is None:
|
||||
rcode = errors.APPOINTMENT_EMPTY_FIELD
|
||||
message = "empty hash_function received"
|
||||
|
||||
elif t != str:
|
||||
rcode = errors.APPOINTMENT_WRONG_FIELD_TYPE
|
||||
message = "wrong hash_function data type ({})".format(t)
|
||||
|
||||
elif hash_function.upper() not in conf.SUPPORTED_HASH_FUNCTIONS:
|
||||
rcode = errors.APPOINTMENT_HASH_FUNCTION_NOT_SUPPORTED
|
||||
message = "hash_function not supported {}".format(hash_function)
|
||||
|
||||
if message is not None:
|
||||
logger.error(message)
|
||||
|
||||
return rcode, message
|
||||
|
||||
@staticmethod
|
||||
# Verifies that the appointment signature is a valid signature with public key
|
||||
def check_appointment_signature(appointment, signature, pk_pem):
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
import json
|
||||
from queue import Queue
|
||||
from hashlib import sha256
|
||||
from threading import Thread
|
||||
from binascii import unhexlify
|
||||
|
||||
from pisa.logger import Logger
|
||||
from pisa.cleaner import Cleaner
|
||||
@@ -25,7 +23,7 @@ class Job:
|
||||
|
||||
# FIXME: locator is here so we can give info about jobs for now. It can be either passed from watcher or info
|
||||
# can be directly got from DB
|
||||
self.locator = sha256(unhexlify(dispute_txid)).hexdigest()
|
||||
self.locator = dispute_txid[:32]
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, job_data):
|
||||
|
||||
@@ -23,9 +23,5 @@ CLIENT_LOG_FILE = "pisa.log"
|
||||
# TEST
|
||||
TEST_LOG_FILE = "test.log"
|
||||
|
||||
# CRYPTO
|
||||
SUPPORTED_HASH_FUNCTIONS = ["SHA256"]
|
||||
SUPPORTED_CIPHERS = ["AES-GCM-128"]
|
||||
|
||||
# LEVELDB
|
||||
DB_PATH = "appointments"
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
from uuid import uuid4
|
||||
from queue import Queue
|
||||
from hashlib import sha256
|
||||
from threading import Thread
|
||||
from binascii import unhexlify
|
||||
|
||||
from cryptography.hazmat.primitives import hashes
|
||||
from cryptography.hazmat.backends import default_backend
|
||||
@@ -42,7 +40,7 @@ class Watcher:
|
||||
|
||||
@staticmethod
|
||||
def compute_locator(tx_id):
|
||||
return sha256(unhexlify(tx_id)).hexdigest()
|
||||
return tx_id[:32]
|
||||
|
||||
def sign_appointment(self, appointment):
|
||||
data = appointment.serialize()
|
||||
|
||||
Reference in New Issue
Block a user