usawa

Signed, immutable accounting.
Log | Files | Refs | Submodules | LICENSE

commit 3b80287bb113d1fb58ab646cf467a488bc13b102
parent 1cccd2255f8ef0da491afdc5c7e114b48ad41a62
Author: Carlosokumu <carlosokumu254@gmail.com>
Date:   Sat, 14 Mar 2026 09:46:52 +0300

decrypt using secretbox

Diffstat:
Mdummy/usawa/core/usawa_wallet.py | 40++++++++++++++++++++++++++++++----------
1 file changed, 30 insertions(+), 10 deletions(-)

diff --git a/dummy/usawa/core/usawa_wallet.py b/dummy/usawa/core/usawa_wallet.py @@ -1,19 +1,39 @@ -import gnupg import logging - from usawa.crypto import DemoWallet +from nacl.secret import SecretBox +from nacl.pwhash import argon2i + logg = logging.getLogger("usawawallet") class UsawaWallet(DemoWallet): - - def __init__(self, keyfile, gpgdir="~/.gnupg", passphrase=None): - self.gpg = gnupg.GPG(gnupghome=gpgdir) + def __init__(self, keyfile, passphrase=None): self.keyfile = keyfile - f = open(self.keyfile, "rb") - pk = self.gpg.decrypt_file(f, passphrase=passphrase) - f.close() - logg.debug("decrypted pk with key {}".format(pk.key_id)) - super(UsawaWallet, self).__init__(privatekey=pk.data) + + with open(self.keyfile, "rb") as f: + data = f.read() + + if passphrase is not None: + # Extract salt and decrypt + salt = data[: argon2i.SALTBYTES] + encrypted = data[argon2i.SALTBYTES :] + key = argon2i.kdf( + SecretBox.KEY_SIZE, + passphrase.encode(), + salt, + ) + box = SecretBox(key) + try: + seed = box.decrypt(encrypted) + except Exception: + raise ValueError("decryption failed: wrong passphrase?") + else: + seed = data + + if len(seed) != 32: + raise ValueError("expected 32 bytes, got {}".format(len(seed))) + + logg.debug("wallet unlocked from keyfile") + super(UsawaWallet, self).__init__(privatekey=seed)