mirror of
https://github.com/SeedSigner/seedsigner.git
synced 2026-10-05 23:18:25 +00:00
work in progress
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"workspace.color" : 2,
|
||||
"workspace.name" : "seedsigner"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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):
|
||||
"""
|
||||
|
||||
@@ -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 *
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,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():
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user