commit aa006873c4b84f9ed0ef8646e9787e1d9cfaa3c6
parent 6ab957197388dd32e3c3bd5134775a0b455f1a84
Author: lash <dev@holbrook.no>
Date: Thu, 6 Nov 2025 01:39:37 +0000
WIP add signature verifier
Diffstat:
2 files changed, 51 insertions(+), 19 deletions(-)
diff --git a/dummy/create.py b/dummy/create.py
@@ -5,27 +5,16 @@ import lxml.etree
import confini
import nacl.signing
-from svcontas import Ledger, Entry, get_units, init_ledger
+from svcontas import Ledger, Entry, DemoWallet, get_units, init_ledger
seed = bytes.fromhex('2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae')
-pk = nacl.signing.SigningKey(seed)
-pubk = pk.verify_key
+#pubk = pk.verify_key
state_serial = 0
state_digest = b'00' * 64
-class DemoWallet:
-
- def sign(self, v):
- r = pk.sign(v)
- return r.signature
-
- def pubkey(self):
- return pubk.encode()
-
-
def save_state():
f = open('.state', 'wb')
b = state_serial.to_bytes(8, byteorder='big')
@@ -68,7 +57,7 @@ if __name__ == '__main__':
state_serial += 1
entry = Entry(arg.t, amount, arg.u, state_serial, arg.a, arg.date)
- wallet = DemoWallet()
+ wallet = DemoWallet(privatekey=seed)
entry.sign(wallet)
ledger.add_entry(entry)
#r = lxml.etree.tostring(entry.to_tree())
diff --git a/dummy/svcontas/__init__.py b/dummy/svcontas/__init__.py
@@ -6,6 +6,7 @@ import hashlib
from lxml import etree
import rencode
+import nacl.signing
logging.basicConfig(level=logging.DEBUG)
logg = logging.getLogger()
@@ -13,6 +14,38 @@ logg = logging.getLogger()
DEFAULTPARENT = b'\x00' * 64
+class DemoWallet:
+
+ def __init__(self, privatekey=None, publickey=None):
+ publickey_chk = None
+ if privatekey == None:
+ if publickey == None:
+ privatekey = nacl.signing.SigningKey.generate()
+ if privatekey != None:
+ 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')
+ publickey = publickey_chk
+ elif publickey_chk != None and publickey != publickey_chk.encode():
+ raise ValueError('publickey supplied does not match privatekey')
+ else:
+ publickey = nacl.signing.VerifyKey(publickey)
+ self.pubk = publickey
+
+ def sign(self, v):
+ r = self.pk.sign(v)
+ return r.signature
+
+ def pubkey(self):
+ return self.pubk.encode()
+
+
+ def verify(self, v, sig):
+ return self.pubk.verify(v, sig)
+
+
class NoopSigVerifier:
def verify(self, msg, key, sig):
@@ -146,16 +179,20 @@ class Entry:
return rencode.dumps(d)
- def sign(self, wallet):
+ def sum(self):
b = self.serialize()
h = hashlib.new('sha512')
h.update(b)
- z = h.digest()
- r = wallet.sign(z)
+ return h.digest()
+
+
+ def sign(self, wallet):
+ b = self.sum()
+ r = wallet.sign(b)
pubk_hx = wallet.pubkey().hex()
self.sigs[pubk_hx] = r
logg.debug('added signature from key {}'.format(pubk_hx))
- return (b, z, r,)
+ return (b, r,)
def to_tree(self):
@@ -276,7 +313,13 @@ class Ledger:
# TODO: add allowed pubkey and actually verify sig
def check_sigs(self, entry):
- return len(entry.sigs) > 0
+ for k in entry.sigs.keys():
+ b = bytes.fromhex(k)
+ sig = entry.sigs[k]
+ wallet = DemoWallet(publickey=b)
+ v = entry.sum()
+ r = wallet.verify(v, sig)
+ return True
def add_entry(self, entry):