usawa

Unnamed repository; edit this file 'description' to name the repository.
Info | Log | Files | Refs | Submodules | LICENSE

commit 94857e4a440c99e0cdcf9b54ba2d1bf78226e6fc
parent e1818945a5bf7ed68b9d8e092fa477de9f9f4e31
Author: lash <dev@holbrook.no>
Date:   Sat,  6 Dec 2025 12:33:50 +0000

Add sigwrap

Diffstat:
Mdummy/svcontas/crypto.py | 8+++++---
Mdummy/svcontas/entry.py | 32+++++++++++++++++++++++++++-----
Mdummy/tests/entry.py | 11++++++++++-
3 files changed, 42 insertions(+), 9 deletions(-)

diff --git a/dummy/svcontas/crypto.py b/dummy/svcontas/crypto.py @@ -6,13 +6,15 @@ AXX_ALL = 0xffffffff class DemoWallet: def __init__(self, privatekey=None, publickey=None): + self.pk = None publickey_chk = None if privatekey == None: if publickey == None: - privatekey = nacl.signing.SigningKey.generate() - if privatekey != None: - self.pk = nacl.signing.SigningKey(privatekey) + self.pk = nacl.signing.SigningKey.generate() + else: + self.pk = nacl.signing.SigningKey(privatekey) publickey_chk = self.pk.verify_key + if publickey == None: if publickey_chk == None: raise AttributeError('wallet must be created with either public or private key') diff --git a/dummy/svcontas/entry.py b/dummy/svcontas/entry.py @@ -127,7 +127,7 @@ class Entry: logg.debug('serialize entry {}'.format(d)) return rencode.dumps(d) - + @staticmethod def deserialize(data): v = rencode.loads(data) @@ -149,16 +149,38 @@ class Entry: b = self.serialize() h = hashlib.new('sha512') h.update(b) - return h.digest() + return (h.digest(), b) def sign(self, wallet): - b = self.sum() - r = wallet.sign(b) + (z, b) = self.sum() + r = wallet.sign(z) pubk_hx = wallet.pubkey().hex() self.sigs[pubk_hx] = r logg.debug('added signature from key {}'.format(pubk_hx)) - return (b, r,) + return (z, r, b,) + + + def wrap(self, wallet): + (digest, sig, data) = self.sign(wallet) + d = [ + sig, + data, + ] + return rencode.dumps(d) + + + @staticmethod + def unwrap(data, wallet): + v = rencode.loads(data) + sig = v[0] + entry = Entry.deserialize(v[1]) + (z, b) = entry.sum() + #wallet.verify(z, sig) + #sig = bytes.fromhex('cc06808cbbee0510331aa97974132e8dc296aeb795be229d064bae784b0a87a5cf4281d82e8c99271b75db2148f08a026c1a60ed9cabdb8cac6d24242dac4063') + wallet.verify(z, sig) + return entry + def to_tree(self): diff --git a/dummy/tests/entry.py b/dummy/tests/entry.py @@ -4,7 +4,7 @@ import unittest import os import copy -from svcontas import EntryPart, Entry +from svcontas import EntryPart, Entry, DemoWallet logging.basicConfig(level=logging.DEBUG) logg = logging.getLogger() @@ -31,6 +31,15 @@ class TestEntry(unittest.TestCase): ss = o.serialize() self.assertEqual(s, ss) + + + def test_entry_sign_verify(self): + dst = EntryPart('asset', 'foo', 1337) + src = EntryPart('income', 'foo', 1337, src=True) + o = Entry(src, dst, 'USD', 42, datetime.datetime.strptime('2025-11-11', '%Y-%m-%d'), parent=self.parent, ref=self.ref, description=self.description, tx_datereg=self.dtreg) + wallet = DemoWallet() + data = o.wrap(wallet) + r = Entry.unwrap(data, wallet) if __name__ == '__main__':