diff --git a/.nova/Configuration.json b/.nova/Configuration.json new file mode 100644 index 00000000..943439e8 --- /dev/null +++ b/.nova/Configuration.json @@ -0,0 +1,4 @@ +{ + "workspace.color" : 2, + "workspace.name" : "seedsigner" +} diff --git a/.nova/Tasks/Custom Task.json b/.nova/Tasks/Custom Task.json new file mode 100644 index 00000000..02e6b4f0 --- /dev/null +++ b/.nova/Tasks/Custom Task.json @@ -0,0 +1,11 @@ +{ + "actions" : { + "run" : { + "enabled" : true, + "script" : "#!\/bin\/sh\n\n# stop systemd service if running\nsudo systemctl stop seedsigner.service\n\n# kill and existing processes\nps -ef | grep \"python3 main.py\" | grep -v grep | awk '{print $2}' | xargs kill\ncd \/home\/pi\/seedsigner\/src\n\/usr\/bin\/python3 main.py" + } + }, + "identifier" : "1B30DFE9-3294-4949-8ED8-67E47D15E10B", + "openLogOnRun" : "start", + "serverName" : "SeedSigner Wifi" +} diff --git a/src/seedsigner/controller.py b/src/seedsigner/controller.py index 87d9d870..25c805ff 100644 --- a/src/seedsigner/controller.py +++ b/src/seedsigner/controller.py @@ -9,11 +9,9 @@ from binascii import hexlify from threading import Thread # Internal file class dependencies -from .views import (View, MenuView, SeedToolsView,SigningToolsView, - SettingsToolsView, IOTestView) +from .views import (View, MenuView, SeedToolsView,SigningToolsView, SettingsToolsView, IOTestView) from .helpers import Buttons, B, Path, Singleton -from .models import (SeedStorage, Settings, DecodeQR, DecodeQRStatus, - EncodeQRDensity, EncodeQR, PSBTParser, QRType, Seed) +from .models import (EncodeQRDensity, QRType, Seed, SeedStorage, Settings, DecodeQR, DecodeQRStatus, EncodeQR, PSBTParser) class Controller(Singleton): """ diff --git a/src/seedsigner/models/__init__.py b/src/seedsigner/models/__init__.py index d82d803b..7e691d33 100644 --- a/src/seedsigner/models/__init__.py +++ b/src/seedsigner/models/__init__.py @@ -1,5 +1,6 @@ -from .qr_type import * from .seed import * +from .qr_type import * +from .encode_qr_density import * from .decode_qr import * from .encode_qr import * from .psbt_parser import * diff --git a/src/seedsigner/models/decode_qr.py b/src/seedsigner/models/decode_qr.py index ef864844..0062cbae 100644 --- a/src/seedsigner/models/decode_qr.py +++ b/src/seedsigner/models/decode_qr.py @@ -7,8 +7,7 @@ from embit import psbt from binascii import a2b_base64, b2a_base64 from seedsigner.helpers.ur2.ur_decoder import URDecoder from seedsigner.helpers.bcur import (cbor_decode, bc32decode) -from seedsigner.models.qr_type import QRType -from seedsigner.models.seed import Seed +from seedsigner.models import QRType, Seed ### ### DecodeQR Class diff --git a/src/seedsigner/models/encode_qr.py b/src/seedsigner/models/encode_qr.py index a272d7f5..b11d3a1b 100644 --- a/src/seedsigner/models/encode_qr.py +++ b/src/seedsigner/models/encode_qr.py @@ -7,8 +7,7 @@ from seedsigner.helpers.ur2.cbor_lite import CBOREncoder from seedsigner.helpers.ur2.ur import UR from seedsigner.helpers.bcur import (bc32encode, cbor_encode, bcur_encode) from seedsigner.helpers.qr import QR -from seedsigner.models.qr_type import QRType, EncodeQRDensity -from seedsigner.models.seed import Seed +from seedsigner.models import Seed, QRType, EncodeQRDensity ### ### EncodeQR Class @@ -66,11 +65,11 @@ class EncodeQR: elif self.qr_type == QRType.PSBTUR2: self.encoder = UREncodePSBTQR(self.psbt, self.qr_density) elif self.qr_type == QRType.SEEDSSQR: - self.encoder = SeedSSQR(self.seed_phrase) + self.encoder = SeedSSQR(self.seed_phrase, self.wordlist) elif self.qr_type == QRType.XPUBQR: - self.encoder = XPubQR(self.seed_phrase, self.passphrase, self.derivation, self.network, self.policy) + self.encoder = XPubQR(self.seed_phrase, self.passphrase, self.derivation, self.network, self.policy, self.wordlist) elif self.qr_type == QRType.SPECTERXPUBQR: - self.encoder = SpecterXPubQR(self.seed_phrase, self.passphrase, self.derivation, self.network, self.policy, self.qr_density) + self.encoder = SpecterXPubQR(self.seed_phrase, self.passphrase, self.derivation, self.network, self.policy, self.qr_density, self.wordlist) else: raise Exception('Encoder Type not Supported') @@ -193,8 +192,12 @@ class SpecterEncodePSBTQR: class SeedSSQR: - def __init__(self, seed_phrase): + def __init__(self, seed_phrase, wordlist): self.seed_phrase = seed_phrase + self.wordlist = wordlist + + if self.wordlist == None: + raise Exception('Wordlist Required') def seqLen(self): return 1 @@ -202,7 +205,7 @@ class SeedSSQR: def nextPart(self): data = "" for word in self.seed_phrase: - index = EncodeQR.WORDLIST.index(word) + index = self.wordlist.index(word) data += str("%04d" % index) return data @@ -212,14 +215,18 @@ class SeedSSQR: class XPubQR: - def __init__(self, seed_phrase, passphrase, derivation, network, policy): + def __init__(self, seed_phrase, passphrase, derivation, network, policy, wordlist): self.seed_phrase = seed_phrase self.passphrase = passphrase self.derivation = derivation + self.wordlist = wordlist self.parts = [] self.part_num_sent = 0 self.sent_complete = False + if self.wordlist == None: + raise Exception('Wordlist Required') + self.network = network self.seed = Seed(mnemonic=self.seed_phrase, passphrase=self.passphrase, wordlist=self.wordlist) self.root = bip32.HDKey.from_seed(self.seed.seed, version=NETWORKS[self.network]["xprv"]) @@ -258,7 +265,7 @@ class XPubQR: class SpecterXPubQR(XPubQR): - def __init__(self, seed_phrase, passphrase, derivation, network, policy, qr_density): + def __init__(self, seed_phrase, passphrase, derivation, network, policy, qr_density, wordlist): self.qr_max_fragement_size = 65 if qr_density == EncodeQRDensity.LOW: self.qr_max_fragement_size = 40 @@ -267,7 +274,7 @@ class SpecterXPubQR(XPubQR): elif qr_density == EncodeQRDensity.HIGH: self.qr_max_fragement_size = 90 - XPubQR.__init__(self, seed_phrase, passphrase, derivation, network, policy) + XPubQR.__init__(self, seed_phrase, passphrase, derivation, network, policy, wordlist) self.__createParts() def __createParts(self): diff --git a/src/seedsigner/models/encode_qr_density.py b/src/seedsigner/models/encode_qr_density.py new file mode 100644 index 00000000..20da4a27 --- /dev/null +++ b/src/seedsigner/models/encode_qr_density.py @@ -0,0 +1,11 @@ +from enum import IntEnum + +### +### QRType Class IntEum +### Purpose: used with DecodeQR and EncodeQR to communicate qr encoding type +### + +class EncodeQRDensity(IntEnum): + LOW = 1 + MEDIUM = 2 + HIGH = 3 \ No newline at end of file diff --git a/src/seedsigner/models/psbt_parser.py b/src/seedsigner/models/psbt_parser.py index 7406bc3b..179889fe 100644 --- a/src/seedsigner/models/psbt_parser.py +++ b/src/seedsigner/models/psbt_parser.py @@ -1,6 +1,7 @@ from embit import psbt, script, ec, bip32, bip39 from embit.networks import NETWORKS from io import BytesIO +from seedsigner.models import Seed class PSBTParser(): diff --git a/src/seedsigner/models/qr_type.py b/src/seedsigner/models/qr_type.py index f40ad65b..a3eb52ca 100644 --- a/src/seedsigner/models/qr_type.py +++ b/src/seedsigner/models/qr_type.py @@ -16,9 +16,4 @@ class QRType(IntEnum): SEED4LETTERMNEMONIC = 9 XPUBQR = 20 SPECTERXPUBQR = 21 - INVALID = 100 - -class EncodeQRDensity(IntEnum): - LOW = 1 - MEDIUM = 2 - HIGH = 3 \ No newline at end of file + INVALID = 100 \ No newline at end of file diff --git a/src/seedsigner/models/seed.py b/src/seedsigner/models/seed.py index 6d1e990e..e0febe9b 100644 --- a/src/seedsigner/models/seed.py +++ b/src/seedsigner/models/seed.py @@ -20,7 +20,7 @@ class Seed: def _generate_seed(self) -> bool: self.seed = None try: - self.seed = bip39.mnemonic_to_seed(self.mnemonic, password=self.passphrase, wordlist=self._wordlist) + self.seed = bip39.mnemonic_to_seed(self.mnemonic, password=self.passphrase, wordlist=self.wordlist) return True except Exception as e: return False diff --git a/src/seedsigner/models/settings.py b/src/seedsigner/models/settings.py index 24aeea7b..775c396c 100644 --- a/src/seedsigner/models/settings.py +++ b/src/seedsigner/models/settings.py @@ -1,5 +1,6 @@ from seedsigner.helpers import Singleton -from .qr_type import QRType, EncodeQRDensity +from .qr_type import QRType +from .encode_qr_density import EncodeQRDensity import configparser from embit import bip39 diff --git a/src/seedsigner/views/menu_view.py b/src/seedsigner/views/menu_view.py index fcf0f0b9..a9ddf4af 100644 --- a/src/seedsigner/views/menu_view.py +++ b/src/seedsigner/views/menu_view.py @@ -1,7 +1,7 @@ # Internal file class dependencies from . import View from seedsigner.helpers import B, Path -from seedsigner.models import SeedStorage, Settings +from seedsigner.models import SeedStorage, Settings, Seed # External Dependencies import time diff --git a/src/seedsigner/views/seed_tools_view.py b/src/seedsigner/views/seed_tools_view.py index 0fb27e8c..8f679a03 100644 --- a/src/seedsigner/views/seed_tools_view.py +++ b/src/seedsigner/views/seed_tools_view.py @@ -9,7 +9,7 @@ import time # Internal file class dependencies from . import View from seedsigner.helpers import B, QR, Keyboard, TextEntryDisplay, mnemonic_generation -from seedsigner.models import DecodeQR, DecodeQRStatus, QRType, EncodeQR, Settings +from seedsigner.models import DecodeQR, DecodeQRStatus, QRType, EncodeQR, Settings, Seed from seedsigner.models import SeedStorage class SeedToolsView(View): diff --git a/src/seedsigner/views/settings_tools_view.py b/src/seedsigner/views/settings_tools_view.py index 18f33003..5ebdaab3 100644 --- a/src/seedsigner/views/settings_tools_view.py +++ b/src/seedsigner/views/settings_tools_view.py @@ -3,8 +3,6 @@ from . import View from seedsigner.helpers import B, QR from seedsigner.models import EncodeQRDensity - - class SettingsToolsView(View): def __init__(self) -> None: diff --git a/tests/test_decodepsbtqr.py b/tests/test_decodepsbtqr.py index d4892fa7..0b9d2840 100644 --- a/tests/test_decodepsbtqr.py +++ b/tests/test_decodepsbtqr.py @@ -1,8 +1,6 @@ import pytest from mock import MagicMock -from seedsigner.models.decode_qr import DecodeQR, QRType, DecodeQRStatus -from seedsigner.models.psbt_parser import PSBTParser -from seedsigner.models.seed import Seed +from seedsigner.models import Seed, DecodeQR, DecodeQRStatus, QRType, EncodeQRDensity, PSBTParser from embit import psbt, bip39 @@ -41,7 +39,7 @@ def test_ur_qr_decode_multisig(): , "UR:CRYPTO-PSBT/26-29/LPCSCYCSCACFCMCPCYBBRSPTSKHDSSKSKGDYBYDMPEYTWFDIROBZCHGWCEFMFECKZEDYAEAELAAEAEAELAAEAEAELAAOAEAELAADAEAEAEAEAEAEAECPAOAXREAMJNKKZCESYKSWJOJPTBRDEOKGBSHHDTIYPSBEPSVWKSYKJPCPDKUYIMPEOSFECEQZEOVTMDDYAEAELAAEAEAELAAEAEAELAAOAEAELAADAEAEAEAEAEAEAECPAOAXWTSOSKSKFNWYBYLBNSHTEEEEECTORFLRBYCWROTKVTEMBDPDQDTEVALECAWNWDVYCELPDNDYMYDYAEAELAAEAEAELAAEAEAELAAOAEAELAADAEAEAEAEAEAEAEAEADADTKGHCLAOOEWLYATYBAOYLKOLJESGHTGYJLCLRHSGLFKPBDCLSEHYMT" ] - d = DecodeQR() + d = DecodeQR(wordlist=bip39.WORDLIST) for i in qrcodes: d.addString(i) assert d.qrType() == QRType.PSBTUR2 @@ -63,7 +61,7 @@ def test_base64_single_frame_singlsig(): "cHNidP8BAHICAAAAAQDo5ey+2HIrNUkExsFhsImv1OK1cYA9x/bRjYQD+0UaAQAAAAD9////Apg6AAAAAAAAF6kUVuVZEcdpQ2zgABa9dRUNYHD4VuaHgSYAAAAAAAAWABQaLE4t0JbDRg4pNnmcf+cAWIcyawAAAAAAAQEfqGEAAAAAAAAWABRyuw9od6yuS0yiZljV0X12wG9e5CIGA/ZlEZvQubb6PmcnK+vlnd8aftYnrQ8wHYSxsD8tDp61GIshjoFUAACAAQAAgAAAAIAAAAAAAAAAAAAAAA==" ] - d = DecodeQR() + d = DecodeQR(wordlist=bip39.WORDLIST) for i in qrcodes: d.addString(i) assert d.qrType() == QRType.PSBTBASE64 @@ -81,7 +79,12 @@ def test_base64_single_frame_singlsig(): mnemonic = "height demise useless trap grow lion found off key clown transfer enroll" pw = "" - seed = Seed(mnemonic, pw, wordlist=bip39.WORDLIST) + seed = Seed(mnemonic, passphrase=pw, wordlist=bip39.WORDLIST) + + assert seed.mnemonic == mnemonic + + assert seed.seed != None + pp = PSBTParser(tx,seed,"test") assert tx.inputs[0].witness_utxo.value == 25000 # input amount in psbt @@ -103,7 +106,7 @@ def test_ur2_sparrow_singlesig_to_self(): , "UR:CRYPTO-PSBT/443-3/LPCFADRKAXCFAOOECYMSTBHDCSHDVYAXADCTPDIARTHKYLIDWSLTAASGSARSUECLSANEPDFZEHDLRNWSGLNNHTYTBNGRYLVYWDCPCLTDAEAEAEAEADDKAXTBCHOSVEHPAHTESNYAUYOYCKRNDRTBGWIHIYTLWFUERDNYWTMSLSROHKRPKELPLONDKOUEJSKBKGIHKNDNAYHLWENSMEGSSSHNAEEEFZSRNSKEGSVYWNEEAATAPYIMPASNHPFWMETEAYBYHFRSBBZCDSRDTTLNADLBEMFTTSSOAHENPFNTVSVEBDHNDTWYKBBDEYTSLPFRJSLBBTVADPDTBEDAKIZEZMZMAOPKPEAOAEAECPAOAXWKGRNLJEVSZMWSIDSOTTEHHETYFTFXCASBMKGTURBWJLIMTLLUFWSTSSKIZMLAFXBALUECZTFTHPISKTDWPEGRGSCPIYHDTLGYKIKORTJLHLVEMNKPCTAERKWPCMJN" ] - d = DecodeQR() + d = DecodeQR(wordlist=bip39.WORDLIST) for i in qrcodes: d.addString(i) assert d.qrType() == QRType.PSBTUR2 @@ -123,7 +126,7 @@ def test_base64_2_input_p2wsh(): base64_psbt = "cHNidP8BALICAAAAAq1DhxRK+mUH4T6uUNob8bUaZ7MP+44MW4+Y9bOxpjhZAAAAAAD9////aWclWQ+45HKrI07r878E2UrAupT2paT4QurbmtNjYNQBAAAAAP3///8CQEIPAAAAAAAiACCpkDPDhmIzPlkJrjw9A71xjbIUWf3VUB7ooFJhTVm04tjSIQEAAAAAIgAgjQKFDauIXsV5u23LBdYgOwX1FwGGrLiQfWzBtFKZ7dIAAAAATwEENYfPBD5i336AAAACQStJhNVJul7vHKbo83VdmuAW2m0WaXLKDlFANn7dUNoCNbhLMdw4Knz7Q7o6exdL6UFhQegW9nJb0SUStbLEpawUAgjLdzAAAIABAACAAAAAgAIAAIBPAQQ1h88EnbHQAIAAAAI/2Nc7x7iMpJNapTe/OJTV4oifqzQcYY9KV2+PGRjCdQJoww1WnSNqfcxXGyux0q1PqfmzUqgJNqKJCpmqI9t47BQmu4PEMAAAgAEAAIAAAACAAgAAgE8BBDWHzwS6wUg5gAAAAh1Pvr3ZZ+GvcUwJl9OPz2cLXOnTAcBEC7zDtqIOt3IcA1aOofNgUZFu0baQw54SqOcGA7KAvTDOXygfKRilU2OqFHPF2gowAACAAQAAgAAAAIACAACAAAEBK4CWmAAAAAAAIgAgiYAxcG7dnrEiZ4VHFVHOo18XCalvhZYuMqBr9n7HESQBBWlSIQJOjQgMfX26XEf+trHIEk3rYkEX5Y2NfrFKQARPcd2X8iEDBWHUgq25PfHvE+hlcBryJG7wo2y8jKUSPY7sd85OOMchA2iVcuKLD+2p1pgcAjfZ5d7b/sFt5xQ/aAoC7V0Vn3WHU64iBgJOjQgMfX26XEf+trHIEk3rYkEX5Y2NfrFKQARPcd2X8hwmu4PEMAAAgAEAAIAAAACAAgAAgAAAAAABAAAAIgYDBWHUgq25PfHvE+hlcBryJG7wo2y8jKUSPY7sd85OOMccAgjLdzAAAIABAACAAAAAgAIAAIAAAAAAAQAAACIGA2iVcuKLD+2p1pgcAjfZ5d7b/sFt5xQ/aAoC7V0Vn3WHHHPF2gowAACAAQAAgAAAAIACAACAAAAAAAEAAAAAAQErgJaYAAAAAAAiACAzd60wM9EFnPHSNbsSJfyipL8myVLVP2/vwzotVUSNxQEFaVIhAiKCMRLlzIhLkRbLIUIMx5KYJM0v6LcjW/mS6K7eFGwiIQKDzUflU23LeecRgzDo5IBCEvaWGfHW7JkNxzXvuc7FdCEDC5DtLoa61/Kk/pdpu0F9e6nKoRJIB9v7Ni377rZefgFTriIGAiKCMRLlzIhLkRbLIUIMx5KYJM0v6LcjW/mS6K7eFGwiHAIIy3cwAACAAQAAgAAAAIACAACAAAAAAAAAAAAiBgKDzUflU23LeecRgzDo5IBCEvaWGfHW7JkNxzXvuc7FdBwmu4PEMAAAgAEAAIAAAACAAgAAgAAAAAAAAAAAIgYDC5DtLoa61/Kk/pdpu0F9e6nKoRJIB9v7Ni377rZefgEcc8XaCjAAAIABAACAAAAAgAIAAIAAAAAAAAAAAAABAWlSIQKtIdmtKKuZrH7f2R4iIU8RWVOrCdHVWBCS+0e9pZJy/iEDoH074LrWPIA10hyXtBCJDT06GdLkA6+z/PxoJqomPHYhA6GoQ/otQdk71nUpYZFfbkSKdBkkSj4CuPTPYrzGp6JrU64iAgKtIdmtKKuZrH7f2R4iIU8RWVOrCdHVWBCS+0e9pZJy/hwCCMt3MAAAgAEAAIAAAACAAgAAgAEAAAAAAAAAIgIDoH074LrWPIA10hyXtBCJDT06GdLkA6+z/PxoJqomPHYcc8XaCjAAAIABAACAAAAAgAIAAIABAAAAAAAAACICA6GoQ/otQdk71nUpYZFfbkSKdBkkSj4CuPTPYrzGp6JrHCa7g8QwAACAAQAAgAAAAIACAACAAQAAAAAAAAAAAA==" - d = DecodeQR() + d = DecodeQR(wordlist=bip39.WORDLIST) d.addString(base64_psbt) assert d.qrType() == QRType.PSBTBASE64 @@ -150,7 +153,7 @@ def test_base64_1_input_p2sh_p2wsh(): base64_psbt = "cHNidP8BAHICAAAAAR30J629i3Y/R8woRpLQ9JUa31rKxyM+Ny4NEsme48GWAAAAAAD9////Atw5XQUAAAAAF6kUdSESczdYagEyToVUSXyT8VTNz+OHgJaYAAAAAAAWABTmav7/w4OOcfCiewfjsA7eaujhYAAAAABPAQQ1h88EPmLffoAAAAHdXEj2dn8EYJ+rRdXEYu5laq6lJI5Mp+3t63ckwty05QKrJBNPewhwQaGPYRif6+XaxozFXvTXn7pU24H6fRy1FxQCCMt3MAAAgAEAAIAAAACAAQAAgE8BBDWHzwSdsdAAgAAAAeeOv56oeaaFTrNonMKDHk1C8brbWGFvdlecVue+v0/RAn/g4yI3oYsyen7OOcT7caYl4Mn7nQbyonHcusUR+GhzFCa7g8QwAACAAQAAgAAAAIABAACATwEENYfPBLrBSDmAAAABpzrb4oeEh2NNy/w/fr3osfyZTx7AaGDPAcP+LqeR3bYC5ioqmXPuazp69HwimlvecLylm9BLuyl/VpPXqiVrl20Uc8XaCjAAAIABAACAAAAAgAEAAIAAAQEgAOH1BQAAAAAXqRSv3gkn8731qcPbSDu4TJOlJJZ/PocBBCIAIOeiFBX5x0vX6CacrAUVovrs1DDCcKJS5qptFS3sjpDpAQVpUiECZ+pFYkOTVjB+eG+vQFA3MNjZWiA6DjRcs1Wl36A/zgMhA2Ygckuwjah29wiVRgA6wFx51+6ayrzeCIQ2eE4zfxPtIQOnUlBn22cn2CPCZkMSI6cDaZK2SlLV20rT6pqMoQCJsFOuIgYCZ+pFYkOTVjB+eG+vQFA3MNjZWiA6DjRcs1Wl36A/zgMcc8XaCjAAAIABAACAAAAAgAEAAIAAAAAAAAAAACIGA2Ygckuwjah29wiVRgA6wFx51+6ayrzeCIQ2eE4zfxPtHCa7g8QwAACAAQAAgAAAAIABAACAAAAAAAAAAAAiBgOnUlBn22cn2CPCZkMSI6cDaZK2SlLV20rT6pqMoQCJsBwCCMt3MAAAgAEAAIAAAACAAQAAgAAAAAAAAAAAAAEAIgAgZBwTq05RkpqKv6FV6LQjuM07Qv0/bYfWVc9NUQOFvwQBAWlSIQI32jVSdTgeu7+YZKrWfgOZ2J/LV36c5rBoApTzhrNlDCEC+hEqm3XmRt862AFFeyJ7p1m8A+V7czj6OajUNgCfg4EhA/MUVfxGh4k3Po3LB8CmMRsvIHcGNO0elUgETaITZA3UU64iAgI32jVSdTgeu7+YZKrWfgOZ2J/LV36c5rBoApTzhrNlDBwCCMt3MAAAgAEAAIAAAACAAQAAgAEAAAAAAAAAIgIC+hEqm3XmRt862AFFeyJ7p1m8A+V7czj6OajUNgCfg4EcJruDxDAAAIABAACAAAAAgAEAAIABAAAAAAAAACICA/MUVfxGh4k3Po3LB8CmMRsvIHcGNO0elUgETaITZA3UHHPF2gowAACAAQAAgAAAAIABAACAAQAAAAAAAAAAAA==" - d = DecodeQR() + d = DecodeQR(wordlist=bip39.WORDLIST) d.addString(base64_psbt) assert d.qrType() == QRType.PSBTBASE64 @@ -203,7 +206,7 @@ def test_ur_legacy(): , "UR:BYTES/8OF8/MMH5LDF9RK3QKCUL3VM26M6270FFJU50CU6YT5WM65783GL5EJMQPG3WV3/E0DKKUXEJDPX589HZPQ6SVQQQZQQZQQQSQQQQQYQQGQQPQQPQQQQQPQQQQQZYQSZ56D86Z6EZJEJALSG9KYCEJD4ES9TQR59AR7VDQQ9FKL44LSKUNL3E38ZAMFNQQQQSQQSQQYQQQQQPQQZQQQGQQGQQQQQGQQQQQQQ0P6SEH" ] - d = DecodeQR() + d = DecodeQR(wordlist=bip39.WORDLIST) for i in qrcodes: if d.addString(i) == DecodeQRStatus.COMPLETE: break @@ -237,7 +240,7 @@ def test_specter_multisig_animated_qr(): , "p1of5 cHNidP8BAKQCAAAAA6DLc9RAdKwWQb/7Nrq1FyAtDQ3e0w5E4LkLpcrwBL0aAAAAAAD9////78NG2vqjywKaa0QHfo6C44o1+odXeWZ43FfHy4bLdxABAAAAAP3///8rhueJha90HzgJ6alnJ1uvi0Zbq0JQoXnwDb0Cjn79DwAAAAAA/f///wHWCBAAAAAAABYAFDraKFKubXzlSvRQy8V4X+TwKhLXAAAAAE8BBDWHzwQJeplqgAAAAqmHnnoRR+XJd7gJt/PhLazKeWAfCBLJ4/OF/s0PqqF1AzK8fctt" ] - d = DecodeQR() + d = DecodeQR(wordlist=bip39.WORDLIST) for i in qrcodes: if d.addString(i) == DecodeQRStatus.COMPLETE: break @@ -275,7 +278,7 @@ def test_specter_multisig_animated_qr(): , "p2of5 OUsU2k9a6Valj6kLb/Bh2gB7YuxenNz7LY5PFJkKc60wAACAAQAAgAAAAIACAACATwEENYfPBEgFouKAAAACOeERUyCmIJuSdQNDB1mxkahw4tc2UCtjxJQoQGnRCtQCZUSXwQF+nA8dl/RG6U1b9ViWJxkzNrDCCagYEWch72cUrnhJ4jAAAIABAACAAAAAgAIAAIAAAQErckUPAAAAAAAiACDwHjagvyTvVDVn+RqxW0xaMLODBm2IVCwDBQm5uK8rDQEFR1IhAi/hk/Tz0aHcNwsVyv86bqQj30sUexPl" ] - d2 = DecodeQR() + d2 = DecodeQR(wordlist=bip39.WORDLIST) for i in qrcodes2: if d2.addString(i) == DecodeQRStatus.COMPLETE: break @@ -308,23 +311,23 @@ def test_specter_multisig_animated_qr(): def test_mnemonic_qr(): mnemonic = "height demise useless trap grow lion found off key clown transfer enroll" - d = DecodeQR() + d = DecodeQR(wordlist=bip39.WORDLIST) assert d.addString(mnemonic) == DecodeQRStatus.COMPLETE assert d.getSeedPhrase() == mnemonic.split() bad_mnemonic = "height useless trap grow lion found off key clown transfer enroll" - d2 = DecodeQR() + d2 = DecodeQR(wordlist=bip39.WORDLIST) assert d2.addString(bad_mnemonic) == DecodeQRStatus.INVALID bad2_mnemonic = "words not in the list of bip39" - d3 = DecodeQR() + d3 = DecodeQR(wordlist=bip39.WORDLIST) assert d3.addString(bad2_mnemonic) == DecodeQRStatus.INVALID def test_short_4_letter_mnemonic_qr(): short_nm = "heig demi usel trap grow lion foun off key clow tran enro" - d = DecodeQR() + d = DecodeQR(wordlist=bip39.WORDLIST) d.addString(short_nm) assert d.isComplete() == True diff --git a/tests/test_encodepsbtqr.py b/tests/test_encodepsbtqr.py index da3e21c5..6b13a407 100644 --- a/tests/test_encodepsbtqr.py +++ b/tests/test_encodepsbtqr.py @@ -1,9 +1,7 @@ import pytest from mock import MagicMock -from seedsigner.models.decode_qr import QRType -from seedsigner.models.encode_qr import EncodeQR -from seedsigner.models.qr_type import EncodeQRDensity -from embit import psbt +from seedsigner.models import EncodeQR, QRType, EncodeQRDensity +from embit import psbt, bip39 from binascii import a2b_base64 def test_ur_qr_encode(): @@ -12,7 +10,7 @@ def test_ur_qr_encode(): tx = psbt.PSBT.parse(a2b_base64(base64_psbt)) - e = EncodeQR(psbt=tx, qr_type=QRType.PSBTUR2) + e = EncodeQR(psbt=tx, qr_type=QRType.PSBTUR2, wordlist=bip39.WORDLIST) cnt = 0 while cnt <= 10: @@ -27,7 +25,7 @@ def test_specter_qr_encode(): tx = psbt.PSBT.parse(a2b_base64(base64_psbt)) - e = EncodeQR(psbt=tx, qr_type=QRType.PSBTSPECTER) + e = EncodeQR(psbt=tx, qr_type=QRType.PSBTSPECTER, wordlist=bip39.WORDLIST) cnt = 0 while cnt <= 10: @@ -62,7 +60,7 @@ def test_seedsigner_qr(): mnemonic = "obscure bone gas open exotic abuse virus bunker shuffle nasty ship dash" - e = EncodeQR(seed_phrase=mnemonic.split(" "), qr_type=QRType.SEEDSSQR) + e = EncodeQR(seed_phrase=mnemonic.split(" "), qr_type=QRType.SEEDSSQR, wordlist=bip39.WORDLIST) print(e.nextPart()) @@ -72,7 +70,7 @@ def test_xpub_qr(): mnemonic = "obscure bone gas open exotic abuse virus bunker shuffle nasty ship dash" - e = EncodeQR(seed_phrase=mnemonic.split(" "), passphrase="pass", qr_type=QRType.XPUBQR, network="test", policy="PKWPKH", derivation="m/48h/1h/0h/2h") + e = EncodeQR(seed_phrase=mnemonic.split(" "), passphrase="pass", qr_type=QRType.XPUBQR, network="test", policy="PKWPKH", derivation="m/48h/1h/0h/2h", wordlist=bip39.WORDLIST) assert e.nextPart() == "[c49122a5/48h/1h/0h/2h]vpub5adb6xr5X1yqx2v7qoo5uR32BBCQsj9tRe9zbMRsH8X6tYGE6CzuiF6k3njCyHrU5JWPMsoPwNZd9Bk9Kaqy29izB8PbuU6smtv8HLcTEAv" @@ -80,7 +78,7 @@ def test_specter_xpub_qr(): mnemonic = "obscure bone gas open exotic abuse virus bunker shuffle nasty ship dash" - e = EncodeQR(seed_phrase=mnemonic.split(" "), passphrase="pass", qr_type=QRType.SPECTERXPUBQR, network="test", policy="PKWPKH", derivation="m/48h/1h/0h/2h", qr_density=EncodeQRDensity.LOW) + e = EncodeQR(seed_phrase=mnemonic.split(" "), passphrase="pass", qr_type=QRType.SPECTERXPUBQR, network="test", policy="PKWPKH", derivation="m/48h/1h/0h/2h", qr_density=EncodeQRDensity.LOW, wordlist=bip39.WORDLIST) assert e.nextPart() == "p1of4 [c49122a5/48h/1h/0h/2h]vpub5adb6xr5X1yqx" assert e.nextPart() == "p2of4 2v7qoo5uR32BBCQsj9tRe9zbMRsH8X6tYGE6Czui"