commit 94857e4a440c99e0cdcf9b54ba2d1bf78226e6fc
parent e1818945a5bf7ed68b9d8e092fa477de9f9f4e31
Author: lash <dev@holbrook.no>
Date: Sat, 6 Dec 2025 12:33:50 +0000
Add sigwrap
Diffstat:
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__':