work in progress

This commit is contained in:
newtonick
2021-09-07 18:46:59 +00:00
parent 27a6c72a7d
commit 616018930b
16 changed files with 81 additions and 54 deletions
+4
View File
@@ -0,0 +1,4 @@
{
"workspace.color" : 2,
"workspace.name" : "seedsigner"
}
+11
View File
@@ -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"
}
+2 -4
View File
@@ -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):
"""
+2 -1
View File
@@ -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 *
+1 -2
View File
@@ -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
+17 -10
View File
@@ -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):
@@ -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
+1
View File
@@ -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():
+1 -6
View File
@@ -16,9 +16,4 @@ class QRType(IntEnum):
SEED4LETTERMNEMONIC = 9
XPUBQR = 20
SPECTERXPUBQR = 21
INVALID = 100
class EncodeQRDensity(IntEnum):
LOW = 1
MEDIUM = 2
HIGH = 3
INVALID = 100
+1 -1
View File
@@ -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
+2 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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):
@@ -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:
+19 -16
View File
@@ -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
+7 -9
View File
@@ -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"