From 5662259e19e6ef716a083f8eaec77eddff994030 Mon Sep 17 00:00:00 2001 From: Kevin Froman Date: Thu, 16 Apr 2020 02:07:05 -0500 Subject: [PATCH] work on main object --- kasten/generator/pack.py | 7 ++-- kasten/main.py | 31 +++++++++++++--- .../pack/__pycache__/__init__.cpython-38.pyc | Bin 1184 -> 0 bytes tests/test_generator_base.py | 8 +++-- tests/test_kasten.py | 14 -------- tests/test_kasten_with_base_generator.py | 19 ++++++++++ tests/test_pack.py | 33 +++++++++++++++--- 7 files changed, 82 insertions(+), 30 deletions(-) delete mode 100644 kasten/pack/__pycache__/__init__.cpython-38.pyc delete mode 100644 tests/test_kasten.py create mode 100644 tests/test_kasten_with_base_generator.py diff --git a/kasten/generator/pack.py b/kasten/generator/pack.py index f9875bc..f85f300 100644 --- a/kasten/generator/pack.py +++ b/kasten/generator/pack.py @@ -45,8 +45,7 @@ def pack(data: bytes, data_type: 'KastenDataType', pass if timestamp is None: timestamp = floor(time()) - assert int(timestamp) - + timestamp = int(timestamp) kasten_header = [data_type, enc_mode, timestamp] if signer: @@ -56,6 +55,6 @@ def pack(data: bytes, data_type: 'KastenDataType', if app_metadata is not None: kasten_header.append(app_metadata) - kasten_header = packb(kasten_header) + packb(b'\n') - + kasten_header = packb(kasten_header) + b'\n' + print(kasten_header + data) return kasten_header + data diff --git a/kasten/main.py b/kasten/main.py index 5ae7dd4..9bb9f80 100644 --- a/kasten/main.py +++ b/kasten/main.py @@ -1,17 +1,40 @@ +from msgpack import unpackb + from .types import KastenChecksum from .types import KastenPacked +from .generator import pack class Kasten: def __init__(self, id: KastenChecksum, packed_bytes: KastenPacked, generator: 'KastenBaseGenerator', - auto_check_generator = False): # noqa + auto_check_generator = True): # noqa if auto_check_generator: generator.validate_id(id, packed_bytes) self.id = id - self.packed_bytes = packed_bytes self.generator = generator + header, data = packed_bytes.split(b'\n', 1) + header = unpackb(header, strict_map_key=True) + self.header = header + self.data = data - def check_generator(self): - self.generator.validate_id(self.id, self.packed_bytes) + def check_generator(self, generator=None): + packed = self.get_packed() + if generator is None: + self.generator.validate_id(self.id, self.packed_bytes) + else: + generator(self.id, self.packed_bytes) + + # Getters are gross, but they are used here to preserve space + + def get_packed(self) -> KastenPacked: + return pack.pack(self.data, self.get_data_type(), + self.get_encryption_mode(), + timestamp=self.get_timestamp()) + + def get_data_type(self) -> str: return self.header[0] + + def get_encryption_mode(self): return self.header[1] + + def get_timestamp(self): return self.header[2] diff --git a/kasten/pack/__pycache__/__init__.cpython-38.pyc b/kasten/pack/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 1b98a82a77740a09c2828747eb177acc5bbebd8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1184 zcmZuwJ8v8}5GJ|LqfZARFf2P2VWjW@%AKs(hHbB zSpQA;CQPp?IbpR{6LxR5(z4F^DZM*kvPeG7O95wTp(ku_m)+fE`|Qr%L6vcE$x{uk z175H4TS;81&TB1;L&)(0@QH48_LHsyi1`|jd3qS_bp9i$ zQl6!2$!D27OcNaqzE!f~N{TLE7#P>qV0u=@7IPB<90fQb_)0?4 zMdI7aFGm16g!Lt?`YnhCt8EQ(g9To=>W0QI$vM_eLpJz~G(@`sc8fsmo}=}kL9adG zyuoMa2UJ{lk@go?AlwZ;$Bq9wY@EhDCT}oC zjR&Va^&5D5jb}ZYHvR@{D!dKeL6F05&<+C9`O^y*YQ1nk7=NWA+T7JYQk_)Nc zA$1eH|4hawWiH3OD2r8IF6(in%DLiso)+_QcjG^0sW*<}v`BRvkE)e%t>+`iQhx#h z`P 0) + self.assertTrue(len(K.get_packed()) > 0) KastenBaseGenerator.validate_id(h, k) - self.assertRaises(exceptions.InvalidID, KastenBaseGenerator.validate_id, h, b"\x92\xa3txt\x00\xc4\x01\n(\x86!\xd7\xb5\x8ar\xae\x97z") + self.assertRaises(exceptions.InvalidID, KastenBaseGenerator.validate_id, h, invalid) + self.assertEqual(K.get_packed(), k) unittest.main() diff --git a/tests/test_kasten.py b/tests/test_kasten.py deleted file mode 100644 index 988ff4f..0000000 --- a/tests/test_kasten.py +++ /dev/null @@ -1,14 +0,0 @@ -import unittest -from kasten import Kasten -from hashlib import sha3_384 - -from kasten import exceptions -from kasten.generator import KastenBaseGenerator - - -class TestKasten(unittest.TestCase): - def test_kasten(self): - k = b'\x92\xa3bin\x00\xc4\x01\n(\x86!\xd7\xb5\x8ar\xae\x97z' - - -unittest.main() diff --git a/tests/test_kasten_with_base_generator.py b/tests/test_kasten_with_base_generator.py new file mode 100644 index 0000000..97a0a96 --- /dev/null +++ b/tests/test_kasten_with_base_generator.py @@ -0,0 +1,19 @@ +import unittest +from hashlib import sha3_384 + +from kasten import Kasten +from kasten import exceptions +from kasten.generator import KastenBaseGenerator + + +class TestKastenBaseGenerator(unittest.TestCase): + def test_kasten(self): + k = b'\x93\xa3txt\x01\xce^\x97\xe3\xdc\ntest' + K = Kasten(sha3_384(k).digest(), k, KastenBaseGenerator) + + def test_kasten_invalid(self): + k = b'\x93\xa3txt\x01\xce^\x97\xe3\xdc\ntest' + self.assertRaises(exceptions.InvalidID, Kasten, sha3_384(k + b'invalid').digest(), k, KastenBaseGenerator) + + +unittest.main() diff --git a/tests/test_pack.py b/tests/test_pack.py index d42c166..9e186aa 100644 --- a/tests/test_pack.py +++ b/tests/test_pack.py @@ -1,5 +1,8 @@ import unittest import os +from time import time +from math import floor +from msgpack import unpackb from kasten.generator import pack from kasten import exceptions @@ -9,17 +12,37 @@ class TestPack(unittest.TestCase): def test_unsigned_pack(self): data = os.urandom(10) + t = floor(time()) packed = pack.pack(data, 'bin', 0) parts = packed.split(b'\n', 1) - self.assertEqual(parts[0], b'\x93\xa3bin\x00\xce^\x95\x82:\xc4\x01') - self.assertEqual(parts[1], data) + unpacked = unpackb(parts[0]) + self.assertEqual(unpacked[0], 'bin') + self.assertEqual(unpacked[1], 0) + self.assertAlmostEqual(unpacked[2], t) + self.assertEqual(len(unpacked), 3) + + def test_unsigned_with_meta(self): + data = os.urandom(10) + t = floor(time()) + packed = pack.pack(data, 'bin', 0, app_metadata={"meme": "doge"}) + parts = packed.split(b'\n', 1) + unpacked = unpackb(parts[0]) + self.assertEqual(unpacked[0], 'bin') + self.assertEqual(unpacked[1], 0) + self.assertAlmostEqual(unpacked[2], t) + self.assertEqual(unpacked[3], {"meme": "doge"}) + self.assertEqual(len(unpacked), 4) def test_linebreak_data(self): - data = os.urandom(9) + b'\n' + b"okay" + data = os.urandom(10) + b'\n' + t = floor(time()) packed = pack.pack(data, 'bin', 0) parts = packed.split(b'\n', 1) - self.assertEqual(parts[0], b'\x93\xa3bin\x00\xce^\x95\x82:\xc4\x01') - self.assertEqual(parts[1], data) + unpacked = unpackb(parts[0]) + self.assertEqual(unpacked[0], 'bin') + self.assertEqual(unpacked[1], 0) + self.assertAlmostEqual(unpacked[2], t) + self.assertEqual(len(unpacked[0]), 3) def test_invalid_data_type(self): data = os.urandom(10)