usawa

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

commit aa006873c4b84f9ed0ef8646e9787e1d9cfaa3c6
parent 6ab957197388dd32e3c3bd5134775a0b455f1a84
Author: lash <dev@holbrook.no>
Date:   Thu,  6 Nov 2025 01:39:37 +0000

WIP add signature verifier

Diffstat:
Mdummy/create.py | 17+++--------------
Mdummy/svcontas/__init__.py | 53++++++++++++++++++++++++++++++++++++++++++++++++-----
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):