1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-07-03 21:32:33 +00:00

chore(tests): run black

[no changelog]
This commit is contained in:
grdddj 2023-06-28 12:46:29 +02:00 committed by Vít Obrusník
parent e2b7244383
commit 4bd7cf4b04
98 changed files with 8179 additions and 3407 deletions

View File

@ -10,6 +10,7 @@ from typing import Any, Awaitable
from trezor import utils # noqa: F401 from trezor import utils # noqa: F401
from apps.common.paths import HARDENED from apps.common.paths import HARDENED
def H_(x: int) -> int: def H_(x: int) -> int:
""" """
Shortcut function that "hardens" a number in a BIP44 path. Shortcut function that "hardens" a number in a BIP44 path.

View File

@ -2,6 +2,7 @@ from mock import patch
import storage.common import storage.common
class MockStorage: class MockStorage:
PATCH_METHODS = ("get", "set", "delete") PATCH_METHODS = ("get", "set", "delete")

View File

@ -34,17 +34,17 @@ sbu = io.SBU()
def test_display(colors): def test_display(colors):
d.clear() d.clear()
m = { m = {
'R': 0xF800, "R": 0xF800,
'G': 0x07E0, "G": 0x07E0,
'B': 0x001F, "B": 0x001F,
'W': 0xFFFF, "W": 0xFFFF,
} }
w = 240 // len(colors) w = 240 // len(colors)
for i, c in enumerate(colors): for i, c in enumerate(colors):
c = m.get(c, 0x0000) c = m.get(c, 0x0000)
d.bar(i * w, 0, i * w + w, 240, c) d.bar(i * w, 0, i * w + w, 240, c)
d.refresh() d.refresh()
print('OK') print("OK")
def test_touch(v): def test_touch(v):
@ -68,14 +68,22 @@ def test_touch(v):
touch = False touch = False
while True: while True:
if not touch: if not touch:
if io.poll([io.TOUCH], r, 10000) and r[0] == io.TOUCH and r[1][0] == io.TOUCH_START: if (
io.poll([io.TOUCH], r, 10000)
and r[0] == io.TOUCH
and r[1][0] == io.TOUCH_START
):
touch = True touch = True
else: else:
if io.poll([io.TOUCH], r, 10000) and r[0] == io.TOUCH and r[1][0] == io.TOUCH_END: if (
print(f'OK {r[1][1]} {r[1][2]}') io.poll([io.TOUCH], r, 10000)
and r[0] == io.TOUCH
and r[1][0] == io.TOUCH_END
):
print(f"OK {r[1][1]} {r[1][2]}")
break break
if utime.ticks_us() > deadline: if utime.ticks_us() > deadline:
print('ERROR TIMEOUT') print("ERROR TIMEOUT")
break break
# flush all events # flush all events
while io.poll([io.TOUCH], r, 10000): while io.poll([io.TOUCH], r, 10000):
@ -87,7 +95,7 @@ def test_touch(v):
def test_pwm(v): def test_pwm(v):
d.backlight(int(v)) d.backlight(int(v))
d.refresh() d.refresh()
print('OK') print("OK")
def test_sd(): def test_sd():
@ -97,52 +105,52 @@ def test_sd():
try: try:
sd.read(0, buf1) sd.read(0, buf1)
except OSError: except OSError:
print('ERROR READING DATA') print("ERROR READING DATA")
sd.power(False) sd.power(False)
return return
try: try:
sd.write(0, buf1) sd.write(0, buf1)
except OSError: except OSError:
print('ERROR WRITING DATA') print("ERROR WRITING DATA")
sd.power(False) sd.power(False)
return return
buf2 = bytearray(8 * 1024) buf2 = bytearray(8 * 1024)
try: try:
sd.read(0, buf2) sd.read(0, buf2)
except OSError: except OSError:
print('ERROR READING DATA') print("ERROR READING DATA")
sd.power(False) sd.power(False)
return return
if buf1 == buf2: if buf1 == buf2:
print('OK') print("OK")
else: else:
print('ERROR DATA MISMATCH') print("ERROR DATA MISMATCH")
sd.power(False) sd.power(False)
else: else:
print('ERROR NOCARD') print("ERROR NOCARD")
def test_sbu(v): def test_sbu(v):
sbu1 = (v[0] == '1') sbu1 = v[0] == "1"
sbu2 = (v[1] == '1') sbu2 = v[1] == "1"
sbu.set(sbu1, sbu2) sbu.set(sbu1, sbu2)
print('OK') print("OK")
def test_otp_read(): def test_otp_read():
data = bytearray(32) data = bytearray(32)
otp.read(0, 0, data) otp.read(0, 0, data)
data = bytes(data).rstrip(b'\x00\xff').decode() data = bytes(data).rstrip(b"\x00\xff").decode()
print('OK', data) print("OK", data)
def test_otp_write(v): def test_otp_write(v):
if len(v) < 32: if len(v) < 32:
v = v + '\x00' * (32 - len(v)) v = v + "\x00" * (32 - len(v))
data = v[:32].encode() data = v[:32].encode()
otp.write(0, 0, data) otp.write(0, 0, data)
otp.lock(0) otp.lock(0)
print('OK') print("OK")
d.clear() d.clear()
@ -152,32 +160,32 @@ while True:
try: try:
line = input() line = input()
if line == 'PING': if line == "PING":
print('OK') print("OK")
elif line.startswith('DISP '): elif line.startswith("DISP "):
test_display(line[5:]) test_display(line[5:])
elif line.startswith('TOUCH '): elif line.startswith("TOUCH "):
test_touch(line[6:]) test_touch(line[6:])
elif line.startswith('PWM '): elif line.startswith("PWM "):
test_pwm(line[4:]) test_pwm(line[4:])
elif line == 'SD': elif line == "SD":
test_sd() test_sd()
elif line.startswith('SBU '): elif line.startswith("SBU "):
test_sbu(line[4:]) test_sbu(line[4:])
elif line.startswith('OTP READ'): elif line.startswith("OTP READ"):
test_otp_read() test_otp_read()
elif line.startswith('OTP WRITE '): elif line.startswith("OTP WRITE "):
test_otp_write(line[10:]) test_otp_write(line[10:])
else: else:
print('UNKNOWN') print("UNKNOWN")
except Exception as ex: except Exception as ex:
print('ERROR', ex) print("ERROR", ex)

View File

@ -3,110 +3,110 @@ vectors = [
[ [
"duckling enlarge academic academic agency result length solution fridge kidney coal piece deal husband erode duke ajar critical decision keyboard" "duckling enlarge academic academic agency result length solution fridge kidney coal piece deal husband erode duke ajar critical decision keyboard"
], ],
"bb54aac4b89dc868ba37d9cc21b2cece" "bb54aac4b89dc868ba37d9cc21b2cece",
], ],
[ [
[ [
"duckling enlarge academic academic agency result length solution fridge kidney coal piece deal husband erode duke ajar critical decision kidney" "duckling enlarge academic academic agency result length solution fridge kidney coal piece deal husband erode duke ajar critical decision kidney"
], ],
"" "",
], ],
[ [
[ [
"duckling enlarge academic academic email result length solution fridge kidney coal piece deal husband erode duke ajar music cargo fitness" "duckling enlarge academic academic email result length solution fridge kidney coal piece deal husband erode duke ajar music cargo fitness"
], ],
"" "",
], ],
[ [
[ [
"shadow pistol academic always adequate wildlife fancy gross oasis cylinder mustang wrist rescue view short owner flip making coding armed", "shadow pistol academic always adequate wildlife fancy gross oasis cylinder mustang wrist rescue view short owner flip making coding armed",
"shadow pistol academic acid actress prayer class unknown daughter sweater depict flip twice unkind craft early superior advocate guest smoking" "shadow pistol academic acid actress prayer class unknown daughter sweater depict flip twice unkind craft early superior advocate guest smoking",
], ],
"b43ceb7e57a0ea8766221624d01b0864" "b43ceb7e57a0ea8766221624d01b0864",
], ],
[ [
[ [
"shadow pistol academic always adequate wildlife fancy gross oasis cylinder mustang wrist rescue view short owner flip making coding armed" "shadow pistol academic always adequate wildlife fancy gross oasis cylinder mustang wrist rescue view short owner flip making coding armed"
], ],
"" "",
], ],
[ [
[ [
"adequate smoking academic acid debut wine petition glen cluster slow rhyme slow simple epidemic rumor junk tracks treat olympic tolerate", "adequate smoking academic acid debut wine petition glen cluster slow rhyme slow simple epidemic rumor junk tracks treat olympic tolerate",
"adequate stay academic agency agency formal party ting frequent learn upstairs remember smear leaf damage anatomy ladle market hush corner" "adequate stay academic agency agency formal party ting frequent learn upstairs remember smear leaf damage anatomy ladle market hush corner",
], ],
"" "",
], ],
[ [
[ [
"peasant leaves academic acid desert exact olympic math alive axle trial tackle drug deny decent smear dominant desert bucket remind", "peasant leaves academic acid desert exact olympic math alive axle trial tackle drug deny decent smear dominant desert bucket remind",
"peasant leader academic agency cultural blessing percent network envelope medal junk primary human pumps jacket fragment payroll ticket evoke voice" "peasant leader academic agency cultural blessing percent network envelope medal junk primary human pumps jacket fragment payroll ticket evoke voice",
], ],
"" "",
], ],
[ [
[ [
"liberty category beard echo animal fawn temple briefing math username various wolf aviation fancy visual holy thunder yelp helpful payment", "liberty category beard echo animal fawn temple briefing math username various wolf aviation fancy visual holy thunder yelp helpful payment",
"liberty category beard email beyond should fancy romp founder easel pink holy hairy romp loyalty material victim owner toxic custody", "liberty category beard email beyond should fancy romp founder easel pink holy hairy romp loyalty material victim owner toxic custody",
"liberty category academic easy being hazard crush diminish oral lizard reaction cluster force dilemma deploy force club veteran expect photo" "liberty category academic easy being hazard crush diminish oral lizard reaction cluster force dilemma deploy force club veteran expect photo",
], ],
"" "",
], ],
[ [
[ [
"average senior academic leaf broken teacher expect surface hour capture obesity desire negative dynamic dominant pistol mineral mailman iris aide", "average senior academic leaf broken teacher expect surface hour capture obesity desire negative dynamic dominant pistol mineral mailman iris aide",
"average senior academic agency curious pants blimp spew clothes slice script dress wrap firm shaft regular slavery negative theater roster" "average senior academic agency curious pants blimp spew clothes slice script dress wrap firm shaft regular slavery negative theater roster",
], ],
"" "",
], ],
[ [
[ [
"music husband acrobat acid artist finance center either graduate swimming object bike medical clothes station aspect spider maiden bulb welcome", "music husband acrobat acid artist finance center either graduate swimming object bike medical clothes station aspect spider maiden bulb welcome",
"music husband acrobat agency advance hunting bike corner density careful material civil evil tactics remind hawk discuss hobo voice rainbow", "music husband acrobat agency advance hunting bike corner density careful material civil evil tactics remind hawk discuss hobo voice rainbow",
"music husband beard academic black tricycle clock mayor estimate level photo episode exclude ecology papa source amazing salt verify divorce" "music husband beard academic black tricycle clock mayor estimate level photo episode exclude ecology papa source amazing salt verify divorce",
], ],
"" "",
], ],
[ [
[ [
"device stay academic always dive coal antenna adult black exceed stadium herald advance soldier busy dryer daughter evaluate minister laser", "device stay academic always dive coal antenna adult black exceed stadium herald advance soldier busy dryer daughter evaluate minister laser",
"device stay academic always dwarf afraid robin gravity crunch adjust soul branch walnut coastal dream costume scholar mortgage mountain pumps" "device stay academic always dwarf afraid robin gravity crunch adjust soul branch walnut coastal dream costume scholar mortgage mountain pumps",
], ],
"" "",
], ],
[ [
[ [
"hour painting academic academic device formal evoke guitar random modern justice filter withdraw trouble identify mailman insect general cover oven", "hour painting academic academic device formal evoke guitar random modern justice filter withdraw trouble identify mailman insect general cover oven",
"hour painting academic agency artist again daisy capital beaver fiber much enjoy suitable symbolic identify photo editor romp float echo" "hour painting academic agency artist again daisy capital beaver fiber much enjoy suitable symbolic identify photo editor romp float echo",
], ],
"" "",
], ],
[ [
[ [
"guilt walnut academic acid deliver remove equip listen vampire tactics nylon rhythm failure husband fatigue alive blind enemy teaspoon rebound", "guilt walnut academic acid deliver remove equip listen vampire tactics nylon rhythm failure husband fatigue alive blind enemy teaspoon rebound",
"guilt walnut academic agency brave hamster hobo declare herd taste alpha slim criminal mild arcade formal romp branch pink ambition" "guilt walnut academic agency brave hamster hobo declare herd taste alpha slim criminal mild arcade formal romp branch pink ambition",
], ],
"" "",
], ],
[ [
[ [
"eraser senior beard romp adorn nuclear spill corner cradle style ancient family general leader ambition exchange unusual garlic promise voice" "eraser senior beard romp adorn nuclear spill corner cradle style ancient family general leader ambition exchange unusual garlic promise voice"
], ],
"" "",
], ],
[ [
[ [
"eraser senior decision scared cargo theory device idea deliver modify curly include pancake both news skin realize vitamins away join", "eraser senior decision scared cargo theory device idea deliver modify curly include pancake both news skin realize vitamins away join",
"eraser senior decision roster beard treat identify grumpy salt index fake aviation theater cubic bike cause research dragon emphasis counter" "eraser senior decision roster beard treat identify grumpy salt index fake aviation theater cubic bike cause research dragon emphasis counter",
], ],
"" "",
], ],
[ [
[ [
"eraser senior decision shadow artist work morning estate greatest pipeline plan ting petition forget hormone flexible general goat admit surface", "eraser senior decision shadow artist work morning estate greatest pipeline plan ting petition forget hormone flexible general goat admit surface",
"eraser senior beard romp adorn nuclear spill corner cradle style ancient family general leader ambition exchange unusual garlic promise voice" "eraser senior beard romp adorn nuclear spill corner cradle style ancient family general leader ambition exchange unusual garlic promise voice",
], ],
"" "",
], ],
[ [
[ [
@ -114,133 +114,133 @@ vectors = [
"eraser senior ceramic snake clay various huge numb argue hesitate auction category timber browser greatest hanger petition script leaf pickup", "eraser senior ceramic snake clay various huge numb argue hesitate auction category timber browser greatest hanger petition script leaf pickup",
"eraser senior ceramic shaft dynamic become junior wrist silver peasant force math alto coal amazing segment yelp velvet image paces", "eraser senior ceramic shaft dynamic become junior wrist silver peasant force math alto coal amazing segment yelp velvet image paces",
"eraser senior ceramic round column hawk trust auction smug shame alive greatest sheriff living perfect corner chest sled fumes adequate", "eraser senior ceramic round column hawk trust auction smug shame alive greatest sheriff living perfect corner chest sled fumes adequate",
"eraser senior decision smug corner ruin rescue cubic angel tackle skin skunk program roster trash rumor slush angel flea amazing" "eraser senior decision smug corner ruin rescue cubic angel tackle skin skunk program roster trash rumor slush angel flea amazing",
], ],
"7c3397a292a5941682d7a4ae2d898d11" "7c3397a292a5941682d7a4ae2d898d11",
], ],
[ [
[ [
"eraser senior decision smug corner ruin rescue cubic angel tackle skin skunk program roster trash rumor slush angel flea amazing", "eraser senior decision smug corner ruin rescue cubic angel tackle skin skunk program roster trash rumor slush angel flea amazing",
"eraser senior beard romp adorn nuclear spill corner cradle style ancient family general leader ambition exchange unusual garlic promise voice", "eraser senior beard romp adorn nuclear spill corner cradle style ancient family general leader ambition exchange unusual garlic promise voice",
"eraser senior decision scared cargo theory device idea deliver modify curly include pancake both news skin realize vitamins away join" "eraser senior decision scared cargo theory device idea deliver modify curly include pancake both news skin realize vitamins away join",
], ],
"7c3397a292a5941682d7a4ae2d898d11" "7c3397a292a5941682d7a4ae2d898d11",
], ],
[ [
[ [
"eraser senior beard romp adorn nuclear spill corner cradle style ancient family general leader ambition exchange unusual garlic promise voice", "eraser senior beard romp adorn nuclear spill corner cradle style ancient family general leader ambition exchange unusual garlic promise voice",
"eraser senior acrobat romp bishop medical gesture pumps secret alive ultimate quarter priest subject class dictate spew material endless market" "eraser senior acrobat romp bishop medical gesture pumps secret alive ultimate quarter priest subject class dictate spew material endless market",
], ],
"7c3397a292a5941682d7a4ae2d898d11" "7c3397a292a5941682d7a4ae2d898d11",
], ],
[ [
[ [
"theory painting academic academic armed sweater year military elder discuss acne wildlife boring employer fused large satoshi bundle carbon diagnose anatomy hamster leaves tracks paces beyond phantom capital marvel lips brave detect luck" "theory painting academic academic armed sweater year military elder discuss acne wildlife boring employer fused large satoshi bundle carbon diagnose anatomy hamster leaves tracks paces beyond phantom capital marvel lips brave detect luck"
], ],
"989baf9dcaad5b10ca33dfd8cc75e42477025dce88ae83e75a230086a0e00e92" "989baf9dcaad5b10ca33dfd8cc75e42477025dce88ae83e75a230086a0e00e92",
], ],
[ [
[ [
"theory painting academic academic armed sweater year military elder discuss acne wildlife boring employer fused large satoshi bundle carbon diagnose anatomy hamster leaves tracks paces beyond phantom capital marvel lips brave detect lunar" "theory painting academic academic armed sweater year military elder discuss acne wildlife boring employer fused large satoshi bundle carbon diagnose anatomy hamster leaves tracks paces beyond phantom capital marvel lips brave detect lunar"
], ],
"" "",
], ],
[ [
[ [
"theory painting academic academic campus sweater year military elder discuss acne wildlife boring employer fused large satoshi bundle carbon diagnose anatomy hamster leaves tracks paces beyond phantom capital marvel lips facility obtain sister" "theory painting academic academic campus sweater year military elder discuss acne wildlife boring employer fused large satoshi bundle carbon diagnose anatomy hamster leaves tracks paces beyond phantom capital marvel lips facility obtain sister"
], ],
"" "",
], ],
[ [
[ [
"humidity disease academic always aluminum jewelry energy woman receiver strategy amuse duckling lying evidence network walnut tactics forget hairy rebound impulse brother survive clothes stadium mailman rival ocean reward venture always armed unwrap", "humidity disease academic always aluminum jewelry energy woman receiver strategy amuse duckling lying evidence network walnut tactics forget hairy rebound impulse brother survive clothes stadium mailman rival ocean reward venture always armed unwrap",
"humidity disease academic agency actress jacket gross physics cylinder solution fake mortgage benefit public busy prepare sharp friar change work slow purchase ruler again tricycle involve viral wireless mixture anatomy desert cargo upgrade" "humidity disease academic agency actress jacket gross physics cylinder solution fake mortgage benefit public busy prepare sharp friar change work slow purchase ruler again tricycle involve viral wireless mixture anatomy desert cargo upgrade",
], ],
"c938b319067687e990e05e0da0ecce1278f75ff58d9853f19dcaeed5de104aae" "c938b319067687e990e05e0da0ecce1278f75ff58d9853f19dcaeed5de104aae",
], ],
[ [
[ [
"humidity disease academic always aluminum jewelry energy woman receiver strategy amuse duckling lying evidence network walnut tactics forget hairy rebound impulse brother survive clothes stadium mailman rival ocean reward venture always armed unwrap" "humidity disease academic always aluminum jewelry energy woman receiver strategy amuse duckling lying evidence network walnut tactics forget hairy rebound impulse brother survive clothes stadium mailman rival ocean reward venture always armed unwrap"
], ],
"" "",
], ],
[ [
[ [
"smear husband academic acid deadline scene venture distance dive overall parking bracelet elevator justice echo burning oven chest duke nylon", "smear husband academic acid deadline scene venture distance dive overall parking bracelet elevator justice echo burning oven chest duke nylon",
"smear isolate academic agency alpha mandate decorate burden recover guard exercise fatal force syndrome fumes thank guest drift dramatic mule" "smear isolate academic agency alpha mandate decorate burden recover guard exercise fatal force syndrome fumes thank guest drift dramatic mule",
], ],
"" "",
], ],
[ [
[ [
"finger trash academic acid average priority dish revenue academic hospital spirit western ocean fact calcium syndrome greatest plan losing dictate", "finger trash academic acid average priority dish revenue academic hospital spirit western ocean fact calcium syndrome greatest plan losing dictate",
"finger traffic academic agency building lilac deny paces subject threaten diploma eclipse window unknown health slim piece dragon focus smirk" "finger traffic academic agency building lilac deny paces subject threaten diploma eclipse window unknown health slim piece dragon focus smirk",
], ],
"" "",
], ],
[ [
[ [
"flavor pink beard echo depart forbid retreat become frost helpful juice unwrap reunion credit math burning spine black capital lair", "flavor pink beard echo depart forbid retreat become frost helpful juice unwrap reunion credit math burning spine black capital lair",
"flavor pink beard email diet teaspoon freshman identify document rebound cricket prune headset loyalty smell emission skin often square rebound", "flavor pink beard email diet teaspoon freshman identify document rebound cricket prune headset loyalty smell emission skin often square rebound",
"flavor pink academic easy credit cage raisin crazy closet lobe mobile become drink human tactics valuable hand capture sympathy finger" "flavor pink academic easy credit cage raisin crazy closet lobe mobile become drink human tactics valuable hand capture sympathy finger",
], ],
"" "",
], ],
[ [
[ [
"column flea academic leaf debut extra surface slow timber husky lawsuit game behavior husky swimming already paper episode tricycle scroll", "column flea academic leaf debut extra surface slow timber husky lawsuit game behavior husky swimming already paper episode tricycle scroll",
"column flea academic agency blessing garbage party software stadium verify silent umbrella therapy decorate chemical erode dramatic eclipse replace apart" "column flea academic agency blessing garbage party software stadium verify silent umbrella therapy decorate chemical erode dramatic eclipse replace apart",
], ],
"" "",
], ],
[ [
[ [
"smirk pink acrobat acid auction wireless impulse spine sprinkle fortune clogs elbow guest hush loyalty crush dictate tracks airport talent", "smirk pink acrobat acid auction wireless impulse spine sprinkle fortune clogs elbow guest hush loyalty crush dictate tracks airport talent",
"smirk pink acrobat agency dwarf emperor ajar organize legs slice harvest plastic dynamic style mobile float bulb health coding credit", "smirk pink acrobat agency dwarf emperor ajar organize legs slice harvest plastic dynamic style mobile float bulb health coding credit",
"smirk pink beard academic alto strategy carve shame language rapids ruin smart location spray training acquire eraser endorse submit peaceful" "smirk pink beard academic alto strategy carve shame language rapids ruin smart location spray training acquire eraser endorse submit peaceful",
], ],
"" "",
], ],
[ [
[ [
"fishing recover academic always device craft trend snapshot gums skin downtown watch device sniff hour clock public maximum garlic born", "fishing recover academic always device craft trend snapshot gums skin downtown watch device sniff hour clock public maximum garlic born",
"fishing recover academic always aircraft view software cradle fangs amazing package plastic evaluate intend penalty epidemic anatomy quarter cage apart" "fishing recover academic always aircraft view software cradle fangs amazing package plastic evaluate intend penalty epidemic anatomy quarter cage apart",
], ],
"" "",
], ],
[ [
[ [
"evoke garden academic academic answer wolf scandal modern warmth station devote emerald market physics surface formal amazing aquatic gesture medical", "evoke garden academic academic answer wolf scandal modern warmth station devote emerald market physics surface formal amazing aquatic gesture medical",
"evoke garden academic agency deal revenue knit reunion decrease magazine flexible company goat repair alarm military facility clogs aide mandate" "evoke garden academic agency deal revenue knit reunion decrease magazine flexible company goat repair alarm military facility clogs aide mandate",
], ],
"" "",
], ],
[ [
[ [
"river deal academic acid average forbid pistol peanut custody bike class aunt hairy merit valid flexible learn ajar very easel", "river deal academic acid average forbid pistol peanut custody bike class aunt hairy merit valid flexible learn ajar very easel",
"river deal academic agency camera amuse lungs numb isolate display smear piece traffic worthy year patrol crush fact fancy emission" "river deal academic agency camera amuse lungs numb isolate display smear piece traffic worthy year patrol crush fact fancy emission",
], ],
"" "",
], ],
[ [
[ [
"wildlife deal beard romp alcohol space mild usual clothes union nuclear testify course research heat listen task location thank hospital slice smell failure fawn helpful priest ambition average recover lecture process dough stadium" "wildlife deal beard romp alcohol space mild usual clothes union nuclear testify course research heat listen task location thank hospital slice smell failure fawn helpful priest ambition average recover lecture process dough stadium"
], ],
"" "",
], ],
[ [
[ [
"wildlife deal decision scared acne fatal snake paces obtain election dryer dominant romp tactics railroad marvel trust helpful flip peanut theory theater photo luck install entrance taxi step oven network dictate intimate listen", "wildlife deal decision scared acne fatal snake paces obtain election dryer dominant romp tactics railroad marvel trust helpful flip peanut theory theater photo luck install entrance taxi step oven network dictate intimate listen",
"wildlife deal decision smug ancestor genuine move huge cubic strategy smell game costume extend swimming false desire fake traffic vegan senior twice timber submit leader payroll fraction apart exact forward pulse tidy install" "wildlife deal decision smug ancestor genuine move huge cubic strategy smell game costume extend swimming false desire fake traffic vegan senior twice timber submit leader payroll fraction apart exact forward pulse tidy install",
], ],
"" "",
], ],
[ [
[ [
"wildlife deal decision shadow analysis adjust bulb skunk muscle mandate obesity total guitar coal gravity carve slim jacket ruin rebuild ancestor numerous hour mortgage require herd maiden public ceiling pecan pickup shadow club", "wildlife deal decision shadow analysis adjust bulb skunk muscle mandate obesity total guitar coal gravity carve slim jacket ruin rebuild ancestor numerous hour mortgage require herd maiden public ceiling pecan pickup shadow club",
"wildlife deal beard romp alcohol space mild usual clothes union nuclear testify course research heat listen task location thank hospital slice smell failure fawn helpful priest ambition average recover lecture process dough stadium" "wildlife deal beard romp alcohol space mild usual clothes union nuclear testify course research heat listen task location thank hospital slice smell failure fawn helpful priest ambition average recover lecture process dough stadium",
], ],
"" "",
], ],
[ [
[ [
@ -248,35 +248,35 @@ vectors = [
"wildlife deal decision scared acne fatal snake paces obtain election dryer dominant romp tactics railroad marvel trust helpful flip peanut theory theater photo luck install entrance taxi step oven network dictate intimate listen", "wildlife deal decision scared acne fatal snake paces obtain election dryer dominant romp tactics railroad marvel trust helpful flip peanut theory theater photo luck install entrance taxi step oven network dictate intimate listen",
"wildlife deal ceramic scatter argue equip vampire together ruin reject literary rival distance aquatic agency teammate rebound false argue miracle stay again blessing peaceful unknown cover beard acid island language debris industry idle", "wildlife deal ceramic scatter argue equip vampire together ruin reject literary rival distance aquatic agency teammate rebound false argue miracle stay again blessing peaceful unknown cover beard acid island language debris industry idle",
"wildlife deal ceramic snake agree voter main lecture axis kitchen physics arcade velvet spine idea scroll promise platform firm sharp patrol divorce ancestor fantasy forbid goat ajar believe swimming cowboy symbolic plastic spelling", "wildlife deal ceramic snake agree voter main lecture axis kitchen physics arcade velvet spine idea scroll promise platform firm sharp patrol divorce ancestor fantasy forbid goat ajar believe swimming cowboy symbolic plastic spelling",
"wildlife deal decision shadow analysis adjust bulb skunk muscle mandate obesity total guitar coal gravity carve slim jacket ruin rebuild ancestor numerous hour mortgage require herd maiden public ceiling pecan pickup shadow club" "wildlife deal decision shadow analysis adjust bulb skunk muscle mandate obesity total guitar coal gravity carve slim jacket ruin rebuild ancestor numerous hour mortgage require herd maiden public ceiling pecan pickup shadow club",
], ],
"5385577c8cfc6c1a8aa0f7f10ecde0a3318493262591e78b8c14c6686167123b" "5385577c8cfc6c1a8aa0f7f10ecde0a3318493262591e78b8c14c6686167123b",
], ],
[ [
[ [
"wildlife deal decision scared acne fatal snake paces obtain election dryer dominant romp tactics railroad marvel trust helpful flip peanut theory theater photo luck install entrance taxi step oven network dictate intimate listen", "wildlife deal decision scared acne fatal snake paces obtain election dryer dominant romp tactics railroad marvel trust helpful flip peanut theory theater photo luck install entrance taxi step oven network dictate intimate listen",
"wildlife deal beard romp alcohol space mild usual clothes union nuclear testify course research heat listen task location thank hospital slice smell failure fawn helpful priest ambition average recover lecture process dough stadium", "wildlife deal beard romp alcohol space mild usual clothes union nuclear testify course research heat listen task location thank hospital slice smell failure fawn helpful priest ambition average recover lecture process dough stadium",
"wildlife deal decision smug ancestor genuine move huge cubic strategy smell game costume extend swimming false desire fake traffic vegan senior twice timber submit leader payroll fraction apart exact forward pulse tidy install" "wildlife deal decision smug ancestor genuine move huge cubic strategy smell game costume extend swimming false desire fake traffic vegan senior twice timber submit leader payroll fraction apart exact forward pulse tidy install",
], ],
"5385577c8cfc6c1a8aa0f7f10ecde0a3318493262591e78b8c14c6686167123b" "5385577c8cfc6c1a8aa0f7f10ecde0a3318493262591e78b8c14c6686167123b",
], ],
[ [
[ [
"wildlife deal beard romp alcohol space mild usual clothes union nuclear testify course research heat listen task location thank hospital slice smell failure fawn helpful priest ambition average recover lecture process dough stadium", "wildlife deal beard romp alcohol space mild usual clothes union nuclear testify course research heat listen task location thank hospital slice smell failure fawn helpful priest ambition average recover lecture process dough stadium",
"wildlife deal acrobat romp anxiety axis starting require metric flexible geology game drove editor edge screw helpful have huge holy making pitch unknown carve holiday numb glasses survive already tenant adapt goat fangs" "wildlife deal acrobat romp anxiety axis starting require metric flexible geology game drove editor edge screw helpful have huge holy making pitch unknown carve holiday numb glasses survive already tenant adapt goat fangs",
], ],
"5385577c8cfc6c1a8aa0f7f10ecde0a3318493262591e78b8c14c6686167123b" "5385577c8cfc6c1a8aa0f7f10ecde0a3318493262591e78b8c14c6686167123b",
], ],
[ [
[ [
"junk necklace academic academic acne isolate join hesitate lunar roster dough calcium chemical ladybug amount mobile glasses verify cylinder" "junk necklace academic academic acne isolate join hesitate lunar roster dough calcium chemical ladybug amount mobile glasses verify cylinder"
], ],
"" "",
], ],
[ [
[ [
"fraction necklace academic academic award teammate mouse regular testify coding building member verdict purchase blind camera duration email prepare spirit quarter" "fraction necklace academic academic award teammate mouse regular testify coding building member verdict purchase blind camera duration email prepare spirit quarter"
], ],
"" "",
] ],
] ]

View File

@ -10,7 +10,7 @@ if not utils.BITCOIN_ONLY:
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin") @unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestBinanceAddress(unittest.TestCase): class TestBinanceAddress(unittest.TestCase):
def test_privkey_to_address(self): def test_privkey_to_address(self):
#source of test data - binance javascript SDK # source of test data - binance javascript SDK
privkey = "90335b9d2153ad1a9799a3ccc070bd64b4164e9642ee1dd48053c33f9a3a05e9" privkey = "90335b9d2153ad1a9799a3ccc070bd64b4164e9642ee1dd48053c33f9a3a05e9"
expected_address = "tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd" expected_address = "tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd"
@ -20,5 +20,5 @@ class TestBinanceAddress(unittest.TestCase):
self.assertEqual(address, expected_address) self.assertEqual(address, expected_address)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -26,19 +26,30 @@ class TestBinanceSign(unittest.TestCase):
# https://github.com/binance-chain/javascript-sdk/blob/master/__tests__/fixtures/placeOrder.json # https://github.com/binance-chain/javascript-sdk/blob/master/__tests__/fixtures/placeOrder.json
json_msg = '{"account_number":"34","chain_id":"Binance-Chain-Nile","data":null,"memo":"","msgs":[{"id":"BA36F0FAD74D8F41045463E4774F328F4AF779E5-33","ordertype":2,"price":100000000,"quantity":100000000,"sender":"tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd","side":1,"symbol":"ADA.B-B63_BNB","timeinforce":1}],"sequence":"32","source":"1"}' json_msg = '{"account_number":"34","chain_id":"Binance-Chain-Nile","data":null,"memo":"","msgs":[{"id":"BA36F0FAD74D8F41045463E4774F328F4AF779E5-33","ordertype":2,"price":100000000,"quantity":100000000,"sender":"tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd","side":1,"symbol":"ADA.B-B63_BNB","timeinforce":1}],"sequence":"32","source":"1"}'
expected_signature = "851fc9542342321af63ecbba7d3ece545f2a42bad01ba32cff5535b18e54b6d3106e10b6a4525993d185a1443d9a125186960e028eabfdd8d76cf70a3a7e3100" expected_signature = "851fc9542342321af63ecbba7d3ece545f2a42bad01ba32cff5535b18e54b6d3106e10b6a4525993d185a1443d9a125186960e028eabfdd8d76cf70a3a7e3100"
public_key = "029729a52e4e3c2b4a4e52aa74033eedaf8ba1df5ab6d1f518fd69e67bbd309b0e" public_key = (
"029729a52e4e3c2b4a4e52aa74033eedaf8ba1df5ab6d1f518fd69e67bbd309b0e"
)
private_key = "90335b9d2153ad1a9799a3ccc070bd64b4164e9642ee1dd48053c33f9a3a05e9" private_key = "90335b9d2153ad1a9799a3ccc070bd64b4164e9642ee1dd48053c33f9a3a05e9"
# Testing data for object creation is decoded from json_msg # Testing data for object creation is decoded from json_msg
envelope = BinanceSignTx(msg_count=1, account_number=34, chain_id="Binance-Chain-Nile", memo="", sequence=32, source=1) envelope = BinanceSignTx(
msg = BinanceOrderMsg(id="BA36F0FAD74D8F41045463E4774F328F4AF779E5-33", msg_count=1,
account_number=34,
chain_id="Binance-Chain-Nile",
memo="",
sequence=32,
source=1,
)
msg = BinanceOrderMsg(
id="BA36F0FAD74D8F41045463E4774F328F4AF779E5-33",
ordertype=2, ordertype=2,
price=100000000, price=100000000,
quantity=100000000, quantity=100000000,
sender="tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd", sender="tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd",
side=1, side=1,
symbol="ADA.B-B63_BNB", symbol="ADA.B-B63_BNB",
timeinforce=1) timeinforce=1,
)
msg_json = produce_json_for_signing(envelope, msg) msg_json = produce_json_for_signing(envelope, msg)
@ -46,8 +57,12 @@ class TestBinanceSign(unittest.TestCase):
self.assertEqual(msg_json, json_msg) self.assertEqual(msg_json, json_msg)
# verify signature against public key # verify signature against public key
signature = generate_content_signature(msg_json.encode(), unhexlify(private_key)) signature = generate_content_signature(
self.assertTrue(verify_content_signature(unhexlify(public_key), signature, json_msg)) msg_json.encode(), unhexlify(private_key)
)
self.assertTrue(
verify_content_signature(unhexlify(public_key), signature, json_msg)
)
# check if the signed data is the same as test vector # check if the signed data is the same as test vector
self.assertEqual(signature, unhexlify(expected_signature)) self.assertEqual(signature, unhexlify(expected_signature))
@ -57,14 +72,25 @@ class TestBinanceSign(unittest.TestCase):
# https://github.com/binance-chain/javascript-sdk/blob/master/__tests__/fixtures/cancelOrder.json # https://github.com/binance-chain/javascript-sdk/blob/master/__tests__/fixtures/cancelOrder.json
json_msg = '{"account_number":"34","chain_id":"Binance-Chain-Nile","data":null,"memo":"","msgs":[{"refid":"BA36F0FAD74D8F41045463E4774F328F4AF779E5-29","sender":"tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd","symbol":"BCHSV.B-10F_BNB"}],"sequence":"33","source":"1"}' json_msg = '{"account_number":"34","chain_id":"Binance-Chain-Nile","data":null,"memo":"","msgs":[{"refid":"BA36F0FAD74D8F41045463E4774F328F4AF779E5-29","sender":"tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd","symbol":"BCHSV.B-10F_BNB"}],"sequence":"33","source":"1"}'
expected_signature = "d93fb0402b2b30e7ea08e123bb139ad68bf0a1577f38592eb22d11e127f09bbd3380f29b4bf15bdfa973454c5c8ed444f2e256e956fe98cfd21e886a946e21e5" expected_signature = "d93fb0402b2b30e7ea08e123bb139ad68bf0a1577f38592eb22d11e127f09bbd3380f29b4bf15bdfa973454c5c8ed444f2e256e956fe98cfd21e886a946e21e5"
public_key = "029729a52e4e3c2b4a4e52aa74033eedaf8ba1df5ab6d1f518fd69e67bbd309b0e" public_key = (
"029729a52e4e3c2b4a4e52aa74033eedaf8ba1df5ab6d1f518fd69e67bbd309b0e"
)
private_key = "90335b9d2153ad1a9799a3ccc070bd64b4164e9642ee1dd48053c33f9a3a05e9" private_key = "90335b9d2153ad1a9799a3ccc070bd64b4164e9642ee1dd48053c33f9a3a05e9"
# Testing data for object creation is decoded from json_msg # Testing data for object creation is decoded from json_msg
envelope = BinanceSignTx(msg_count=1, account_number=34, chain_id="Binance-Chain-Nile", memo="", sequence=33, source=1) envelope = BinanceSignTx(
msg = BinanceCancelMsg(refid="BA36F0FAD74D8F41045463E4774F328F4AF779E5-29", msg_count=1,
account_number=34,
chain_id="Binance-Chain-Nile",
memo="",
sequence=33,
source=1,
)
msg = BinanceCancelMsg(
refid="BA36F0FAD74D8F41045463E4774F328F4AF779E5-29",
sender="tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd", sender="tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd",
symbol="BCHSV.B-10F_BNB") symbol="BCHSV.B-10F_BNB",
)
msg_json = produce_json_for_signing(envelope, msg) msg_json = produce_json_for_signing(envelope, msg)
@ -72,10 +98,14 @@ class TestBinanceSign(unittest.TestCase):
self.assertEqual(msg_json, json_msg) self.assertEqual(msg_json, json_msg)
# verify signature against public key # verify signature against public key
signature = generate_content_signature(msg_json.encode(), unhexlify(private_key)) signature = generate_content_signature(
self.assertTrue(verify_content_signature(unhexlify(public_key), signature, json_msg)) msg_json.encode(), unhexlify(private_key)
)
self.assertTrue(
verify_content_signature(unhexlify(public_key), signature, json_msg)
)
#check if the signed data is the same as test vector # check if the signed data is the same as test vector
self.assertEqual(signature, unhexlify(expected_signature)) self.assertEqual(signature, unhexlify(expected_signature))
def test_transfer_signature(self): def test_transfer_signature(self):
@ -83,14 +113,27 @@ class TestBinanceSign(unittest.TestCase):
# https://github.com/binance-chain/javascript-sdk/blob/master/__tests__/fixtures/transfer.json # https://github.com/binance-chain/javascript-sdk/blob/master/__tests__/fixtures/transfer.json
json_msg = '{"account_number":"34","chain_id":"Binance-Chain-Nile","data":null,"memo":"test","msgs":[{"inputs":[{"address":"tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd","coins":[{"amount":1000000000,"denom":"BNB"}]}],"outputs":[{"address":"tbnb1ss57e8sa7xnwq030k2ctr775uac9gjzglqhvpy","coins":[{"amount":1000000000,"denom":"BNB"}]}]}],"sequence":"31","source":"1"}' json_msg = '{"account_number":"34","chain_id":"Binance-Chain-Nile","data":null,"memo":"test","msgs":[{"inputs":[{"address":"tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd","coins":[{"amount":1000000000,"denom":"BNB"}]}],"outputs":[{"address":"tbnb1ss57e8sa7xnwq030k2ctr775uac9gjzglqhvpy","coins":[{"amount":1000000000,"denom":"BNB"}]}]}],"sequence":"31","source":"1"}'
expected_signature = "faf5b908d6c4ec0c7e2e7d8f7e1b9ca56ac8b1a22b01655813c62ce89bf84a4c7b14f58ce51e85d64c13f47e67d6a9187b8f79f09e0a9b82019f47ae190a4db3" expected_signature = "faf5b908d6c4ec0c7e2e7d8f7e1b9ca56ac8b1a22b01655813c62ce89bf84a4c7b14f58ce51e85d64c13f47e67d6a9187b8f79f09e0a9b82019f47ae190a4db3"
public_key = "029729a52e4e3c2b4a4e52aa74033eedaf8ba1df5ab6d1f518fd69e67bbd309b0e" public_key = (
"029729a52e4e3c2b4a4e52aa74033eedaf8ba1df5ab6d1f518fd69e67bbd309b0e"
)
private_key = "90335b9d2153ad1a9799a3ccc070bd64b4164e9642ee1dd48053c33f9a3a05e9" private_key = "90335b9d2153ad1a9799a3ccc070bd64b4164e9642ee1dd48053c33f9a3a05e9"
# Testing data for object creation is decoded from json_msg # Testing data for object creation is decoded from json_msg
envelope = BinanceSignTx(msg_count=1, account_number=34, chain_id="Binance-Chain-Nile", memo="test", sequence=31, source=1) envelope = BinanceSignTx(
msg_count=1,
account_number=34,
chain_id="Binance-Chain-Nile",
memo="test",
sequence=31,
source=1,
)
coin = BinanceCoin(denom="BNB", amount=1000000000) coin = BinanceCoin(denom="BNB", amount=1000000000)
first_input = BinanceInputOutput(address="tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd", coins=[coin]) first_input = BinanceInputOutput(
first_output = BinanceInputOutput(address="tbnb1ss57e8sa7xnwq030k2ctr775uac9gjzglqhvpy", coins=[coin]) address="tbnb1hgm0p7khfk85zpz5v0j8wnej3a90w709zzlffd", coins=[coin]
)
first_output = BinanceInputOutput(
address="tbnb1ss57e8sa7xnwq030k2ctr775uac9gjzglqhvpy", coins=[coin]
)
msg = BinanceTransferMsg(inputs=[first_input], outputs=[first_output]) msg = BinanceTransferMsg(inputs=[first_input], outputs=[first_output])
msg_json = produce_json_for_signing(envelope, msg) msg_json = produce_json_for_signing(envelope, msg)
@ -99,17 +142,23 @@ class TestBinanceSign(unittest.TestCase):
self.assertEqual(msg_json, json_msg) self.assertEqual(msg_json, json_msg)
# verify signature against public key # verify signature against public key
signature = generate_content_signature(msg_json.encode(), unhexlify(private_key)) signature = generate_content_signature(
self.assertTrue(verify_content_signature(unhexlify(public_key), signature, json_msg)) msg_json.encode(), unhexlify(private_key)
)
self.assertTrue(
verify_content_signature(unhexlify(public_key), signature, json_msg)
)
# check if the signed data is the same as test vector # check if the signed data is the same as test vector
self.assertEqual(signature, unhexlify(expected_signature)) self.assertEqual(signature, unhexlify(expected_signature))
def verify_content_signature( def verify_content_signature(
public_key: bytes, signature: bytes, unsigned_data: bytes public_key: bytes, signature: bytes, unsigned_data: bytes
) -> bool: ) -> bool:
msghash = sha256(unsigned_data).digest() msghash = sha256(unsigned_data).digest()
return secp256k1.verify(public_key, signature, msghash) return secp256k1.verify(public_key, signature, msghash)
if __name__ == '__main__':
if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -8,8 +8,10 @@ from trezor.utils import HashWriter
from apps.common import coins from apps.common import coins
from apps.bitcoin.addresses import * from apps.bitcoin.addresses import *
from apps.bitcoin.addresses import ( from apps.bitcoin.addresses import (
_address_p2wsh, _address_p2wsh_in_p2sh, _address_p2wsh,
_address_multisig_p2wsh_in_p2sh, _address_multisig_p2sh _address_p2wsh_in_p2sh,
_address_multisig_p2wsh_in_p2sh,
_address_multisig_p2sh,
) )
from apps.bitcoin.keychain import validate_path_against_script_type from apps.bitcoin.keychain import validate_path_against_script_type
from apps.bitcoin.writers import * from apps.bitcoin.writers import *
@ -25,74 +27,80 @@ class TestAddress(unittest.TestCase):
# pylint: disable=C0301 # pylint: disable=C0301
def test_p2wpkh_in_p2sh_address(self): def test_p2wpkh_in_p2sh_address(self):
coin = coins.by_name('Testnet') coin = coins.by_name("Testnet")
address = address_p2wpkh_in_p2sh( address = address_p2wpkh_in_p2sh(
unhexlify('03a1af804ac108a8a51782198c2d034b28bf90c8803f5a53f76276fa69a4eae77f'), unhexlify(
coin "03a1af804ac108a8a51782198c2d034b28bf90c8803f5a53f76276fa69a4eae77f"
),
coin,
) )
self.assertEqual(address, '2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2') self.assertEqual(address, "2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2")
def test_p2wpkh_in_p2sh_node_derive_address(self): def test_p2wpkh_in_p2sh_node_derive_address(self):
coin = coins.by_name('Testnet') coin = coins.by_name("Testnet")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
root = bip32.from_seed(seed, 'secp256k1') root = bip32.from_seed(seed, "secp256k1")
node = node_derive(root, [H_(49), H_(1), H_(0), 1, 0]) node = node_derive(root, [H_(49), H_(1), H_(0), 1, 0])
address = address_p2wpkh_in_p2sh(node.public_key(), coin) address = address_p2wpkh_in_p2sh(node.public_key(), coin)
self.assertEqual(address, '2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX') self.assertEqual(address, "2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX")
node = node_derive(root, [H_(49), H_(1), H_(0), 1, 1]) node = node_derive(root, [H_(49), H_(1), H_(0), 1, 1])
address = address_p2wpkh_in_p2sh(node.public_key(), coin) address = address_p2wpkh_in_p2sh(node.public_key(), coin)
self.assertEqual(address, '2NFWLCJQBSpz1oUJwwLpX8ECifFWGznBVqs') self.assertEqual(address, "2NFWLCJQBSpz1oUJwwLpX8ECifFWGznBVqs")
node = node_derive(root, [H_(49), H_(1), H_(0), 0, 0]) node = node_derive(root, [H_(49), H_(1), H_(0), 0, 0])
address = address_p2wpkh_in_p2sh(node.public_key(), coin) address = address_p2wpkh_in_p2sh(node.public_key(), coin)
self.assertEqual(address, '2N4Q5FhU2497BryFfUgbqkAJE87aKHUhXMp') self.assertEqual(address, "2N4Q5FhU2497BryFfUgbqkAJE87aKHUhXMp")
def test_p2wpkh_address(self): def test_p2wpkh_address(self):
# test data from https://bc-2.jp/tools/bech32demo/index.html # test data from https://bc-2.jp/tools/bech32demo/index.html
coin = coins.by_name('Testnet') coin = coins.by_name("Testnet")
address = address_p2wpkh( address = address_p2wpkh(
unhexlify('0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'), unhexlify(
coin "0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"
),
coin,
) )
self.assertEqual(address, 'tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx') self.assertEqual(address, "tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx")
def test_p2sh_address(self): def test_p2sh_address(self):
coin = coins.by_name('Testnet') coin = coins.by_name("Testnet")
address = address_p2sh( address = address_p2sh(
unhexlify('7a55d61848e77ca266e79a39bfc85c580a6426c9'), unhexlify("7a55d61848e77ca266e79a39bfc85c580a6426c9"), coin
coin
) )
self.assertEqual(address, '2N4Q5FhU2497BryFfUgbqkAJE87aKHUhXMp') self.assertEqual(address, "2N4Q5FhU2497BryFfUgbqkAJE87aKHUhXMp")
def test_p2wsh_address(self): def test_p2wsh_address(self):
coin = coins.by_name('Testnet') coin = coins.by_name("Testnet")
# pubkey OP_CHECKSIG # pubkey OP_CHECKSIG
script = unhexlify('210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac') script = unhexlify(
"210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac"
)
h = HashWriter(sha256()) h = HashWriter(sha256())
write_bytes_unchecked(h, script) write_bytes_unchecked(h, script)
address = _address_p2wsh( address = _address_p2wsh(h.get_digest(), coin.bech32_prefix)
h.get_digest(), self.assertEqual(
coin.bech32_prefix address, "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7"
) )
self.assertEqual(address, 'tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7')
def test_p2wsh_in_p2sh_address(self): def test_p2wsh_in_p2sh_address(self):
coin = coins.by_name('Bitcoin') coin = coins.by_name("Bitcoin")
# test data from Mastering Bitcoin # test data from Mastering Bitcoin
address = _address_p2wsh_in_p2sh( address = _address_p2wsh_in_p2sh(
unhexlify('9592d601848d04b172905e0ddb0adde59f1590f1e553ffc81ddc4b0ed927dd73'), unhexlify(
coin "9592d601848d04b172905e0ddb0adde59f1590f1e553ffc81ddc4b0ed927dd73"
),
coin,
) )
self.assertEqual(address, '3Dwz1MXhM6EfFoJChHCxh1jWHb8GQqRenG') self.assertEqual(address, "3Dwz1MXhM6EfFoJChHCxh1jWHb8GQqRenG")
def test_multisig_address_p2sh(self): def test_multisig_address_p2sh(self):
# # test data from # # test data from
@ -107,13 +115,17 @@ class TestAddress(unittest.TestCase):
# address = _address_multisig_p2sh(pubkeys, 2, coin.address_type_p2sh) # address = _address_multisig_p2sh(pubkeys, 2, coin.address_type_p2sh)
# self.assertEqual(address, '347N1Thc213QqfYCz3PZkjoJpNv5b14kBd') # self.assertEqual(address, '347N1Thc213QqfYCz3PZkjoJpNv5b14kBd')
coin = coins.by_name('Bitcoin') coin = coins.by_name("Bitcoin")
pubkeys = [ pubkeys = [
unhexlify('02fe6f0a5a297eb38c391581c4413e084773ea23954d93f7753db7dc0adc188b2f'), unhexlify(
unhexlify('02ff12471208c14bd580709cb2358d98975247d8765f92bc25eab3b2763ed605f8'), "02fe6f0a5a297eb38c391581c4413e084773ea23954d93f7753db7dc0adc188b2f"
),
unhexlify(
"02ff12471208c14bd580709cb2358d98975247d8765f92bc25eab3b2763ed605f8"
),
] ]
address = _address_multisig_p2sh(pubkeys, 2, coin) address = _address_multisig_p2sh(pubkeys, 2, coin)
self.assertEqual(address, '39bgKC7RFbpoCRbtD5KEdkYKtNyhpsNa3Z') self.assertEqual(address, "39bgKC7RFbpoCRbtD5KEdkYKtNyhpsNa3Z")
for invalid_m in (-1, 0, len(pubkeys) + 1, 16): for invalid_m in (-1, 0, len(pubkeys) + 1, 16):
with self.assertRaises(wire.DataError): with self.assertRaises(wire.DataError):
@ -122,14 +134,18 @@ class TestAddress(unittest.TestCase):
def test_multisig_address_p2wsh_in_p2sh(self): def test_multisig_address_p2wsh_in_p2sh(self):
# test data from # test data from
# https://bitcoin.stackexchange.com/questions/62656/generate-a-p2sh-p2wsh-address-and-spend-output-sent-to-it # https://bitcoin.stackexchange.com/questions/62656/generate-a-p2sh-p2wsh-address-and-spend-output-sent-to-it
coin = coins.by_name('Testnet') coin = coins.by_name("Testnet")
pubkeys = [ pubkeys = [
unhexlify('020b020e27e49f049eac10010506499a84e1d59a500cd3680e9ded580df9a107b0'), unhexlify(
unhexlify('0320ce424c6d61f352ccfea60d209651672cfb03b2dc77d1d64d3ba519aec756ae'), "020b020e27e49f049eac10010506499a84e1d59a500cd3680e9ded580df9a107b0"
),
unhexlify(
"0320ce424c6d61f352ccfea60d209651672cfb03b2dc77d1d64d3ba519aec756ae"
),
] ]
address = _address_multisig_p2wsh_in_p2sh(pubkeys, 2, coin) address = _address_multisig_p2wsh_in_p2sh(pubkeys, 2, coin)
self.assertEqual(address, '2MsZ2fpGKUydzY62v6trPHR8eCx5JTy1Dpa') self.assertEqual(address, "2MsZ2fpGKUydzY62v6trPHR8eCx5JTy1Dpa")
# def test_multisig_address_p2wsh(self): # def test_multisig_address_p2wsh(self):
# todo couldn't find test data # todo couldn't find test data
@ -143,20 +159,53 @@ class TestAddress(unittest.TestCase):
def test_paths_btc(self): def test_paths_btc(self):
incorrect_derivation_paths = [ incorrect_derivation_paths = [
([H_(49)], InputScriptType.SPENDP2SHWITNESS), # invalid length ([H_(49)], InputScriptType.SPENDP2SHWITNESS), # invalid length
([H_(49), H_(0), H_(0), H_(0), H_(0)], InputScriptType.SPENDP2SHWITNESS), # too many HARDENED (
[H_(49), H_(0), H_(0), H_(0), H_(0)],
InputScriptType.SPENDP2SHWITNESS,
), # too many HARDENED
([H_(49), H_(0)], InputScriptType.SPENDP2SHWITNESS), # invalid length ([H_(49), H_(0)], InputScriptType.SPENDP2SHWITNESS), # invalid length
([H_(49), H_(0), H_(0), 0, 0, 0, 0], InputScriptType.SPENDP2SHWITNESS), # invalid length (
([H_(49), H_(123), H_(0), 0, 0, 0], InputScriptType.SPENDP2SHWITNESS), # invalid slip44 [H_(49), H_(0), H_(0), 0, 0, 0, 0],
([H_(49), H_(0), H_(1000), 0, 0], InputScriptType.SPENDP2SHWITNESS), # account too high InputScriptType.SPENDP2SHWITNESS,
([H_(49), H_(0), H_(1), 2, 0], InputScriptType.SPENDP2SHWITNESS), # invalid y ), # invalid length
([H_(49), H_(0), H_(1), 0, 10000000], InputScriptType.SPENDP2SHWITNESS), # address index too high (
([H_(84), H_(0), H_(1), 0, 10000000], InputScriptType.SPENDWITNESS), # address index too high [H_(49), H_(123), H_(0), 0, 0, 0],
([H_(49), H_(0), H_(1), 0, 0], InputScriptType.SPENDWITNESS), # invalid input type InputScriptType.SPENDP2SHWITNESS,
([H_(84), H_(0), H_(1), 0, 0], InputScriptType.SPENDP2SHWITNESS), # invalid input type ), # invalid slip44
([H_(49), H_(0), H_(5), 0, 10], InputScriptType.SPENDMULTISIG), # invalid input type (
[H_(49), H_(0), H_(1000), 0, 0],
InputScriptType.SPENDP2SHWITNESS,
), # account too high
(
[H_(49), H_(0), H_(1), 2, 0],
InputScriptType.SPENDP2SHWITNESS,
), # invalid y
(
[H_(49), H_(0), H_(1), 0, 10000000],
InputScriptType.SPENDP2SHWITNESS,
), # address index too high
(
[H_(84), H_(0), H_(1), 0, 10000000],
InputScriptType.SPENDWITNESS,
), # address index too high
(
[H_(49), H_(0), H_(1), 0, 0],
InputScriptType.SPENDWITNESS,
), # invalid input type
(
[H_(84), H_(0), H_(1), 0, 0],
InputScriptType.SPENDP2SHWITNESS,
), # invalid input type
(
[H_(49), H_(0), H_(5), 0, 10],
InputScriptType.SPENDMULTISIG,
), # invalid input type
] ]
correct_derivation_paths = [ correct_derivation_paths = [
([H_(44), H_(0), H_(0), 0, 0], InputScriptType.SPENDADDRESS), # btc is segwit coin, but non-segwit paths are allowed as well (
[H_(44), H_(0), H_(0), 0, 0],
InputScriptType.SPENDADDRESS,
), # btc is segwit coin, but non-segwit paths are allowed as well
([H_(44), H_(0), H_(0), 0, 1], InputScriptType.SPENDADDRESS), ([H_(44), H_(0), H_(0), 0, 1], InputScriptType.SPENDADDRESS),
([H_(44), H_(0), H_(0), 1, 0], InputScriptType.SPENDADDRESS), ([H_(44), H_(0), H_(0), 1, 0], InputScriptType.SPENDADDRESS),
([H_(49), H_(0), H_(0), 0, 0], InputScriptType.SPENDP2SHWITNESS), ([H_(49), H_(0), H_(0), 0, 0], InputScriptType.SPENDP2SHWITNESS),
@ -169,7 +218,7 @@ class TestAddress(unittest.TestCase):
([H_(84), H_(0), H_(5), 0, 10], InputScriptType.SPENDWITNESS), ([H_(84), H_(0), H_(5), 0, 10], InputScriptType.SPENDWITNESS),
([H_(48), H_(0), H_(5), H_(0), 0, 10], InputScriptType.SPENDMULTISIG), ([H_(48), H_(0), H_(5), H_(0), 0, 10], InputScriptType.SPENDMULTISIG),
] ]
coin = coins.by_name('Bitcoin') coin = coins.by_name("Bitcoin")
for path, input_type in incorrect_derivation_paths: for path, input_type in incorrect_derivation_paths:
self.assertFalse(self.validate(path, coin, input_type)) self.assertFalse(self.validate(path, coin, input_type))
@ -177,24 +226,59 @@ class TestAddress(unittest.TestCase):
for path, input_type in correct_derivation_paths: for path, input_type in correct_derivation_paths:
self.assertTrue(self.validate(path, coin, input_type)) self.assertTrue(self.validate(path, coin, input_type))
self.assertTrue(self.validate([H_(44), H_(0), H_(0), 0, 0], coin, InputScriptType.SPENDADDRESS)) self.assertTrue(
self.assertFalse(self.validate([H_(44), H_(0), H_(0), 0, 0], coin, InputScriptType.SPENDWITNESS)) self.validate(
[H_(44), H_(0), H_(0), 0, 0], coin, InputScriptType.SPENDADDRESS
)
)
self.assertFalse(
self.validate(
[H_(44), H_(0), H_(0), 0, 0], coin, InputScriptType.SPENDWITNESS
)
)
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin") @unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
def test_paths_bch(self): def test_paths_bch(self):
incorrect_derivation_paths = [ incorrect_derivation_paths = [
([H_(44)], InputScriptType.SPENDADDRESS), # invalid length ([H_(44)], InputScriptType.SPENDADDRESS), # invalid length
([H_(44), H_(145), H_(0), H_(0), H_(0)], InputScriptType.SPENDADDRESS), # too many HARDENED (
([H_(49), H_(145), H_(0), 0, 0], InputScriptType.SPENDP2SHWITNESS), # bch is not segwit coin so 49' is not allowed [H_(44), H_(145), H_(0), H_(0), H_(0)],
([H_(84), H_(145), H_(1), 0, 1], InputScriptType.SPENDWITNESS), # and neither is 84' InputScriptType.SPENDADDRESS,
), # too many HARDENED
(
[H_(49), H_(145), H_(0), 0, 0],
InputScriptType.SPENDP2SHWITNESS,
), # bch is not segwit coin so 49' is not allowed
(
[H_(84), H_(145), H_(1), 0, 1],
InputScriptType.SPENDWITNESS,
), # and neither is 84'
([H_(44), H_(145)], InputScriptType.SPENDADDRESS), # invalid length ([H_(44), H_(145)], InputScriptType.SPENDADDRESS), # invalid length
([H_(44), H_(145), H_(0), 0, 0, 0, 0], InputScriptType.SPENDADDRESS), # invalid length (
([H_(44), H_(123), H_(0), 0, 0, 0], InputScriptType.SPENDADDRESS), # invalid slip44 [H_(44), H_(145), H_(0), 0, 0, 0, 0],
([H_(44), H_(145), H_(1000), 0, 0], InputScriptType.SPENDADDRESS), # account too high InputScriptType.SPENDADDRESS,
), # invalid length
(
[H_(44), H_(123), H_(0), 0, 0, 0],
InputScriptType.SPENDADDRESS,
), # invalid slip44
(
[H_(44), H_(145), H_(1000), 0, 0],
InputScriptType.SPENDADDRESS,
), # account too high
([H_(44), H_(145), H_(1), 2, 0], InputScriptType.SPENDADDRESS), # invalid y ([H_(44), H_(145), H_(1), 2, 0], InputScriptType.SPENDADDRESS), # invalid y
([H_(44), H_(145), H_(1), 0, 10000000], InputScriptType.SPENDADDRESS), # address index too high (
([H_(84), H_(145), H_(1), 0, 10000000], InputScriptType.SPENDWITNESS), # address index too high [H_(44), H_(145), H_(1), 0, 10000000],
([H_(44), H_(145), H_(0), 0, 0], InputScriptType.SPENDWITNESS), # input type mismatch InputScriptType.SPENDADDRESS,
), # address index too high
(
[H_(84), H_(145), H_(1), 0, 10000000],
InputScriptType.SPENDWITNESS,
), # address index too high
(
[H_(44), H_(145), H_(0), 0, 0],
InputScriptType.SPENDWITNESS,
), # input type mismatch
] ]
correct_derivation_paths = [ correct_derivation_paths = [
([H_(44), H_(145), H_(0), 0, 0], InputScriptType.SPENDADDRESS), ([H_(44), H_(145), H_(0), 0, 0], InputScriptType.SPENDADDRESS),
@ -206,7 +290,7 @@ class TestAddress(unittest.TestCase):
([H_(48), H_(145), H_(5), H_(0), 0, 0], InputScriptType.SPENDMULTISIG), ([H_(48), H_(145), H_(5), H_(0), 0, 0], InputScriptType.SPENDMULTISIG),
([H_(48), H_(145), H_(5), H_(0), 0, 10], InputScriptType.SPENDMULTISIG), ([H_(48), H_(145), H_(5), H_(0), 0, 10], InputScriptType.SPENDMULTISIG),
] ]
coin = coins.by_name('Bcash') # segwit is disabled coin = coins.by_name("Bcash") # segwit is disabled
for path, input_type in incorrect_derivation_paths: for path, input_type in incorrect_derivation_paths:
self.assertFalse(self.validate(path, coin, input_type)) self.assertFalse(self.validate(path, coin, input_type))
@ -216,7 +300,10 @@ class TestAddress(unittest.TestCase):
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin") @unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
def test_paths_other(self): def test_paths_other(self):
incorrect_derivation_paths = [ incorrect_derivation_paths = [
([H_(44), H_(3), H_(0), 0, 0], InputScriptType.SPENDMULTISIG), # input type mismatch (
[H_(44), H_(3), H_(0), 0, 0],
InputScriptType.SPENDMULTISIG,
), # input type mismatch
] ]
correct_derivation_paths = [ correct_derivation_paths = [
([H_(44), H_(3), H_(0), 0, 0], InputScriptType.SPENDADDRESS), ([H_(44), H_(3), H_(0), 0, 0], InputScriptType.SPENDADDRESS),
@ -224,7 +311,7 @@ class TestAddress(unittest.TestCase):
([H_(44), H_(3), H_(0), 0, 1123], InputScriptType.SPENDADDRESS), ([H_(44), H_(3), H_(0), 0, 1123], InputScriptType.SPENDADDRESS),
([H_(44), H_(3), H_(0), 1, 44444], InputScriptType.SPENDADDRESS), ([H_(44), H_(3), H_(0), 1, 44444], InputScriptType.SPENDADDRESS),
] ]
coin = coins.by_name('Dogecoin') # segwit is disabled coin = coins.by_name("Dogecoin") # segwit is disabled
for path, input_type in correct_derivation_paths: for path, input_type in correct_derivation_paths:
self.assertTrue(self.validate(path, coin, input_type)) self.assertTrue(self.validate(path, coin, input_type))
@ -237,21 +324,34 @@ class TestAddress(unittest.TestCase):
from apps.common.paths import AlwaysMatchingSchema from apps.common.paths import AlwaysMatchingSchema
VECTORS = ( VECTORS = (
('Bitcoin', '1DyHzbQUoQEsLxJn6M7fMD8Xdt1XvNiwNE', '9cf7c230041d6ed95b8273bd32e023d3f227ec8c44257f6463c743a4b4add028'), (
('Testnet', 'mm6kLYbGEL1tGe4ZA8xacfgRPdW1NLjCbZ', '4375089e50423505dc3480e6e85b0ba37a52bd1e009db5d260b6329f22c950d9') "Bitcoin",
"1DyHzbQUoQEsLxJn6M7fMD8Xdt1XvNiwNE",
"9cf7c230041d6ed95b8273bd32e023d3f227ec8c44257f6463c743a4b4add028",
),
(
"Testnet",
"mm6kLYbGEL1tGe4ZA8xacfgRPdW1NLjCbZ",
"4375089e50423505dc3480e6e85b0ba37a52bd1e009db5d260b6329f22c950d9",
),
) )
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
for coin_name, address, mac in VECTORS: for coin_name, address, mac in VECTORS:
coin = coins.by_name(coin_name) coin = coins.by_name(coin_name)
mac = unhexlify(mac) mac = unhexlify(mac)
keychain = Keychain(seed, coin.curve_name, [AlwaysMatchingSchema], slip21_namespaces=[[b"SLIP-0024"]]) keychain = Keychain(
seed,
coin.curve_name,
[AlwaysMatchingSchema],
slip21_namespaces=[[b"SLIP-0024"]],
)
self.assertEqual(get_address_mac(address, coin.slip44, keychain), mac) self.assertEqual(get_address_mac(address, coin.slip44, keychain), mac)
check_address_mac(address, mac, coin.slip44, keychain) check_address_mac(address, mac, coin.slip44, keychain)
with self.assertRaises(wire.DataError): with self.assertRaises(wire.DataError):
mac = bytes([mac[0]^1]) + mac[1:] mac = bytes([mac[0] ^ 1]) + mac[1:]
check_address_mac(address, mac, coin.slip44, keychain) check_address_mac(address, mac, coin.slip44, keychain)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -17,68 +17,88 @@ class TestAddressGRS(unittest.TestCase):
# pylint: disable=C0301 # pylint: disable=C0301
def test_p2pkh_node_derive_address(self): def test_p2pkh_node_derive_address(self):
coin = coins.by_name('Groestlcoin') coin = coins.by_name("Groestlcoin")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
root = bip32.from_seed(seed, coin.curve_name) root = bip32.from_seed(seed, coin.curve_name)
node = node_derive(root, [44 | 0x80000000, 17 | 0x80000000, 0 | 0x80000000, 1, 0]) node = node_derive(
root, [44 | 0x80000000, 17 | 0x80000000, 0 | 0x80000000, 1, 0]
)
address = node.address(coin.address_type) # generate in trezor-crypto address = node.address(coin.address_type) # generate in trezor-crypto
self.assertEqual(address, 'FmRaqvVBRrAp2Umfqx9V1ectZy8gw54QDN') self.assertEqual(address, "FmRaqvVBRrAp2Umfqx9V1ectZy8gw54QDN")
address = address_pkh(node.public_key(), coin) # generate in trezor-core address = address_pkh(node.public_key(), coin) # generate in trezor-core
self.assertEqual(address, 'FmRaqvVBRrAp2Umfqx9V1ectZy8gw54QDN') self.assertEqual(address, "FmRaqvVBRrAp2Umfqx9V1ectZy8gw54QDN")
node = node_derive(root, [44 | 0x80000000, 17 | 0x80000000, 0 | 0x80000000, 1, 1]) node = node_derive(
root, [44 | 0x80000000, 17 | 0x80000000, 0 | 0x80000000, 1, 1]
)
address = node.address(coin.address_type) address = node.address(coin.address_type)
self.assertEqual(address, 'Fmhtxeh7YdCBkyQF7AQG4QnY8y3rJg89di') self.assertEqual(address, "Fmhtxeh7YdCBkyQF7AQG4QnY8y3rJg89di")
address = address_pkh(node.public_key(), coin) address = address_pkh(node.public_key(), coin)
self.assertEqual(address, 'Fmhtxeh7YdCBkyQF7AQG4QnY8y3rJg89di') self.assertEqual(address, "Fmhtxeh7YdCBkyQF7AQG4QnY8y3rJg89di")
node = node_derive(root, [44 | 0x80000000, 17 | 0x80000000, 0 | 0x80000000, 0, 0]) node = node_derive(
root, [44 | 0x80000000, 17 | 0x80000000, 0 | 0x80000000, 0, 0]
)
address = node.address(coin.address_type) address = node.address(coin.address_type)
self.assertEqual(address, 'Fj62rBJi8LvbmWu2jzkaUX1NFXLEqDLoZM') self.assertEqual(address, "Fj62rBJi8LvbmWu2jzkaUX1NFXLEqDLoZM")
address = address_pkh(node.public_key(), coin) address = address_pkh(node.public_key(), coin)
self.assertEqual(address, 'Fj62rBJi8LvbmWu2jzkaUX1NFXLEqDLoZM') self.assertEqual(address, "Fj62rBJi8LvbmWu2jzkaUX1NFXLEqDLoZM")
def test_p2wpkh_in_p2sh_node_derive_address(self): def test_p2wpkh_in_p2sh_node_derive_address(self):
coin = coins.by_name('Groestlcoin Testnet') coin = coins.by_name("Groestlcoin Testnet")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
root = bip32.from_seed(seed, coin.curve_name) root = bip32.from_seed(seed, coin.curve_name)
node = node_derive(root, [49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 0]) node = node_derive(
root, [49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 0]
)
address = address_p2wpkh_in_p2sh(node.public_key(), coin) address = address_p2wpkh_in_p2sh(node.public_key(), coin)
self.assertEqual(address, '2N1LGaGg836mqSQqiuUBLfcyGBhyZYBtBZ7') self.assertEqual(address, "2N1LGaGg836mqSQqiuUBLfcyGBhyZYBtBZ7")
node = node_derive(root, [49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 1]) node = node_derive(
root, [49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 1]
)
address = address_p2wpkh_in_p2sh(node.public_key(), coin) address = address_p2wpkh_in_p2sh(node.public_key(), coin)
self.assertEqual(address, '2NFWLCJQBSpz1oUJwwLpX8ECifFWGxQyzGu') self.assertEqual(address, "2NFWLCJQBSpz1oUJwwLpX8ECifFWGxQyzGu")
node = node_derive(root, [49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 0, 0]) node = node_derive(
root, [49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 0, 0]
)
address = address_p2wpkh_in_p2sh(node.public_key(), coin) address = address_p2wpkh_in_p2sh(node.public_key(), coin)
self.assertEqual(address, '2N4Q5FhU2497BryFfUgbqkAJE87aKDv3V3e') self.assertEqual(address, "2N4Q5FhU2497BryFfUgbqkAJE87aKDv3V3e")
def test_p2sh_address(self): def test_p2sh_address(self):
coin = coins.by_name('Groestlcoin Testnet') coin = coins.by_name("Groestlcoin Testnet")
address = address_p2sh(unhexlify('7a55d61848e77ca266e79a39bfc85c580a6426c9'), coin) address = address_p2sh(
self.assertEqual(address, '2N4Q5FhU2497BryFfUgbqkAJE87aKDv3V3e') unhexlify("7a55d61848e77ca266e79a39bfc85c580a6426c9"), coin
)
self.assertEqual(address, "2N4Q5FhU2497BryFfUgbqkAJE87aKDv3V3e")
def test_p2wpkh_node_derive_address(self): def test_p2wpkh_node_derive_address(self):
coin = coins.by_name('Groestlcoin') coin = coins.by_name("Groestlcoin")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
root = bip32.from_seed(seed, coin.curve_name) root = bip32.from_seed(seed, coin.curve_name)
node = node_derive(root, [84 | 0x80000000, 17 | 0x80000000, 0 | 0x80000000, 1, 0]) node = node_derive(
root, [84 | 0x80000000, 17 | 0x80000000, 0 | 0x80000000, 1, 0]
)
address = address_p2wpkh(node.public_key(), coin) address = address_p2wpkh(node.public_key(), coin)
self.assertEqual(address, 'grs1qzfpwn55tvkxcw0xwfa0g8k2gtlzlgkcq3z000e') self.assertEqual(address, "grs1qzfpwn55tvkxcw0xwfa0g8k2gtlzlgkcq3z000e")
node = node_derive(root, [84 | 0x80000000, 17 | 0x80000000, 0 | 0x80000000, 1, 1]) node = node_derive(
root, [84 | 0x80000000, 17 | 0x80000000, 0 | 0x80000000, 1, 1]
)
address = address_p2wpkh(node.public_key(), coin) address = address_p2wpkh(node.public_key(), coin)
self.assertEqual(address, 'grs1qxsgwl66tx7tsuwfm4kk5c5dh6tlfpr4qjqg6gg') self.assertEqual(address, "grs1qxsgwl66tx7tsuwfm4kk5c5dh6tlfpr4qjqg6gg")
node = node_derive(root, [84 | 0x80000000, 17 | 0x80000000, 0 | 0x80000000, 0, 0]) node = node_derive(
root, [84 | 0x80000000, 17 | 0x80000000, 0 | 0x80000000, 0, 0]
)
address = address_p2wpkh(node.public_key(), coin) address = address_p2wpkh(node.public_key(), coin)
self.assertEqual(address, 'grs1qw4teyraux2s77nhjdwh9ar8rl9dt7zww8r6lne') self.assertEqual(address, "grs1qw4teyraux2s77nhjdwh9ar8rl9dt7zww8r6lne")
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -22,17 +22,16 @@ from apps.bitcoin import writers
class TestApprover(unittest.TestCase): class TestApprover(unittest.TestCase):
def setUp(self): def setUp(self):
self.coin = coins.by_name('Bitcoin') self.coin = coins.by_name("Bitcoin")
self.fee_rate_percent = 0.3 self.fee_rate_percent = 0.3
self.no_fee_threshold=1000000 self.no_fee_threshold = 1000000
self.min_registrable_amount=5000 self.min_registrable_amount = 5000
self.coordinator_name = "www.example.com" self.coordinator_name = "www.example.com"
# Private key for signing and masking CoinJoin requests. # Private key for signing and masking CoinJoin requests.
# m/0h for "all all ... all" seed. # m/0h for "all all ... all" seed.
self.private_key = b'?S\ti\x8b\xc5o{,\xab\x03\x194\xea\xa8[_:\xeb\xdf\xce\xef\xe50\xf17D\x98`\xb9dj' self.private_key = b"?S\ti\x8b\xc5o{,\xab\x03\x194\xea\xa8[_:\xeb\xdf\xce\xef\xe50\xf17D\x98`\xb9dj"
self.node = bip32.HDNode( self.node = bip32.HDNode(
depth=0, depth=0,
@ -42,12 +41,16 @@ class TestApprover(unittest.TestCase):
private_key=b"\x01" * 32, private_key=b"\x01" * 32,
curve_name="secp256k1", curve_name="secp256k1",
) )
self.tweaked_node_pubkey = b"\x02" + bip340.tweak_public_key(self.node.public_key()[1:]) self.tweaked_node_pubkey = b"\x02" + bip340.tweak_public_key(
self.node.public_key()[1:]
)
self.msg_auth = AuthorizeCoinJoin( self.msg_auth = AuthorizeCoinJoin(
coordinator=self.coordinator_name, coordinator=self.coordinator_name,
max_rounds=10, max_rounds=10,
max_coordinator_fee_rate=int(self.fee_rate_percent * 10**FEE_RATE_DECIMALS), max_coordinator_fee_rate=int(
self.fee_rate_percent * 10**FEE_RATE_DECIMALS
),
max_fee_per_kvbyte=7000, max_fee_per_kvbyte=7000,
address_n=[H_(10025), H_(0), H_(0), H_(1)], address_n=[H_(10025), H_(0), H_(0), H_(1)],
coin_name=self.coin.coin_name, coin_name=self.coin.coin_name,
@ -59,7 +62,9 @@ class TestApprover(unittest.TestCase):
mask_public_key = secp256k1.publickey(self.private_key) mask_public_key = secp256k1.publickey(self.private_key)
coinjoin_flags = bytearray() coinjoin_flags = bytearray()
for txi in inputs: for txi in inputs:
shared_secret = secp256k1.multiply(self.private_key, self.tweaked_node_pubkey)[1:33] shared_secret = secp256k1.multiply(
self.private_key, self.tweaked_node_pubkey
)[1:33]
h_mask = HashWriter(sha256()) h_mask = HashWriter(sha256())
writers.write_bytes_fixed(h_mask, shared_secret, 32) writers.write_bytes_fixed(h_mask, shared_secret, 32)
writers.write_bytes_reversed(h_mask, txi.prev_hash, writers.TX_HASH_SIZE) writers.write_bytes_reversed(h_mask, txi.prev_hash, writers.TX_HASH_SIZE)
@ -71,11 +76,11 @@ class TestApprover(unittest.TestCase):
# Compute CoinJoin request signature. # Compute CoinJoin request signature.
h_request = HashWriter(sha256(b"CJR1")) h_request = HashWriter(sha256(b"CJR1"))
writers.write_bytes_prefixed( writers.write_bytes_prefixed(h_request, self.coordinator_name.encode())
h_request, self.coordinator_name.encode()
)
writers.write_uint32(h_request, self.coin.slip44) writers.write_uint32(h_request, self.coin.slip44)
writers.write_uint32(h_request, int(self.fee_rate_percent * 10**FEE_RATE_DECIMALS)) writers.write_uint32(
h_request, int(self.fee_rate_percent * 10**FEE_RATE_DECIMALS)
)
writers.write_uint64(h_request, self.no_fee_threshold) writers.write_uint64(h_request, self.no_fee_threshold)
writers.write_uint64(h_request, self.min_registrable_amount) writers.write_uint64(h_request, self.min_registrable_amount)
writers.write_bytes_fixed(h_request, mask_public_key, 33) writers.write_bytes_fixed(h_request, mask_public_key, 33)
@ -105,31 +110,34 @@ class TestApprover(unittest.TestCase):
amount=denomination, amount=denomination,
script_pubkey=bytes(22), script_pubkey=bytes(22),
script_type=InputScriptType.EXTERNAL, script_type=InputScriptType.EXTERNAL,
sequence=0xffffffff, sequence=0xFFFFFFFF,
witness="", witness="",
) for i in range(99) )
for i in range(99)
] ]
# Our input. # Our input.
inputs.insert(30, inputs.insert(
30,
TxInput( TxInput(
prev_hash=bytes(32), prev_hash=bytes(32),
prev_index=0, prev_index=0,
address_n=[H_(10025), H_(0), H_(0), H_(1), 0, 1], address_n=[H_(10025), H_(0), H_(0), H_(1), 0, 1],
amount=denomination, amount=denomination,
script_type=InputScriptType.SPENDTAPROOT, script_type=InputScriptType.SPENDTAPROOT,
sequence=0xffffffff, sequence=0xFFFFFFFF,
) ),
) )
# Other's CoinJoined outputs. # Other's CoinJoined outputs.
outputs = [ outputs = [
TxOutput( TxOutput(
address="", address="",
amount=denomination-fees, amount=denomination - fees,
script_type=OutputScriptType.PAYTOTAPROOT, script_type=OutputScriptType.PAYTOTAPROOT,
payment_req_index=0, payment_req_index=0,
) for i in range(99) )
for i in range(99)
] ]
# Our CoinJoined output. # Our CoinJoined output.
@ -138,10 +146,10 @@ class TestApprover(unittest.TestCase):
TxOutput( TxOutput(
address="", address="",
address_n=[H_(10025), H_(0), H_(0), H_(1), 0, 2], address_n=[H_(10025), H_(0), H_(0), H_(1), 0, 2],
amount=denomination-fees, amount=denomination - fees,
script_type=OutputScriptType.PAYTOTAPROOT, script_type=OutputScriptType.PAYTOTAPROOT,
payment_req_index=0, payment_req_index=0,
) ),
) )
# Coordinator's output. # Coordinator's output.
@ -155,7 +163,13 @@ class TestApprover(unittest.TestCase):
) )
coinjoin_req = self.make_coinjoin_request(inputs) coinjoin_req = self.make_coinjoin_request(inputs)
tx = SignTx(outputs_count=len(outputs), inputs_count=len(inputs), coin_name=self.coin.coin_name, lock_time=0, coinjoin_request=coinjoin_req) tx = SignTx(
outputs_count=len(outputs),
inputs_count=len(inputs),
coin_name=self.coin.coin_name,
lock_time=0,
coinjoin_request=coinjoin_req,
)
authorization = CoinJoinAuthorization(self.msg_auth) authorization = CoinJoinAuthorization(self.msg_auth)
approver = CoinJoinApprover(tx, self.coin, authorization) approver = CoinJoinApprover(tx, self.coin, authorization)
signer = Bitcoin(tx, None, self.coin, approver) signer = Bitcoin(tx, None, self.coin, approver)
@ -180,11 +194,17 @@ class TestApprover(unittest.TestCase):
prev_index=0, prev_index=0,
address_n=[H_(10025), H_(0), H_(0), H_(1), 0], address_n=[H_(10025), H_(0), H_(0), H_(1), 0],
amount=10000000, amount=10000000,
script_type=InputScriptType.SPENDTAPROOT script_type=InputScriptType.SPENDTAPROOT,
) )
coinjoin_req = self.make_coinjoin_request([txi]) coinjoin_req = self.make_coinjoin_request([txi])
tx = SignTx(outputs_count=201, inputs_count=100, coin_name=self.coin.coin_name, lock_time=0, coinjoin_request=coinjoin_req) tx = SignTx(
outputs_count=201,
inputs_count=100,
coin_name=self.coin.coin_name,
lock_time=0,
coinjoin_request=coinjoin_req,
)
authorization = CoinJoinAuthorization(self.msg_auth) authorization = CoinJoinAuthorization(self.msg_auth)
approver = CoinJoinApprover(tx, self.coin, authorization) approver = CoinJoinApprover(tx, self.coin, authorization)
@ -197,11 +217,17 @@ class TestApprover(unittest.TestCase):
prev_index=0, prev_index=0,
address_n=[H_(10025), H_(0), H_(1), H_(1), 0, 0], address_n=[H_(10025), H_(0), H_(1), H_(1), 0, 0],
amount=10000000, amount=10000000,
script_type=InputScriptType.SPENDTAPROOT script_type=InputScriptType.SPENDTAPROOT,
) )
coinjoin_req = self.make_coinjoin_request([txi]) coinjoin_req = self.make_coinjoin_request([txi])
tx = SignTx(outputs_count=201, inputs_count=100, coin_name=self.coin.coin_name, lock_time=0, coinjoin_request=coinjoin_req) tx = SignTx(
outputs_count=201,
inputs_count=100,
coin_name=self.coin.coin_name,
lock_time=0,
coinjoin_request=coinjoin_req,
)
authorization = CoinJoinAuthorization(self.msg_auth) authorization = CoinJoinAuthorization(self.msg_auth)
approver = CoinJoinApprover(tx, self.coin, authorization) approver = CoinJoinApprover(tx, self.coin, authorization)
@ -209,5 +235,5 @@ class TestApprover(unittest.TestCase):
await_result(approver.add_internal_input(txi, self.node)) await_result(approver.add_internal_input(txi, self.node))
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -14,7 +14,7 @@ _ROUND_ID_LEN = 32
class TestAuthorization(unittest.TestCase): class TestAuthorization(unittest.TestCase):
coin = coins.by_name('Bitcoin') coin = coins.by_name("Bitcoin")
def setUp(self): def setUp(self):
self.msg_auth = AuthorizeCoinJoin( self.msg_auth = AuthorizeCoinJoin(
@ -37,7 +37,8 @@ class TestAuthorization(unittest.TestCase):
coin_name=self.coin.coin_name, coin_name=self.coin.coin_name,
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
user_confirmation=True, user_confirmation=True,
commitment_data=b"\x0fwww.example.com" + int.to_bytes(1, _ROUND_ID_LEN, "big"), commitment_data=b"\x0fwww.example.com"
+ int.to_bytes(1, _ROUND_ID_LEN, "big"),
) )
self.assertFalse(self.authorization.check_get_ownership_proof(msg)) self.assertFalse(self.authorization.check_get_ownership_proof(msg))
@ -49,7 +50,8 @@ class TestAuthorization(unittest.TestCase):
coin_name=self.coin.coin_name, coin_name=self.coin.coin_name,
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
user_confirmation=True, user_confirmation=True,
commitment_data=b"\x0fwww.example.com" + int.to_bytes(1, _ROUND_ID_LEN, "big"), commitment_data=b"\x0fwww.example.com"
+ int.to_bytes(1, _ROUND_ID_LEN, "big"),
) )
self.assertFalse(self.authorization.check_get_ownership_proof(msg)) self.assertFalse(self.authorization.check_get_ownership_proof(msg))
@ -61,7 +63,8 @@ class TestAuthorization(unittest.TestCase):
coin_name=self.coin.coin_name, coin_name=self.coin.coin_name,
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
user_confirmation=True, user_confirmation=True,
commitment_data=b"\x0fwww.example.org" + int.to_bytes(1, _ROUND_ID_LEN, "big"), commitment_data=b"\x0fwww.example.org"
+ int.to_bytes(1, _ROUND_ID_LEN, "big"),
) )
self.assertFalse(self.authorization.check_get_ownership_proof(msg)) self.assertFalse(self.authorization.check_get_ownership_proof(msg))
@ -72,7 +75,8 @@ class TestAuthorization(unittest.TestCase):
coin_name=self.coin.coin_name, coin_name=self.coin.coin_name,
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
user_confirmation=True, user_confirmation=True,
commitment_data=b"\x0ewww.example.com" + int.to_bytes(1, _ROUND_ID_LEN - 1, "big"), commitment_data=b"\x0ewww.example.com"
+ int.to_bytes(1, _ROUND_ID_LEN - 1, "big"),
) )
self.assertFalse(self.authorization.check_get_ownership_proof(msg)) self.assertFalse(self.authorization.check_get_ownership_proof(msg))
@ -82,7 +86,8 @@ class TestAuthorization(unittest.TestCase):
coin_name=self.coin.coin_name, coin_name=self.coin.coin_name,
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
user_confirmation=True, user_confirmation=True,
commitment_data=b"\x10www.example.com" + int.to_bytes(1, _ROUND_ID_LEN + 1, "big"), commitment_data=b"\x10www.example.com"
+ int.to_bytes(1, _ROUND_ID_LEN + 1, "big"),
) )
self.assertFalse(self.authorization.check_get_ownership_proof(msg)) self.assertFalse(self.authorization.check_get_ownership_proof(msg))
@ -94,14 +99,20 @@ class TestAuthorization(unittest.TestCase):
coin_name=self.coin.coin_name, coin_name=self.coin.coin_name,
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
user_confirmation=True, user_confirmation=True,
commitment_data=b"\x0fwww.example.com" + int.to_bytes(1, _ROUND_ID_LEN, "big"), commitment_data=b"\x0fwww.example.com"
+ int.to_bytes(1, _ROUND_ID_LEN, "big"),
) )
self.assertTrue(self.authorization.check_get_ownership_proof(msg)) self.assertTrue(self.authorization.check_get_ownership_proof(msg))
def test_approve_sign_tx(self): def test_approve_sign_tx(self):
msg = SignTx(outputs_count=10, inputs_count=21, coin_name=self.coin.coin_name, lock_time=0) msg = SignTx(
outputs_count=10,
inputs_count=21,
coin_name=self.coin.coin_name,
lock_time=0,
)
self.assertTrue(self.authorization.approve_sign_tx(msg)) self.assertTrue(self.authorization.approve_sign_tx(msg))
self.assertTrue(self.authorization.approve_sign_tx(msg)) self.assertTrue(self.authorization.approve_sign_tx(msg))
@ -109,5 +120,5 @@ class TestAuthorization(unittest.TestCase):
self.assertFalse(self.authorization.approve_sign_tx(msg)) self.assertFalse(self.authorization.approve_sign_tx(msg))
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -149,7 +149,6 @@ class TestAltcoinKeychains(unittest.TestCase):
[H_(45), 99, 1, 1000], [H_(45), 99, 1, 1000],
[H_(49), H_(0), H_(0), 0, 0], [H_(49), H_(0), H_(0), 0, 0],
[H_(84), H_(0), H_(0), 0, 0], [H_(84), H_(0), H_(0), 0, 0],
[44, 2, 0, 0, 0], [44, 2, 0, 0, 0],
[H_(44), H_(2), H_(0)], [H_(44), H_(2), H_(0)],
[H_(44), H_(2), H_(0), 0, 0, 0], [H_(44), H_(2), H_(0), 0, 0, 0],

View File

@ -8,24 +8,40 @@ from apps.common import coins
from apps.common.keychain import Keychain from apps.common.keychain import Keychain
from apps.common.paths import HARDENED, AlwaysMatchingSchema from apps.common.paths import HARDENED, AlwaysMatchingSchema
from apps.bitcoin import ownership, scripts from apps.bitcoin import ownership, scripts
from apps.bitcoin.addresses import _address_p2tr, address_p2wpkh, address_p2wpkh_in_p2sh, _address_multisig_p2wsh, _address_multisig_p2wsh_in_p2sh, _address_multisig_p2sh from apps.bitcoin.addresses import (
_address_p2tr,
address_p2wpkh,
address_p2wpkh_in_p2sh,
_address_multisig_p2wsh,
_address_multisig_p2wsh_in_p2sh,
_address_multisig_p2sh,
)
from apps.bitcoin.multisig import multisig_get_pubkeys from apps.bitcoin.multisig import multisig_get_pubkeys
class TestOwnershipProof(unittest.TestCase): class TestOwnershipProof(unittest.TestCase):
def test_p2wpkh_gen_proof(self): def test_p2wpkh_gen_proof(self):
# SLIP-0019 test vector 1 # SLIP-0019 test vector 1
coin = coins.by_name('Bitcoin') coin = coins.by_name("Bitcoin")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
keychain = Keychain(seed, coin.curve_name, [AlwaysMatchingSchema], slip21_namespaces=[[b"SLIP-0019"]]) keychain = Keychain(
seed,
coin.curve_name,
[AlwaysMatchingSchema],
slip21_namespaces=[[b"SLIP-0019"]],
)
commitment_data = b"" commitment_data = b""
node = keychain.derive([84 | HARDENED, 0 | HARDENED, 0 | HARDENED, 1, 0]) node = keychain.derive([84 | HARDENED, 0 | HARDENED, 0 | HARDENED, 1, 0])
address = address_p2wpkh(node.public_key(), coin) address = address_p2wpkh(node.public_key(), coin)
script_pubkey = scripts.output_derive_script(address, coin) script_pubkey = scripts.output_derive_script(address, coin)
ownership_id = ownership.get_identifier(script_pubkey, keychain) ownership_id = ownership.get_identifier(script_pubkey, keychain)
self.assertEqual(ownership_id, unhexlify("a122407efc198211c81af4450f40b235d54775efd934d16b9e31c6ce9bad5707")) self.assertEqual(
ownership_id,
unhexlify(
"a122407efc198211c81af4450f40b235d54775efd934d16b9e31c6ce9bad5707"
),
)
proof, signature = ownership.generate_proof( proof, signature = ownership.generate_proof(
node=node, node=node,
@ -37,15 +53,34 @@ class TestOwnershipProof(unittest.TestCase):
script_pubkey=script_pubkey, script_pubkey=script_pubkey,
commitment_data=commitment_data, commitment_data=commitment_data,
) )
self.assertEqual(signature, unhexlify("3045022100c0dc28bb563fc5fea76cacff75dba9cb4122412faae01937cdebccfb065f9a7002202e980bfbd8a434a7fc4cd2ca49da476ce98ca097437f8159b1a386b41fcdfac5")) self.assertEqual(
self.assertEqual(proof, unhexlify("534c00190001a122407efc198211c81af4450f40b235d54775efd934d16b9e31c6ce9bad57070002483045022100c0dc28bb563fc5fea76cacff75dba9cb4122412faae01937cdebccfb065f9a7002202e980bfbd8a434a7fc4cd2ca49da476ce98ca097437f8159b1a386b41fcdfac50121032ef68318c8f6aaa0adec0199c69901f0db7d3485eb38d9ad235221dc3d61154b")) signature,
self.assertFalse(ownership.verify_nonownership(proof, script_pubkey, commitment_data, keychain, coin)) unhexlify(
"3045022100c0dc28bb563fc5fea76cacff75dba9cb4122412faae01937cdebccfb065f9a7002202e980bfbd8a434a7fc4cd2ca49da476ce98ca097437f8159b1a386b41fcdfac5"
),
)
self.assertEqual(
proof,
unhexlify(
"534c00190001a122407efc198211c81af4450f40b235d54775efd934d16b9e31c6ce9bad57070002483045022100c0dc28bb563fc5fea76cacff75dba9cb4122412faae01937cdebccfb065f9a7002202e980bfbd8a434a7fc4cd2ca49da476ce98ca097437f8159b1a386b41fcdfac50121032ef68318c8f6aaa0adec0199c69901f0db7d3485eb38d9ad235221dc3d61154b"
),
)
self.assertFalse(
ownership.verify_nonownership(
proof, script_pubkey, commitment_data, keychain, coin
)
)
def test_p2wpkh_in_p2sh_gen_proof(self): def test_p2wpkh_in_p2sh_gen_proof(self):
# SLIP-0019 test vector 2 # SLIP-0019 test vector 2
coin = coins.by_name('Bitcoin') coin = coins.by_name("Bitcoin")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
keychain = Keychain(seed, coin.curve_name, [AlwaysMatchingSchema], slip21_namespaces=[[b"SLIP-0019"]]) keychain = Keychain(
seed,
coin.curve_name,
[AlwaysMatchingSchema],
slip21_namespaces=[[b"SLIP-0019"]],
)
commitment_data = b"TREZOR" commitment_data = b"TREZOR"
node = keychain.derive([49 | HARDENED, 0 | HARDENED, 0 | HARDENED, 1, 0]) node = keychain.derive([49 | HARDENED, 0 | HARDENED, 0 | HARDENED, 1, 0])
@ -53,7 +88,12 @@ class TestOwnershipProof(unittest.TestCase):
script_pubkey = scripts.output_derive_script(address, coin) script_pubkey = scripts.output_derive_script(address, coin)
ownership_id = ownership.get_identifier(script_pubkey, keychain) ownership_id = ownership.get_identifier(script_pubkey, keychain)
self.assertEqual(ownership_id, unhexlify("92caf0b8daf78f1d388dbbceaec34bd2dabc31b217e32343663667f6694a3f46")) self.assertEqual(
ownership_id,
unhexlify(
"92caf0b8daf78f1d388dbbceaec34bd2dabc31b217e32343663667f6694a3f46"
),
)
proof, signature = ownership.generate_proof( proof, signature = ownership.generate_proof(
node=node, node=node,
@ -65,22 +105,46 @@ class TestOwnershipProof(unittest.TestCase):
script_pubkey=script_pubkey, script_pubkey=script_pubkey,
commitment_data=commitment_data, commitment_data=commitment_data,
) )
self.assertEqual(signature, unhexlify("304402207f1003c59661ddf564af2e10d19ad8d6a1a47ad30e7052197d95fd65d186a67802205f0a804509980fec1b063554aadd8fb871d7c9fe934087cba2da09cbeff8531c")) self.assertEqual(
self.assertEqual(proof, unhexlify("534c0019010192caf0b8daf78f1d388dbbceaec34bd2dabc31b217e32343663667f6694a3f4617160014e0cffbee1925a411844f44c3b8d81365ab51d0360247304402207f1003c59661ddf564af2e10d19ad8d6a1a47ad30e7052197d95fd65d186a67802205f0a804509980fec1b063554aadd8fb871d7c9fe934087cba2da09cbeff8531c012103a961687895a78da9aef98eed8e1f2a3e91cfb69d2f3cf11cbd0bb1773d951928")) signature,
self.assertFalse(ownership.verify_nonownership(proof, script_pubkey, commitment_data, keychain, coin)) unhexlify(
"304402207f1003c59661ddf564af2e10d19ad8d6a1a47ad30e7052197d95fd65d186a67802205f0a804509980fec1b063554aadd8fb871d7c9fe934087cba2da09cbeff8531c"
),
)
self.assertEqual(
proof,
unhexlify(
"534c0019010192caf0b8daf78f1d388dbbceaec34bd2dabc31b217e32343663667f6694a3f4617160014e0cffbee1925a411844f44c3b8d81365ab51d0360247304402207f1003c59661ddf564af2e10d19ad8d6a1a47ad30e7052197d95fd65d186a67802205f0a804509980fec1b063554aadd8fb871d7c9fe934087cba2da09cbeff8531c012103a961687895a78da9aef98eed8e1f2a3e91cfb69d2f3cf11cbd0bb1773d951928"
),
)
self.assertFalse(
ownership.verify_nonownership(
proof, script_pubkey, commitment_data, keychain, coin
)
)
def test_p2tr_gen_proof(self): def test_p2tr_gen_proof(self):
# SLIP-0019 test vector 5 # SLIP-0019 test vector 5
coin = coins.by_name('Bitcoin') coin = coins.by_name("Bitcoin")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
keychain = Keychain(seed, coin.curve_name, [AlwaysMatchingSchema], slip21_namespaces=[[b"SLIP-0019"]]) keychain = Keychain(
seed,
coin.curve_name,
[AlwaysMatchingSchema],
slip21_namespaces=[[b"SLIP-0019"]],
)
commitment_data = b"" commitment_data = b""
node = keychain.derive([86 | HARDENED, 0 | HARDENED, 0 | HARDENED, 1, 0]) node = keychain.derive([86 | HARDENED, 0 | HARDENED, 0 | HARDENED, 1, 0])
address = _address_p2tr(node.public_key(), coin) address = _address_p2tr(node.public_key(), coin)
script_pubkey = scripts.output_derive_script(address, coin) script_pubkey = scripts.output_derive_script(address, coin)
ownership_id = ownership.get_identifier(script_pubkey, keychain) ownership_id = ownership.get_identifier(script_pubkey, keychain)
self.assertEqual(ownership_id, unhexlify("dc18066224b9e30e306303436dc18ab881c7266c13790350a3fe415e438135ec")) self.assertEqual(
ownership_id,
unhexlify(
"dc18066224b9e30e306303436dc18ab881c7266c13790350a3fe415e438135ec"
),
)
proof, signature = ownership.generate_proof( proof, signature = ownership.generate_proof(
node=node, node=node,
@ -92,22 +156,46 @@ class TestOwnershipProof(unittest.TestCase):
script_pubkey=script_pubkey, script_pubkey=script_pubkey,
commitment_data=commitment_data, commitment_data=commitment_data,
) )
self.assertEqual(signature, unhexlify("647d6af883107a870417e808abe424882bd28ee04a28ba85a7e99400e1b9485075733695964c2a0fa02d4439ab80830e9566ccbd10f2597f5513eff9f03a0497")) self.assertEqual(
self.assertEqual(proof, unhexlify("534c00190001dc18066224b9e30e306303436dc18ab881c7266c13790350a3fe415e438135ec000140647d6af883107a870417e808abe424882bd28ee04a28ba85a7e99400e1b9485075733695964c2a0fa02d4439ab80830e9566ccbd10f2597f5513eff9f03a0497")) signature,
self.assertFalse(ownership.verify_nonownership(proof, script_pubkey, commitment_data, keychain, coin)) unhexlify(
"647d6af883107a870417e808abe424882bd28ee04a28ba85a7e99400e1b9485075733695964c2a0fa02d4439ab80830e9566ccbd10f2597f5513eff9f03a0497"
),
)
self.assertEqual(
proof,
unhexlify(
"534c00190001dc18066224b9e30e306303436dc18ab881c7266c13790350a3fe415e438135ec000140647d6af883107a870417e808abe424882bd28ee04a28ba85a7e99400e1b9485075733695964c2a0fa02d4439ab80830e9566ccbd10f2597f5513eff9f03a0497"
),
)
self.assertFalse(
ownership.verify_nonownership(
proof, script_pubkey, commitment_data, keychain, coin
)
)
def test_p2pkh_gen_proof(self): def test_p2pkh_gen_proof(self):
# SLIP-0019 test vector 3 # SLIP-0019 test vector 3
coin = coins.by_name('Bitcoin') coin = coins.by_name("Bitcoin")
seed = bip39.seed(' '.join(['all'] * 12), 'TREZOR') seed = bip39.seed(" ".join(["all"] * 12), "TREZOR")
keychain = Keychain(seed, coin.curve_name, [AlwaysMatchingSchema], slip21_namespaces=[[b"SLIP-0019"]]) keychain = Keychain(
seed,
coin.curve_name,
[AlwaysMatchingSchema],
slip21_namespaces=[[b"SLIP-0019"]],
)
commitment_data = b"" commitment_data = b""
node = keychain.derive([44 | HARDENED, 0 | HARDENED, 0 | HARDENED, 1, 0]) node = keychain.derive([44 | HARDENED, 0 | HARDENED, 0 | HARDENED, 1, 0])
address = node.address(coin.address_type) address = node.address(coin.address_type)
script_pubkey = scripts.output_derive_script(address, coin) script_pubkey = scripts.output_derive_script(address, coin)
ownership_id = ownership.get_identifier(script_pubkey, keychain) ownership_id = ownership.get_identifier(script_pubkey, keychain)
self.assertEqual(ownership_id, unhexlify("ccc49ac5fede0efc80725fbda8b763d4e62a221c51cc5425076cffa7722c0bda")) self.assertEqual(
ownership_id,
unhexlify(
"ccc49ac5fede0efc80725fbda8b763d4e62a221c51cc5425076cffa7722c0bda"
),
)
proof, signature = ownership.generate_proof( proof, signature = ownership.generate_proof(
node=node, node=node,
@ -119,55 +207,103 @@ class TestOwnershipProof(unittest.TestCase):
script_pubkey=script_pubkey, script_pubkey=script_pubkey,
commitment_data=commitment_data, commitment_data=commitment_data,
) )
self.assertEqual(signature, unhexlify("3045022100e818002d0a85438a7f2140503a6aa0a6af6002fa956d0101fd3db24e776e546f0220430fd59dc1498bc96ab6e71a4829b60224828cf1fc35edc98e0973db203ca3f0")) self.assertEqual(
self.assertEqual(proof, unhexlify("534c00190001ccc49ac5fede0efc80725fbda8b763d4e62a221c51cc5425076cffa7722c0bda6b483045022100e818002d0a85438a7f2140503a6aa0a6af6002fa956d0101fd3db24e776e546f0220430fd59dc1498bc96ab6e71a4829b60224828cf1fc35edc98e0973db203ca3f0012102f63159e21fbcb54221ec993def967ad2183a9c243c8bff6e7d60f4d5ed3b386500")) signature,
self.assertFalse(ownership.verify_nonownership(proof, script_pubkey, commitment_data, keychain, coin)) unhexlify(
"3045022100e818002d0a85438a7f2140503a6aa0a6af6002fa956d0101fd3db24e776e546f0220430fd59dc1498bc96ab6e71a4829b60224828cf1fc35edc98e0973db203ca3f0"
),
)
self.assertEqual(
proof,
unhexlify(
"534c00190001ccc49ac5fede0efc80725fbda8b763d4e62a221c51cc5425076cffa7722c0bda6b483045022100e818002d0a85438a7f2140503a6aa0a6af6002fa956d0101fd3db24e776e546f0220430fd59dc1498bc96ab6e71a4829b60224828cf1fc35edc98e0973db203ca3f0012102f63159e21fbcb54221ec993def967ad2183a9c243c8bff6e7d60f4d5ed3b386500"
),
)
self.assertFalse(
ownership.verify_nonownership(
proof, script_pubkey, commitment_data, keychain, coin
)
)
def test_p2wpkh_verify_proof(self): def test_p2wpkh_verify_proof(self):
# SLIP-0019 test vector 1 # SLIP-0019 test vector 1
coin = coins.by_name('Bitcoin') coin = coins.by_name("Bitcoin")
seed = bip39.seed(' '.join(['all'] * 12), 'TREZOR') seed = bip39.seed(" ".join(["all"] * 12), "TREZOR")
keychain = Keychain(seed, coin.curve_name, [AlwaysMatchingSchema], slip21_namespaces=[[b"SLIP-0019"]]) keychain = Keychain(
seed,
coin.curve_name,
[AlwaysMatchingSchema],
slip21_namespaces=[[b"SLIP-0019"]],
)
commitment_data = b"" commitment_data = b""
# Proof for "all all ... all" seed without passphrase. # Proof for "all all ... all" seed without passphrase.
script_pubkey = unhexlify("0014b2f771c370ccf219cd3059cda92bdf7f00cf2103") script_pubkey = unhexlify("0014b2f771c370ccf219cd3059cda92bdf7f00cf2103")
proof = unhexlify("534c00190001a122407efc198211c81af4450f40b235d54775efd934d16b9e31c6ce9bad57070002483045022100c0dc28bb563fc5fea76cacff75dba9cb4122412faae01937cdebccfb065f9a7002202e980bfbd8a434a7fc4cd2ca49da476ce98ca097437f8159b1a386b41fcdfac50121032ef68318c8f6aaa0adec0199c69901f0db7d3485eb38d9ad235221dc3d61154b") proof = unhexlify(
self.assertTrue(ownership.verify_nonownership(proof, script_pubkey, commitment_data, keychain, coin)) "534c00190001a122407efc198211c81af4450f40b235d54775efd934d16b9e31c6ce9bad57070002483045022100c0dc28bb563fc5fea76cacff75dba9cb4122412faae01937cdebccfb065f9a7002202e980bfbd8a434a7fc4cd2ca49da476ce98ca097437f8159b1a386b41fcdfac50121032ef68318c8f6aaa0adec0199c69901f0db7d3485eb38d9ad235221dc3d61154b"
)
self.assertTrue(
ownership.verify_nonownership(
proof, script_pubkey, commitment_data, keychain, coin
)
)
def test_p2tr_verify_proof(self): def test_p2tr_verify_proof(self):
# SLIP-0019 test vector 5 # SLIP-0019 test vector 5
coin = coins.by_name('Bitcoin') coin = coins.by_name("Bitcoin")
seed = bip39.seed(' '.join(['all'] * 12), 'TREZOR') seed = bip39.seed(" ".join(["all"] * 12), "TREZOR")
keychain = Keychain(seed, coin.curve_name, [AlwaysMatchingSchema], slip21_namespaces=[[b"SLIP-0019"]]) keychain = Keychain(
seed,
coin.curve_name,
[AlwaysMatchingSchema],
slip21_namespaces=[[b"SLIP-0019"]],
)
commitment_data = b"" commitment_data = b""
# Proof for "all all ... all" seed without passphrase. # Proof for "all all ... all" seed without passphrase.
script_pubkey = unhexlify("51204102897557de0cafea0a8401ea5b59668eccb753e4b100aebe6a19609f3cc79f") script_pubkey = unhexlify(
proof = unhexlify("534c00190001dc18066224b9e30e306303436dc18ab881c7266c13790350a3fe415e438135ec0001401b553e5b9cc787b531bbc78417aea901272b4ea905136a2babc4d6ca471549743b5e0e39ddc14e620b254e42faa7f6d5bd953e97aa231d764d21bc5a58e8b7d9") "51204102897557de0cafea0a8401ea5b59668eccb753e4b100aebe6a19609f3cc79f"
self.assertTrue(ownership.verify_nonownership(proof, script_pubkey, commitment_data, keychain, coin)) )
proof = unhexlify(
"534c00190001dc18066224b9e30e306303436dc18ab881c7266c13790350a3fe415e438135ec0001401b553e5b9cc787b531bbc78417aea901272b4ea905136a2babc4d6ca471549743b5e0e39ddc14e620b254e42faa7f6d5bd953e97aa231d764d21bc5a58e8b7d9"
)
self.assertTrue(
ownership.verify_nonownership(
proof, script_pubkey, commitment_data, keychain, coin
)
)
def test_p2wsh_gen_proof(self): def test_p2wsh_gen_proof(self):
# SLIP-0019 test vector 4 # SLIP-0019 test vector 4
coin = coins.by_name('Bitcoin') coin = coins.by_name("Bitcoin")
seed1 = bip39.seed(' '.join(['all'] * 12), '') seed1 = bip39.seed(" ".join(["all"] * 12), "")
seed2 = bip39.seed('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about', '') seed2 = bip39.seed(
seed3 = bip39.seed('zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong', '') "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about",
"",
)
seed3 = bip39.seed("zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong", "")
commitment_data = b"TREZOR" commitment_data = b"TREZOR"
nodes = [] nodes = []
keychains = [] keychains = []
for seed in [seed1, seed2, seed3]: for seed in [seed1, seed2, seed3]:
keychain = Keychain(seed, coin.curve_name, [AlwaysMatchingSchema], slip21_namespaces=[[b"SLIP-0019"]]) keychain = Keychain(
seed,
coin.curve_name,
[AlwaysMatchingSchema],
slip21_namespaces=[[b"SLIP-0019"]],
)
keychains.append(keychain) keychains.append(keychain)
node = keychain.derive([84 | HARDENED, 0 | HARDENED, 0 | HARDENED]) node = keychain.derive([84 | HARDENED, 0 | HARDENED, 0 | HARDENED])
nodes.append(HDNodeType( nodes.append(
HDNodeType(
depth=node.depth(), depth=node.depth(),
child_num=node.child_num(), child_num=node.child_num(),
fingerprint=node.fingerprint(), fingerprint=node.fingerprint(),
chain_code=node.chain_code(), chain_code=node.chain_code(),
public_key=node.public_key(), public_key=node.public_key(),
)) )
)
multisig = MultisigRedeemScriptType( multisig = MultisigRedeemScriptType(
nodes=nodes, nodes=nodes,
@ -179,10 +315,27 @@ class TestOwnershipProof(unittest.TestCase):
pubkeys = multisig_get_pubkeys(multisig) pubkeys = multisig_get_pubkeys(multisig)
address = _address_multisig_p2wsh(pubkeys, multisig.m, coin.bech32_prefix) address = _address_multisig_p2wsh(pubkeys, multisig.m, coin.bech32_prefix)
script_pubkey = scripts.output_derive_script(address, coin) script_pubkey = scripts.output_derive_script(address, coin)
ownership_ids = [ownership.get_identifier(script_pubkey, keychain) for keychain in keychains] ownership_ids = [
self.assertEqual(ownership_ids[0], unhexlify("309c4ffec5c228cc836b51d572c0a730dbabd39df9f01862502ac9eabcdeb94a")) ownership.get_identifier(script_pubkey, keychain) for keychain in keychains
self.assertEqual(ownership_ids[1], unhexlify("46307177b959c48bf2eb516e0463bb651aad388c7f8f597320df7854212fa344")) ]
self.assertEqual(ownership_ids[2], unhexlify("3892f9573e08cedff9160b243759520733a980fed45b131a8bba171317ae5d94")) self.assertEqual(
ownership_ids[0],
unhexlify(
"309c4ffec5c228cc836b51d572c0a730dbabd39df9f01862502ac9eabcdeb94a"
),
)
self.assertEqual(
ownership_ids[1],
unhexlify(
"46307177b959c48bf2eb516e0463bb651aad388c7f8f597320df7854212fa344"
),
)
self.assertEqual(
ownership_ids[2],
unhexlify(
"3892f9573e08cedff9160b243759520733a980fed45b131a8bba171317ae5d94"
),
)
# Sign with the first key. # Sign with the first key.
_, signature = ownership.generate_proof( _, signature = ownership.generate_proof(
@ -195,7 +348,12 @@ class TestOwnershipProof(unittest.TestCase):
script_pubkey=script_pubkey, script_pubkey=script_pubkey,
commitment_data=commitment_data, commitment_data=commitment_data,
) )
self.assertEqual(signature, unhexlify("30450221009d8cd2d792633732b3a406ea86072e94c72c0d1ffb5ddde466993ee2142eeef502206fa9c6273ab35400ebf689028ebcf8d2031edb3326106339e92d499652dc4303")) self.assertEqual(
signature,
unhexlify(
"30450221009d8cd2d792633732b3a406ea86072e94c72c0d1ffb5ddde466993ee2142eeef502206fa9c6273ab35400ebf689028ebcf8d2031edb3326106339e92d499652dc4303"
),
)
multisig.signatures[0] = signature multisig.signatures[0] = signature
# Sign with the third key. # Sign with the third key.
@ -209,26 +367,47 @@ class TestOwnershipProof(unittest.TestCase):
script_pubkey=script_pubkey, script_pubkey=script_pubkey,
commitment_data=commitment_data, commitment_data=commitment_data,
) )
self.assertEqual(signature, unhexlify("304402205fae1218bc4600ad6c28b6093e8f3757603681b024e60f1d92fca579bfce210b022011d6f1c6ef1c7f7601f635ed237dafc774386dd9f4be0aef85e3af3f095d8a92")) self.assertEqual(
self.assertEqual(proof, unhexlify("534c00190003309c4ffec5c228cc836b51d572c0a730dbabd39df9f01862502ac9eabcdeb94a46307177b959c48bf2eb516e0463bb651aad388c7f8f597320df7854212fa3443892f9573e08cedff9160b243759520733a980fed45b131a8bba171317ae5d940004004830450221009d8cd2d792633732b3a406ea86072e94c72c0d1ffb5ddde466993ee2142eeef502206fa9c6273ab35400ebf689028ebcf8d2031edb3326106339e92d499652dc43030147304402205fae1218bc4600ad6c28b6093e8f3757603681b024e60f1d92fca579bfce210b022011d6f1c6ef1c7f7601f635ed237dafc774386dd9f4be0aef85e3af3f095d8a9201695221032ef68318c8f6aaa0adec0199c69901f0db7d3485eb38d9ad235221dc3d61154b2103025324888e429ab8e3dbaf1f7802648b9cd01e9b418485c5fa4c1b9b5700e1a621033057150eb57e2b21d69866747f3d377e928f864fa88ecc5ddb1c0e501cce3f8153ae")) signature,
self.assertFalse(ownership.verify_nonownership(proof, script_pubkey, commitment_data, keychain, coin)) unhexlify(
"304402205fae1218bc4600ad6c28b6093e8f3757603681b024e60f1d92fca579bfce210b022011d6f1c6ef1c7f7601f635ed237dafc774386dd9f4be0aef85e3af3f095d8a92"
),
)
self.assertEqual(
proof,
unhexlify(
"534c00190003309c4ffec5c228cc836b51d572c0a730dbabd39df9f01862502ac9eabcdeb94a46307177b959c48bf2eb516e0463bb651aad388c7f8f597320df7854212fa3443892f9573e08cedff9160b243759520733a980fed45b131a8bba171317ae5d940004004830450221009d8cd2d792633732b3a406ea86072e94c72c0d1ffb5ddde466993ee2142eeef502206fa9c6273ab35400ebf689028ebcf8d2031edb3326106339e92d499652dc43030147304402205fae1218bc4600ad6c28b6093e8f3757603681b024e60f1d92fca579bfce210b022011d6f1c6ef1c7f7601f635ed237dafc774386dd9f4be0aef85e3af3f095d8a9201695221032ef68318c8f6aaa0adec0199c69901f0db7d3485eb38d9ad235221dc3d61154b2103025324888e429ab8e3dbaf1f7802648b9cd01e9b418485c5fa4c1b9b5700e1a621033057150eb57e2b21d69866747f3d377e928f864fa88ecc5ddb1c0e501cce3f8153ae"
),
)
self.assertFalse(
ownership.verify_nonownership(
proof, script_pubkey, commitment_data, keychain, coin
)
)
def test_p2wsh_in_p2sh_gen_proof(self): def test_p2wsh_in_p2sh_gen_proof(self):
coin = coins.by_name('Bitcoin') coin = coins.by_name("Bitcoin")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
keychain = Keychain(seed, coin.curve_name, [AlwaysMatchingSchema], slip21_namespaces=[[b"SLIP-0019"]]) keychain = Keychain(
seed,
coin.curve_name,
[AlwaysMatchingSchema],
slip21_namespaces=[[b"SLIP-0019"]],
)
commitment_data = b"" commitment_data = b""
nodes = [] nodes = []
for index in range(1, 6): for index in range(1, 6):
node = keychain.derive([49 | HARDENED, 0 | HARDENED, index | HARDENED]) node = keychain.derive([49 | HARDENED, 0 | HARDENED, index | HARDENED])
nodes.append(HDNodeType( nodes.append(
HDNodeType(
depth=node.depth(), depth=node.depth(),
child_num=node.child_num(), child_num=node.child_num(),
fingerprint=node.fingerprint(), fingerprint=node.fingerprint(),
chain_code=node.chain_code(), chain_code=node.chain_code(),
public_key=node.public_key(), public_key=node.public_key(),
)) )
)
multisig = MultisigRedeemScriptType( multisig = MultisigRedeemScriptType(
nodes=nodes, nodes=nodes,
@ -241,8 +420,13 @@ class TestOwnershipProof(unittest.TestCase):
address = _address_multisig_p2wsh_in_p2sh(pubkeys, multisig.m, coin) address = _address_multisig_p2wsh_in_p2sh(pubkeys, multisig.m, coin)
script_pubkey = scripts.output_derive_script(address, coin) script_pubkey = scripts.output_derive_script(address, coin)
ownership_id = ownership.get_identifier(script_pubkey, keychain) ownership_id = ownership.get_identifier(script_pubkey, keychain)
ownership_ids = [b'\x00' * 32, b'\x01' * 32, b'\x02' * 32, ownership_id] ownership_ids = [b"\x00" * 32, b"\x01" * 32, b"\x02" * 32, ownership_id]
self.assertEqual(ownership_id, unhexlify("66f99db388dfa7ae137f7bdb5f0004b4d6968014921cfaff1fec042e3bb83ae0")) self.assertEqual(
ownership_id,
unhexlify(
"66f99db388dfa7ae137f7bdb5f0004b4d6968014921cfaff1fec042e3bb83ae0"
),
)
# Sign with the second key. # Sign with the second key.
_, signature = ownership.generate_proof( _, signature = ownership.generate_proof(
@ -255,7 +439,12 @@ class TestOwnershipProof(unittest.TestCase):
script_pubkey=script_pubkey, script_pubkey=script_pubkey,
commitment_data=commitment_data, commitment_data=commitment_data,
) )
self.assertEqual(signature, unhexlify("30450221008c2c61ac2b50fd5f644baf5e8815b41caaf41d3b085d6e79c1ab38ab9ff4ef0702206742f837eddd4484ebf642e0bcb9621fe39165d3c9d62706bb01b2a8d854fb39")) self.assertEqual(
signature,
unhexlify(
"30450221008c2c61ac2b50fd5f644baf5e8815b41caaf41d3b085d6e79c1ab38ab9ff4ef0702206742f837eddd4484ebf642e0bcb9621fe39165d3c9d62706bb01b2a8d854fb39"
),
)
multisig.signatures[1] = signature multisig.signatures[1] = signature
# Sign with the fourth key. # Sign with the fourth key.
@ -269,7 +458,12 @@ class TestOwnershipProof(unittest.TestCase):
script_pubkey=script_pubkey, script_pubkey=script_pubkey,
commitment_data=commitment_data, commitment_data=commitment_data,
) )
self.assertEqual(signature, unhexlify("304402200f5ec86b369f6a980a237944a1a06e6615afb147c6d84baf28cd1b8a58faf52702205614240e1582adeaa84685398a24d3678d0781371678b402b290ae3de3e058ee")) self.assertEqual(
signature,
unhexlify(
"304402200f5ec86b369f6a980a237944a1a06e6615afb147c6d84baf28cd1b8a58faf52702205614240e1582adeaa84685398a24d3678d0781371678b402b290ae3de3e058ee"
),
)
multisig.signatures[3] = signature multisig.signatures[3] = signature
# Sign with the fifth key. # Sign with the fifth key.
@ -283,26 +477,47 @@ class TestOwnershipProof(unittest.TestCase):
script_pubkey=script_pubkey, script_pubkey=script_pubkey,
commitment_data=commitment_data, commitment_data=commitment_data,
) )
self.assertEqual(signature, unhexlify("304402201ce53fcd797b6f5ceefa839817d6285551ff420457503ae2dab3f90ca1f6f2330220522f030423c22d5582c4f8fe243839031f584642ba5c085af712145d1e8146b7")) self.assertEqual(
self.assertEqual(proof, unhexlify("534c0019000400000000000000000000000000000000000000000000000000000000000000000101010101010101010101010101010101010101010101010101010101010101020202020202020202020202020202020202020202020202020202020202020266f99db388dfa7ae137f7bdb5f0004b4d6968014921cfaff1fec042e3bb83ae0232200208c256ed80a97a421656daa1468f6d4d43f475cb52ed79532d8bcb3155182981205004830450221008c2c61ac2b50fd5f644baf5e8815b41caaf41d3b085d6e79c1ab38ab9ff4ef0702206742f837eddd4484ebf642e0bcb9621fe39165d3c9d62706bb01b2a8d854fb390147304402200f5ec86b369f6a980a237944a1a06e6615afb147c6d84baf28cd1b8a58faf52702205614240e1582adeaa84685398a24d3678d0781371678b402b290ae3de3e058ee0147304402201ce53fcd797b6f5ceefa839817d6285551ff420457503ae2dab3f90ca1f6f2330220522f030423c22d5582c4f8fe243839031f584642ba5c085af712145d1e8146b701ad5321032922ce9b0b71ae2d2d8a7f239610ae8226e0fb8c0f445ec4c88cf9aa4787f44b21028373a1cdb9a1afbc67e57f75eeea1f53e7210ae8ec4b3441a5f2bc4a250b663c21028ab4c06e3ad19053b370eff097697d4cb6d3738712ebcdcdc27c58a5639ac3aa2103e3247fab300aeba459257e4605245f85378ecbfe092ca3bc55ec1259baa456f521023b0d8d97398d97c4dba10f788344abd4bd1058ad3959724d32079ad04bdbde8a55ae")) signature,
self.assertFalse(ownership.verify_nonownership(proof, script_pubkey, commitment_data, keychain, coin)) unhexlify(
"304402201ce53fcd797b6f5ceefa839817d6285551ff420457503ae2dab3f90ca1f6f2330220522f030423c22d5582c4f8fe243839031f584642ba5c085af712145d1e8146b7"
),
)
self.assertEqual(
proof,
unhexlify(
"534c0019000400000000000000000000000000000000000000000000000000000000000000000101010101010101010101010101010101010101010101010101010101010101020202020202020202020202020202020202020202020202020202020202020266f99db388dfa7ae137f7bdb5f0004b4d6968014921cfaff1fec042e3bb83ae0232200208c256ed80a97a421656daa1468f6d4d43f475cb52ed79532d8bcb3155182981205004830450221008c2c61ac2b50fd5f644baf5e8815b41caaf41d3b085d6e79c1ab38ab9ff4ef0702206742f837eddd4484ebf642e0bcb9621fe39165d3c9d62706bb01b2a8d854fb390147304402200f5ec86b369f6a980a237944a1a06e6615afb147c6d84baf28cd1b8a58faf52702205614240e1582adeaa84685398a24d3678d0781371678b402b290ae3de3e058ee0147304402201ce53fcd797b6f5ceefa839817d6285551ff420457503ae2dab3f90ca1f6f2330220522f030423c22d5582c4f8fe243839031f584642ba5c085af712145d1e8146b701ad5321032922ce9b0b71ae2d2d8a7f239610ae8226e0fb8c0f445ec4c88cf9aa4787f44b21028373a1cdb9a1afbc67e57f75eeea1f53e7210ae8ec4b3441a5f2bc4a250b663c21028ab4c06e3ad19053b370eff097697d4cb6d3738712ebcdcdc27c58a5639ac3aa2103e3247fab300aeba459257e4605245f85378ecbfe092ca3bc55ec1259baa456f521023b0d8d97398d97c4dba10f788344abd4bd1058ad3959724d32079ad04bdbde8a55ae"
),
)
self.assertFalse(
ownership.verify_nonownership(
proof, script_pubkey, commitment_data, keychain, coin
)
)
def test_p2sh_gen_proof(self): def test_p2sh_gen_proof(self):
coin = coins.by_name('Bitcoin') coin = coins.by_name("Bitcoin")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
keychain = Keychain(seed, coin.curve_name, [AlwaysMatchingSchema], slip21_namespaces=[[b"SLIP-0019"]]) keychain = Keychain(
seed,
coin.curve_name,
[AlwaysMatchingSchema],
slip21_namespaces=[[b"SLIP-0019"]],
)
commitment_data = b"TREZOR" commitment_data = b"TREZOR"
nodes = [] nodes = []
for index in range(1, 3): for index in range(1, 3):
node = keychain.derive([48 | HARDENED, 0 | HARDENED, index | HARDENED]) node = keychain.derive([48 | HARDENED, 0 | HARDENED, index | HARDENED])
nodes.append(HDNodeType( nodes.append(
HDNodeType(
depth=node.depth(), depth=node.depth(),
child_num=node.child_num(), child_num=node.child_num(),
fingerprint=node.fingerprint(), fingerprint=node.fingerprint(),
chain_code=node.chain_code(), chain_code=node.chain_code(),
public_key=node.public_key(), public_key=node.public_key(),
)) )
)
multisig = MultisigRedeemScriptType( multisig = MultisigRedeemScriptType(
nodes=nodes, nodes=nodes,
@ -315,8 +530,13 @@ class TestOwnershipProof(unittest.TestCase):
address = _address_multisig_p2sh(pubkeys, multisig.m, coin) address = _address_multisig_p2sh(pubkeys, multisig.m, coin)
script_pubkey = scripts.output_derive_script(address, coin) script_pubkey = scripts.output_derive_script(address, coin)
ownership_id = ownership.get_identifier(script_pubkey, keychain) ownership_id = ownership.get_identifier(script_pubkey, keychain)
ownership_ids = [b'\x00' * 32, ownership_id] ownership_ids = [b"\x00" * 32, ownership_id]
self.assertEqual(ownership_id, unhexlify("ce4ee8298ad105c3495a1d2b620343133521ab34de2450deeb32eec39475fef4")) self.assertEqual(
ownership_id,
unhexlify(
"ce4ee8298ad105c3495a1d2b620343133521ab34de2450deeb32eec39475fef4"
),
)
# Sign with the first key. # Sign with the first key.
_, signature = ownership.generate_proof( _, signature = ownership.generate_proof(
@ -329,7 +549,12 @@ class TestOwnershipProof(unittest.TestCase):
script_pubkey=script_pubkey, script_pubkey=script_pubkey,
commitment_data=commitment_data, commitment_data=commitment_data,
) )
self.assertEqual(signature, unhexlify("3044022058091b367ab67281963029435046abcb51057d143077a36737780a7cbcd6c1af02202f54147645b970c60b5b631b233ed93c15304294a4214b2c44b57db84815ca14")) self.assertEqual(
signature,
unhexlify(
"3044022058091b367ab67281963029435046abcb51057d143077a36737780a7cbcd6c1af02202f54147645b970c60b5b631b233ed93c15304294a4214b2c44b57db84815ca14"
),
)
multisig.signatures[0] = signature multisig.signatures[0] = signature
# Sign with the third key. # Sign with the third key.
@ -343,10 +568,24 @@ class TestOwnershipProof(unittest.TestCase):
script_pubkey=script_pubkey, script_pubkey=script_pubkey,
commitment_data=commitment_data, commitment_data=commitment_data,
) )
self.assertEqual(signature, unhexlify("304402200d8f270ea9a80678f266b3fbe6e4aa59aab46b440d8066dcf46fb46a4beaf58202201198d73e355158ebf532ca6527e28ea97b79594e016a65c7a0c68813c26271ff")) self.assertEqual(
self.assertEqual(proof, unhexlify("534c001900020000000000000000000000000000000000000000000000000000000000000000ce4ee8298ad105c3495a1d2b620343133521ab34de2450deeb32eec39475fef4d900473044022058091b367ab67281963029435046abcb51057d143077a36737780a7cbcd6c1af02202f54147645b970c60b5b631b233ed93c15304294a4214b2c44b57db84815ca140147304402200d8f270ea9a80678f266b3fbe6e4aa59aab46b440d8066dcf46fb46a4beaf58202201198d73e355158ebf532ca6527e28ea97b79594e016a65c7a0c68813c26271ff014752210203ed6187880ae932660086e55d4561a57952dd200aa3ed2aa66b73e5723a0ce7210360e7f32fd3c8dee27a166f6614c598929699ee66acdcbda5fb24571bf2ae1ca052ae00")) signature,
self.assertFalse(ownership.verify_nonownership(proof, script_pubkey, commitment_data, keychain, coin)) unhexlify(
"304402200d8f270ea9a80678f266b3fbe6e4aa59aab46b440d8066dcf46fb46a4beaf58202201198d73e355158ebf532ca6527e28ea97b79594e016a65c7a0c68813c26271ff"
),
)
self.assertEqual(
proof,
unhexlify(
"534c001900020000000000000000000000000000000000000000000000000000000000000000ce4ee8298ad105c3495a1d2b620343133521ab34de2450deeb32eec39475fef4d900473044022058091b367ab67281963029435046abcb51057d143077a36737780a7cbcd6c1af02202f54147645b970c60b5b631b233ed93c15304294a4214b2c44b57db84815ca140147304402200d8f270ea9a80678f266b3fbe6e4aa59aab46b440d8066dcf46fb46a4beaf58202201198d73e355158ebf532ca6527e28ea97b79594e016a65c7a0c68813c26271ff014752210203ed6187880ae932660086e55d4561a57952dd200aa3ed2aa66b73e5723a0ce7210360e7f32fd3c8dee27a166f6614c598929699ee66acdcbda5fb24571bf2ae1ca052ae00"
),
)
self.assertFalse(
ownership.verify_nonownership(
proof, script_pubkey, commitment_data, keychain, coin
)
)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -19,33 +19,51 @@ from trezor.crypto import bip39
class TestSegwitBip143NativeP2WPKH(unittest.TestCase): class TestSegwitBip143NativeP2WPKH(unittest.TestCase):
# pylint: disable=C0301 # pylint: disable=C0301
tx = SignTx(coin_name='Bitcoin', version=1, lock_time=0x00000011, inputs_count=2, outputs_count=2) tx = SignTx(
inp1 = TxInput(address_n=[0], coin_name="Bitcoin",
version=1,
lock_time=0x00000011,
inputs_count=2,
outputs_count=2,
)
inp1 = TxInput(
address_n=[0],
# Trezor expects hash in reversed format # Trezor expects hash in reversed format
prev_hash=unhexlify('9f96ade4b41d5433f4eda31e1738ec2b36f6e7d1420d94a6af99801a88f7f7ff'), prev_hash=unhexlify(
"9f96ade4b41d5433f4eda31e1738ec2b36f6e7d1420d94a6af99801a88f7f7ff"
),
prev_index=0, prev_index=0,
amount=625000000, # 6.25 btc amount=625000000, # 6.25 btc
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
multisig=None, multisig=None,
sequence=0xffffffee) sequence=0xFFFFFFEE,
inp2 = TxInput(address_n=[1], )
inp2 = TxInput(
address_n=[1],
# Trezor expects hash in reversed format # Trezor expects hash in reversed format
prev_hash=unhexlify('8ac60eb9575db5b2d987e29f301b5b819ea83a5c6579d282d189cc04b8e151ef'), prev_hash=unhexlify(
"8ac60eb9575db5b2d987e29f301b5b819ea83a5c6579d282d189cc04b8e151ef"
),
prev_index=1, prev_index=1,
multisig=None, multisig=None,
amount=600000000, # 6 btc amount=600000000, # 6 btc
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
sequence=0xffffffff) sequence=0xFFFFFFFF,
out1 = TxOutput(address='1Cu32FVupVCgHkMMRJdYJugxwo2Aprgk7H', # derived )
amount=0x0000000006b22c20, out1 = TxOutput(
address="1Cu32FVupVCgHkMMRJdYJugxwo2Aprgk7H", # derived
amount=0x0000000006B22C20,
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
multisig=None, multisig=None,
address_n=[]) address_n=[],
out2 = TxOutput(address='16TZ8J6Q5iZKBWizWzFAYnrsaox5Z5aBRV', # derived )
amount=0x000000000d519390, out2 = TxOutput(
address="16TZ8J6Q5iZKBWizWzFAYnrsaox5Z5aBRV", # derived
amount=0x000000000D519390,
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
multisig=None, multisig=None,
address_n=[]) address_n=[],
)
def test_prevouts(self): def test_prevouts(self):
coin = coins.by_name(self.tx.coin_name) coin = coins.by_name(self.tx.coin_name)
@ -53,19 +71,30 @@ class TestSegwitBip143NativeP2WPKH(unittest.TestCase):
sig_hasher.add_input(self.inp1, b"") sig_hasher.add_input(self.inp1, b"")
sig_hasher.add_input(self.inp2, b"") sig_hasher.add_input(self.inp2, b"")
prevouts_hash = get_tx_hash(sig_hasher.h_prevouts, double=coin.sign_hash_double) prevouts_hash = get_tx_hash(sig_hasher.h_prevouts, double=coin.sign_hash_double)
self.assertEqual(hexlify(prevouts_hash), b'96b827c8483d4e9b96712b6713a7b68d6e8003a781feba36c31143470b4efd37') self.assertEqual(
hexlify(prevouts_hash),
b"96b827c8483d4e9b96712b6713a7b68d6e8003a781feba36c31143470b4efd37",
)
def test_sequence(self): def test_sequence(self):
coin = coins.by_name(self.tx.coin_name) coin = coins.by_name(self.tx.coin_name)
sig_hasher = BitcoinSigHasher() sig_hasher = BitcoinSigHasher()
sig_hasher.add_input(self.inp1, b"") sig_hasher.add_input(self.inp1, b"")
sig_hasher.add_input(self.inp2, b"") sig_hasher.add_input(self.inp2, b"")
sequence_hash = get_tx_hash(sig_hasher.h_sequences, double=coin.sign_hash_double) sequence_hash = get_tx_hash(
self.assertEqual(hexlify(sequence_hash), b'52b0a642eea2fb7ae638c36f6252b6750293dbe574a806984b8e4d8548339a3b') sig_hasher.h_sequences, double=coin.sign_hash_double
)
self.assertEqual(
hexlify(sequence_hash),
b"52b0a642eea2fb7ae638c36f6252b6750293dbe574a806984b8e4d8548339a3b",
)
def test_outputs(self): def test_outputs(self):
seed = bip39.seed('alcohol woman abuse must during monitor noble actual mixed trade anger aisle', '') seed = bip39.seed(
"alcohol woman abuse must during monitor noble actual mixed trade anger aisle",
"",
)
coin = coins.by_name(self.tx.coin_name) coin = coins.by_name(self.tx.coin_name)
sig_hasher = BitcoinSigHasher() sig_hasher = BitcoinSigHasher()
@ -75,11 +104,17 @@ class TestSegwitBip143NativeP2WPKH(unittest.TestCase):
sig_hasher.add_output(txo_bin, script_pubkey) sig_hasher.add_output(txo_bin, script_pubkey)
outputs_hash = get_tx_hash(sig_hasher.h_outputs, double=coin.sign_hash_double) outputs_hash = get_tx_hash(sig_hasher.h_outputs, double=coin.sign_hash_double)
self.assertEqual(hexlify(outputs_hash), b'863ef3e1a92afbfdb97f31ad0fc7683ee943e9abcf2501590ff8f6551f47e5e5') self.assertEqual(
hexlify(outputs_hash),
b"863ef3e1a92afbfdb97f31ad0fc7683ee943e9abcf2501590ff8f6551f47e5e5",
)
def test_preimage_testdata(self): def test_preimage_testdata(self):
seed = bip39.seed('alcohol woman abuse must during monitor noble actual mixed trade anger aisle', '') seed = bip39.seed(
"alcohol woman abuse must during monitor noble actual mixed trade anger aisle",
"",
)
coin = coins.by_name(self.tx.coin_name) coin = coins.by_name(self.tx.coin_name)
sig_hasher = BitcoinSigHasher() sig_hasher = BitcoinSigHasher()
sig_hasher.add_input(self.inp1, b"") sig_hasher.add_input(self.inp1, b"")
@ -95,9 +130,14 @@ class TestSegwitBip143NativeP2WPKH(unittest.TestCase):
# test data public key hash # test data public key hash
# only for input 2 - input 1 is not segwit # only for input 2 - input 1 is not segwit
result = sig_hasher.hash143(self.inp2, [node.public_key()], 1, self.tx, coin, SigHashType.SIGHASH_ALL) result = sig_hasher.hash143(
self.assertEqual(hexlify(result), b'2fa3f1351618b2532228d7182d3221d95c21fd3d496e7e22e9ded873cf022a8b') self.inp2, [node.public_key()], 1, self.tx, coin, SigHashType.SIGHASH_ALL
)
self.assertEqual(
hexlify(result),
b"2fa3f1351618b2532228d7182d3221d95c21fd3d496e7e22e9ded873cf022a8b",
)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -19,42 +19,67 @@ from trezor.crypto import bip39
class TestSegwitBip143(unittest.TestCase): class TestSegwitBip143(unittest.TestCase):
# pylint: disable=C0301 # pylint: disable=C0301
tx = SignTx(coin_name='Bitcoin', version=1, lock_time=0x00000492, inputs_count=1, outputs_count=2) tx = SignTx(
inp1 = TxInput(address_n=[0], coin_name="Bitcoin",
version=1,
lock_time=0x00000492,
inputs_count=1,
outputs_count=2,
)
inp1 = TxInput(
address_n=[0],
# Trezor expects hash in reversed format # Trezor expects hash in reversed format
prev_hash=unhexlify('77541aeb3c4dac9260b68f74f44c973081a9d4cb2ebe8038b2d70faa201b6bdb'), prev_hash=unhexlify(
"77541aeb3c4dac9260b68f74f44c973081a9d4cb2ebe8038b2d70faa201b6bdb"
),
prev_index=1, prev_index=1,
multisig=None, multisig=None,
amount=1000000000, # 10 btc amount=1000000000, # 10 btc
script_type=InputScriptType.SPENDP2SHWITNESS, # TODO: is this correct? script_type=InputScriptType.SPENDP2SHWITNESS, # TODO: is this correct?
sequence=0xfffffffe) sequence=0xFFFFFFFE,
out1 = TxOutput(address='1Fyxts6r24DpEieygQiNnWxUdb18ANa5p7', )
amount=0x000000000bebb4b8, out1 = TxOutput(
address="1Fyxts6r24DpEieygQiNnWxUdb18ANa5p7",
amount=0x000000000BEBB4B8,
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
multisig=None, multisig=None,
address_n=[]) address_n=[],
out2 = TxOutput(address='1Q5YjKVj5yQWHBBsyEBamkfph3cA6G9KK8', )
amount=0x000000002faf0800, out2 = TxOutput(
address="1Q5YjKVj5yQWHBBsyEBamkfph3cA6G9KK8",
amount=0x000000002FAF0800,
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
multisig=None, multisig=None,
address_n=[]) address_n=[],
)
def test_bip143_prevouts(self): def test_bip143_prevouts(self):
coin = coins.by_name(self.tx.coin_name) coin = coins.by_name(self.tx.coin_name)
sig_hasher = BitcoinSigHasher() sig_hasher = BitcoinSigHasher()
sig_hasher.add_input(self.inp1, b"") sig_hasher.add_input(self.inp1, b"")
prevouts_hash = get_tx_hash(sig_hasher.h_prevouts, double=coin.sign_hash_double) prevouts_hash = get_tx_hash(sig_hasher.h_prevouts, double=coin.sign_hash_double)
self.assertEqual(hexlify(prevouts_hash), b'b0287b4a252ac05af83d2dcef00ba313af78a3e9c329afa216eb3aa2a7b4613a') self.assertEqual(
hexlify(prevouts_hash),
b"b0287b4a252ac05af83d2dcef00ba313af78a3e9c329afa216eb3aa2a7b4613a",
)
def test_bip143_sequence(self): def test_bip143_sequence(self):
coin = coins.by_name(self.tx.coin_name) coin = coins.by_name(self.tx.coin_name)
sig_hasher = BitcoinSigHasher() sig_hasher = BitcoinSigHasher()
sig_hasher.add_input(self.inp1, b"") sig_hasher.add_input(self.inp1, b"")
sequence_hash = get_tx_hash(sig_hasher.h_sequences, double=coin.sign_hash_double) sequence_hash = get_tx_hash(
self.assertEqual(hexlify(sequence_hash), b'18606b350cd8bf565266bc352f0caddcf01e8fa789dd8a15386327cf8cabe198') sig_hasher.h_sequences, double=coin.sign_hash_double
)
self.assertEqual(
hexlify(sequence_hash),
b"18606b350cd8bf565266bc352f0caddcf01e8fa789dd8a15386327cf8cabe198",
)
def test_bip143_outputs(self): def test_bip143_outputs(self):
seed = bip39.seed('alcohol woman abuse must during monitor noble actual mixed trade anger aisle', '') seed = bip39.seed(
"alcohol woman abuse must during monitor noble actual mixed trade anger aisle",
"",
)
coin = coins.by_name(self.tx.coin_name) coin = coins.by_name(self.tx.coin_name)
sig_hasher = BitcoinSigHasher() sig_hasher = BitcoinSigHasher()
@ -64,10 +89,16 @@ class TestSegwitBip143(unittest.TestCase):
sig_hasher.add_output(txo_bin, script_pubkey) sig_hasher.add_output(txo_bin, script_pubkey)
outputs_hash = get_tx_hash(sig_hasher.h_outputs, double=coin.sign_hash_double) outputs_hash = get_tx_hash(sig_hasher.h_outputs, double=coin.sign_hash_double)
self.assertEqual(hexlify(outputs_hash), b'de984f44532e2173ca0d64314fcefe6d30da6f8cf27bafa706da61df8a226c83') self.assertEqual(
hexlify(outputs_hash),
b"de984f44532e2173ca0d64314fcefe6d30da6f8cf27bafa706da61df8a226c83",
)
def test_bip143_preimage_testdata(self): def test_bip143_preimage_testdata(self):
seed = bip39.seed('alcohol woman abuse must during monitor noble actual mixed trade anger aisle', '') seed = bip39.seed(
"alcohol woman abuse must during monitor noble actual mixed trade anger aisle",
"",
)
coin = coins.by_name(self.tx.coin_name) coin = coins.by_name(self.tx.coin_name)
sig_hasher = BitcoinSigHasher() sig_hasher = BitcoinSigHasher()
sig_hasher.add_input(self.inp1, b"") sig_hasher.add_input(self.inp1, b"")
@ -80,9 +111,14 @@ class TestSegwitBip143(unittest.TestCase):
node = keychain.derive(self.inp1.address_n) node = keychain.derive(self.inp1.address_n)
# test data public key hash # test data public key hash
result = sig_hasher.hash143(self.inp1, [node.public_key()], 1, self.tx, coin, SigHashType.SIGHASH_ALL) result = sig_hasher.hash143(
self.assertEqual(hexlify(result), b'6e28aca7041720995d4acf59bbda64eef5d6f23723d23f2e994757546674bbd9') self.inp1, [node.public_key()], 1, self.tx, coin, SigHashType.SIGHASH_ALL
)
self.assertEqual(
hexlify(result),
b"6e28aca7041720995d4acf59bbda64eef5d6f23723d23f2e994757546674bbd9",
)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -11,115 +11,180 @@ from trezor.enums import InputScriptType
VECTORS = [ VECTORS = [
{ # https://github.com/bitcoin/bips/pull/1225/commits/f7af1f73b287c14cf2f63afcb8d199feaf6ab5e1 { # https://github.com/bitcoin/bips/pull/1225/commits/f7af1f73b287c14cf2f63afcb8d199feaf6ab5e1
"sign_tx": SignTx(coin_name='Bitcoin', version=2, lock_time=0x1dcd6500, inputs_count=9, outputs_count=2), "sign_tx": SignTx(
coin_name="Bitcoin",
version=2,
lock_time=0x1DCD6500,
inputs_count=9,
outputs_count=2,
),
"inputs": [ "inputs": [
TxInput( TxInput(
amount=420000000, amount=420000000,
prev_hash=unhexlify('9c4e333b5f116359b5f5578fe4a74c6f58b3bab9d28149a583da86f6bf0ce27d'), prev_hash=unhexlify(
"9c4e333b5f116359b5f5578fe4a74c6f58b3bab9d28149a583da86f6bf0ce27d"
),
prev_index=1, prev_index=1,
script_pubkey=unhexlify('512053a1f6e454df1aa2776a2814a721372d6258050de330b3c6d10ee8f4e0dda343'), script_pubkey=unhexlify(
"512053a1f6e454df1aa2776a2814a721372d6258050de330b3c6d10ee8f4e0dda343"
),
script_type=InputScriptType.SPENDTAPROOT, script_type=InputScriptType.SPENDTAPROOT,
sequence=0x00000000, sequence=0x00000000,
), ),
TxInput( TxInput(
amount=462000000, amount=462000000,
prev_hash=unhexlify('99ddaf6d9b75447d5127e17312f6def68acba2d4f464d0e2ac93137bb5cab7d7'), prev_hash=unhexlify(
"99ddaf6d9b75447d5127e17312f6def68acba2d4f464d0e2ac93137bb5cab7d7"
),
prev_index=0, prev_index=0,
script_pubkey=unhexlify('5120147c9c57132f6e7ecddba9800bb0c4449251c92a1e60371ee77557b6620f3ea3'), script_pubkey=unhexlify(
"5120147c9c57132f6e7ecddba9800bb0c4449251c92a1e60371ee77557b6620f3ea3"
),
script_type=InputScriptType.SPENDTAPROOT, script_type=InputScriptType.SPENDTAPROOT,
sequence=0xffffffff, sequence=0xFFFFFFFF,
), ),
TxInput( TxInput(
amount=294000000, amount=294000000,
prev_hash=unhexlify('4218a419542757d960174457dc82e06b3613ac8ed2c528926833433883f5e1f8'), prev_hash=unhexlify(
"4218a419542757d960174457dc82e06b3613ac8ed2c528926833433883f5e1f8"
),
prev_index=0, prev_index=0,
script_pubkey=unhexlify('76a914751e76e8199196d454941c45d1b3a323f1433bd688ac'), script_pubkey=unhexlify(
"76a914751e76e8199196d454941c45d1b3a323f1433bd688ac"
),
script_type=InputScriptType.SPENDADDRESS, script_type=InputScriptType.SPENDADDRESS,
sequence=0xffffffff, sequence=0xFFFFFFFF,
), ),
TxInput( TxInput(
amount=504000000, amount=504000000,
prev_hash=unhexlify('3b8504d63a84a0fd1043e7ec832adaeeb7382a6d3ca762b10cb363aa809168f0'), prev_hash=unhexlify(
"3b8504d63a84a0fd1043e7ec832adaeeb7382a6d3ca762b10cb363aa809168f0"
),
prev_index=1, prev_index=1,
script_pubkey=unhexlify('5120e4d810fd50586274face62b8a807eb9719cef49c04177cc6b76a9a4251d5450e'), script_pubkey=unhexlify(
"5120e4d810fd50586274face62b8a807eb9719cef49c04177cc6b76a9a4251d5450e"
),
script_type=InputScriptType.SPENDTAPROOT, script_type=InputScriptType.SPENDTAPROOT,
sequence=0xfffffffe, sequence=0xFFFFFFFE,
), ),
TxInput( TxInput(
amount=630000000, amount=630000000,
prev_hash=unhexlify('7a488f58881cecb2523690afcf22eb8892372bae018a125e1f006283a38c630c'), prev_hash=unhexlify(
"7a488f58881cecb2523690afcf22eb8892372bae018a125e1f006283a38c630c"
),
prev_index=0, prev_index=0,
script_pubkey=unhexlify('512091b64d5324723a985170e4dc5a0f84c041804f2cd12660fa5dec09fc21783605'), script_pubkey=unhexlify(
"512091b64d5324723a985170e4dc5a0f84c041804f2cd12660fa5dec09fc21783605"
),
script_type=InputScriptType.SPENDTAPROOT, script_type=InputScriptType.SPENDTAPROOT,
sequence=0xfffffffe, sequence=0xFFFFFFFE,
), ),
TxInput( TxInput(
amount=378000000, amount=378000000,
prev_hash=unhexlify('50d0ac326d44a3a29358214139fecb8a7129aa2f2dbeb28e96aa6fc6bd496195'), prev_hash=unhexlify(
"50d0ac326d44a3a29358214139fecb8a7129aa2f2dbeb28e96aa6fc6bd496195"
),
prev_index=0, prev_index=0,
script_pubkey=unhexlify('00147dd65592d0ab2fe0d0257d571abf032cd9db93dc'), script_pubkey=unhexlify("00147dd65592d0ab2fe0d0257d571abf032cd9db93dc"),
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
sequence=0x00000000, sequence=0x00000000,
), ),
TxInput( TxInput(
amount=672000000, amount=672000000,
prev_hash=unhexlify('3a013eb5a6a664585ddbc210e02147847cde7317c0ce4e056ee4f0f167a2ef81'), prev_hash=unhexlify(
"3a013eb5a6a664585ddbc210e02147847cde7317c0ce4e056ee4f0f167a2ef81"
),
prev_index=1, prev_index=1,
script_pubkey=unhexlify('512075169f4001aa68f15bbed28b218df1d0a62cbbcf1188c6665110c293c907b831'), script_pubkey=unhexlify(
"512075169f4001aa68f15bbed28b218df1d0a62cbbcf1188c6665110c293c907b831"
),
script_type=InputScriptType.SPENDTAPROOT, script_type=InputScriptType.SPENDTAPROOT,
sequence=0x00000000, sequence=0x00000000,
), ),
TxInput( TxInput(
amount=546000000, amount=546000000,
prev_hash=unhexlify('eebd075c693d6823dd39fe11e3a6d1993fdec6109860937d50624a3c9c6690a6'), prev_hash=unhexlify(
"eebd075c693d6823dd39fe11e3a6d1993fdec6109860937d50624a3c9c6690a6"
),
prev_index=0, prev_index=0,
script_pubkey=unhexlify('51200f63ca2c7639b9bb4be0465cc0aa3ee78a0761ba5f5f7d6ff8eab340f09da561'), script_pubkey=unhexlify(
"51200f63ca2c7639b9bb4be0465cc0aa3ee78a0761ba5f5f7d6ff8eab340f09da561"
),
script_type=InputScriptType.SPENDTAPROOT, script_type=InputScriptType.SPENDTAPROOT,
sequence=0xffffffff, sequence=0xFFFFFFFF,
), ),
TxInput( TxInput(
amount=588000000, amount=588000000,
prev_hash=unhexlify('9e667967d1eb839b9b0a1fd17b2f29e838ff0240a83c61f896844377f8b57a72'), prev_hash=unhexlify(
"9e667967d1eb839b9b0a1fd17b2f29e838ff0240a83c61f896844377f8b57a72"
),
prev_index=1, prev_index=1,
script_pubkey=unhexlify('5120053690babeabbb7850c32eead0acf8df990ced79f7a31e358fabf2658b4bc587'), script_pubkey=unhexlify(
"5120053690babeabbb7850c32eead0acf8df990ced79f7a31e358fabf2658b4bc587"
),
script_type=InputScriptType.SPENDTAPROOT, script_type=InputScriptType.SPENDTAPROOT,
sequence=0xffffffff, sequence=0xFFFFFFFF,
), ),
], ],
"outputs": [ "outputs": [
PrevOutput( PrevOutput(
amount=1000000000, amount=1000000000,
script_pubkey=unhexlify('76a91406afd46bcdfd22ef94ac122aa11f241244a37ecc88ac'), # 1cMh228HTCiwS8ZsaakH8A8wze1JR5ZsP script_pubkey=unhexlify(
"76a91406afd46bcdfd22ef94ac122aa11f241244a37ecc88ac"
), # 1cMh228HTCiwS8ZsaakH8A8wze1JR5ZsP
), ),
PrevOutput( PrevOutput(
amount=3410000000, amount=3410000000,
script_pubkey=unhexlify('ac9a87f5594be208f8532db38cff670c450ed2fea8fcdefcc9a663f78bab962b'), script_pubkey=unhexlify(
) "ac9a87f5594be208f8532db38cff670c450ed2fea8fcdefcc9a663f78bab962b"
),
),
], ],
"sha_amounts": unhexlify('58a6964a4f5f8f0b642ded0a8a553be7622a719da71d1f5befcefcdee8e0fde6'), "sha_amounts": unhexlify(
"sha_outputs": unhexlify('a2e6dab7c1f0dcd297c8d61647fd17d821541ea69c3cc37dcbad7f90d4eb4bc5'), "58a6964a4f5f8f0b642ded0a8a553be7622a719da71d1f5befcefcdee8e0fde6"
"sha_prevouts": unhexlify('2bd4d5a417902673919b2c209d14f8efaa285ede022a88d6a45edf4bdd43db11'), ),
"sha_scriptpubkeys": unhexlify('26003c31f2f1786d22fcb3e1f690ddcdff53627a59f9219d5a2c77985a8930c0'), "sha_outputs": unhexlify(
"sha_sequences": unhexlify('18959c7221ab5ce9e26c3cd67b22c24f8baa54bac281d8e6b05e400e6c3a957e'), "a2e6dab7c1f0dcd297c8d61647fd17d821541ea69c3cc37dcbad7f90d4eb4bc5"
"signature_hashes": ),
[ "sha_prevouts": unhexlify(
"2bd4d5a417902673919b2c209d14f8efaa285ede022a88d6a45edf4bdd43db11"
),
"sha_scriptpubkeys": unhexlify(
"26003c31f2f1786d22fcb3e1f690ddcdff53627a59f9219d5a2c77985a8930c0"
),
"sha_sequences": unhexlify(
"18959c7221ab5ce9e26c3cd67b22c24f8baa54bac281d8e6b05e400e6c3a957e"
),
"signature_hashes": [
{ {
"index": 3, "index": 3,
"hash_type": SigHashType.SIGHASH_ALL, "hash_type": SigHashType.SIGHASH_ALL,
"result": unhexlify('6ffd256e108685b41831385f57eebf2fca041bc6b5e607ea11b3e03d4cf9d9ba'), "result": unhexlify(
"6ffd256e108685b41831385f57eebf2fca041bc6b5e607ea11b3e03d4cf9d9ba"
),
}, },
{ {
"index": 4, "index": 4,
"hash_type": SigHashType.SIGHASH_ALL_TAPROOT, "hash_type": SigHashType.SIGHASH_ALL_TAPROOT,
"result": unhexlify('9f90136737540ccc18707e1fd398ad222a1a7e4dd65cbfd22dbe4660191efa58'), "result": unhexlify(
"9f90136737540ccc18707e1fd398ad222a1a7e4dd65cbfd22dbe4660191efa58"
),
}, },
] ],
}, },
{ # https://github.com/bitcoin/bips/pull/1191/commits/fa40b5ae3544c1ed1615ead93a688d72be963e08 { # https://github.com/bitcoin/bips/pull/1191/commits/fa40b5ae3544c1ed1615ead93a688d72be963e08
"sign_tx": SignTx(coin_name='Bitcoin', version=2, lock_time=0x00000000, inputs_count=2, outputs_count=1), "sign_tx": SignTx(
coin_name="Bitcoin",
version=2,
lock_time=0x00000000,
inputs_count=2,
outputs_count=1,
),
"inputs": [ "inputs": [
TxInput( TxInput(
prev_hash=unhexlify('8dcb562f365cfeb249be74e7865135cf035add604234fc0d8330b49bec92605f'), prev_hash=unhexlify(
"8dcb562f365cfeb249be74e7865135cf035add604234fc0d8330b49bec92605f"
),
prev_index=0, prev_index=0,
amount=500000000, # 5 btc amount=500000000, # 5 btc
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
@ -128,35 +193,52 @@ VECTORS = [
script_pubkey=unhexlify("0014196a5bea745288a7f947993c28e3a0f2108d2e0a"), script_pubkey=unhexlify("0014196a5bea745288a7f947993c28e3a0f2108d2e0a"),
), ),
TxInput( TxInput(
prev_hash=unhexlify('e1323b577ed0d216f4e52bf2b4c490710dfa0088dae3d15e8ba26ad792184361'), prev_hash=unhexlify(
"e1323b577ed0d216f4e52bf2b4c490710dfa0088dae3d15e8ba26ad792184361"
),
prev_index=1, prev_index=1,
multisig=None, multisig=None,
amount=600000000, # 6 btc amount=600000000, # 6 btc
script_type=InputScriptType.SPENDTAPROOT, script_type=InputScriptType.SPENDTAPROOT,
sequence=0, sequence=0,
script_pubkey=unhexlify("512029d942d0408906b359397b6f87c5145814a9aefc8c396dd05efa8b5b73576bf2"), script_pubkey=unhexlify(
"512029d942d0408906b359397b6f87c5145814a9aefc8c396dd05efa8b5b73576bf2"
),
), ),
], ],
"outputs": [ "outputs": [
PrevOutput( PrevOutput(
amount=1000000000, amount=1000000000,
script_pubkey=unhexlify('76a914682dfdbc97ab5c31300f36d3c12c6fd854b1b35a88ac'), # 1AVrNUPAytZZbisNduCacWcEVJS6eGRvaa script_pubkey=unhexlify(
"76a914682dfdbc97ab5c31300f36d3c12c6fd854b1b35a88ac"
), # 1AVrNUPAytZZbisNduCacWcEVJS6eGRvaa
), ),
], ],
"sha_amounts": unhexlify('5733468db74734c00efa0b466bca091d8f1aab074af2538f36bd0a734a5940c5'), "sha_amounts": unhexlify(
"sha_outputs": unhexlify('8cdee56004a241f9c79cc55b7d79eaed04909d84660502a2d4e9c357c2047cf5'), "5733468db74734c00efa0b466bca091d8f1aab074af2538f36bd0a734a5940c5"
"sha_prevouts": unhexlify('32553b113292dfa8216546e721388a6c19c76626ca65dc187e0348d6ed445f81'), ),
"sha_scriptpubkeys": unhexlify('423cd73484fc5e3e0a623442846c279c2216f25a2f32d161fea6c5821a1adde7'), "sha_outputs": unhexlify(
"sha_sequences": unhexlify('af5570f5a1810b7af78caf4bc70a660f0df51e42baf91d4de5b2328de0e83dfc'), "8cdee56004a241f9c79cc55b7d79eaed04909d84660502a2d4e9c357c2047cf5"
"signature_hashes": ),
[ "sha_prevouts": unhexlify(
"32553b113292dfa8216546e721388a6c19c76626ca65dc187e0348d6ed445f81"
),
"sha_scriptpubkeys": unhexlify(
"423cd73484fc5e3e0a623442846c279c2216f25a2f32d161fea6c5821a1adde7"
),
"sha_sequences": unhexlify(
"af5570f5a1810b7af78caf4bc70a660f0df51e42baf91d4de5b2328de0e83dfc"
),
"signature_hashes": [
{ {
"index": 1, "index": 1,
"hash_type": SigHashType.SIGHASH_ALL_TAPROOT, "hash_type": SigHashType.SIGHASH_ALL_TAPROOT,
"result": unhexlify('07333acfe6dce8196f1ad62b2e039a3d9f0b6627bf955be767c519c0f8789ff4'), "result": unhexlify(
"07333acfe6dce8196f1ad62b2e039a3d9f0b6627bf955be767c519c0f8789ff4"
),
},
],
}, },
]
}
] ]
@ -170,21 +252,39 @@ class TestSegwitBip341P2TR(unittest.TestCase):
for txi in tx["inputs"]: for txi in tx["inputs"]:
hasher.add_input(txi, txi.script_pubkey) hasher.add_input(txi, txi.script_pubkey)
self.assertEqual(get_tx_hash(hasher.h_amounts), tx["sha_amounts"], f"sha_amounts tx {i}") self.assertEqual(
self.assertEqual(get_tx_hash(hasher.h_prevouts), tx["sha_prevouts"], f"sha_prevouts tx {i}") get_tx_hash(hasher.h_amounts), tx["sha_amounts"], f"sha_amounts tx {i}"
self.assertEqual(get_tx_hash(hasher.h_scriptpubkeys), tx["sha_scriptpubkeys"], f"sha_scriptpubkeys tx {i}") )
self.assertEqual(get_tx_hash(hasher.h_sequences), tx["sha_sequences"], f"sha_sequences tx {i}") self.assertEqual(
get_tx_hash(hasher.h_prevouts),
tx["sha_prevouts"],
f"sha_prevouts tx {i}",
)
self.assertEqual(
get_tx_hash(hasher.h_scriptpubkeys),
tx["sha_scriptpubkeys"],
f"sha_scriptpubkeys tx {i}",
)
self.assertEqual(
get_tx_hash(hasher.h_sequences),
tx["sha_sequences"],
f"sha_sequences tx {i}",
)
for txo in tx["outputs"]: for txo in tx["outputs"]:
hasher.add_output(txo, txo.script_pubkey) hasher.add_output(txo, txo.script_pubkey)
self.assertEqual(get_tx_hash(hasher.h_outputs), tx["sha_outputs"], f"sha_outputs tx {i}") self.assertEqual(
get_tx_hash(hasher.h_outputs), tx["sha_outputs"], f"sha_outputs tx {i}"
)
for sh in tx["signature_hashes"]: for sh in tx["signature_hashes"]:
txi = tx["inputs"][sh["index"]] txi = tx["inputs"][sh["index"]]
result = hasher.hash341(sh["index"], tx["sign_tx"], sh["hash_type"]) result = hasher.hash341(sh["index"], tx["sign_tx"], sh["hash_type"])
self.assertEqual(result, sh["result"], f"signature_hash tx {i} input {sh['index']}") self.assertEqual(
result, sh["result"], f"signature_hash tx {i} input {sh['index']}"
)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -40,124 +40,189 @@ class TestSignSegwitTxNativeP2WPKH(unittest.TestCase):
def test_send_native_p2wpkh(self): def test_send_native_p2wpkh(self):
coin = coins.by_name('Testnet') coin = coins.by_name("Testnet")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
inp1 = TxInput( inp1 = TxInput(
# 49'/1'/0'/0/0" - tb1qqzv60m9ajw8drqulta4ld4gfx0rdh82un5s65s # 49'/1'/0'/0/0" - tb1qqzv60m9ajw8drqulta4ld4gfx0rdh82un5s65s
address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 0, 0], address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 0, 0],
amount=12300000, amount=12300000,
prev_hash=unhexlify('09144602765ce3dd8f4329445b20e3684e948709c5cdcaf12da3bb079c99448a'), prev_hash=unhexlify(
"09144602765ce3dd8f4329445b20e3684e948709c5cdcaf12da3bb079c99448a"
),
prev_index=0, prev_index=0,
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
sequence=0xffffffff, sequence=0xFFFFFFFF,
multisig=None, multisig=None,
) )
ptx1 = PrevTx(version=1, lock_time=0, inputs_count=1, outputs_count=2, extra_data_len=0) ptx1 = PrevTx(
pinp1 = PrevInput(script_sig=unhexlify('160014d16b8c0680c61fc6ed2e407455715055e41052f5'), version=1, lock_time=0, inputs_count=1, outputs_count=2, extra_data_len=0
prev_hash=unhexlify('20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337'), )
pinp1 = PrevInput(
script_sig=unhexlify("160014d16b8c0680c61fc6ed2e407455715055e41052f5"),
prev_hash=unhexlify(
"20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337"
),
prev_index=0, prev_index=0,
sequence=4294967295) sequence=4294967295,
pout1 = PrevOutput(script_pubkey=unhexlify('00140099a7ecbd938ed1839f5f6bf6d50933c6db9d5c'), )
amount=12300000) pout1 = PrevOutput(
pout2 = PrevOutput(script_pubkey=unhexlify('a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87'), script_pubkey=unhexlify("00140099a7ecbd938ed1839f5f6bf6d50933c6db9d5c"),
amount=111145789) amount=12300000,
)
pout2 = PrevOutput(
script_pubkey=unhexlify("a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87"),
amount=111145789,
)
out1 = TxOutput( out1 = TxOutput(
address='2N4Q5FhU2497BryFfUgbqkAJE87aKHUhXMp', address="2N4Q5FhU2497BryFfUgbqkAJE87aKHUhXMp",
amount=5000000, amount=5000000,
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
address_n=[], address_n=[],
multisig=None, multisig=None,
) )
out2 = TxOutput( out2 = TxOutput(
address='tb1q694ccp5qcc0udmfwgp692u2s2hjpq5h407urtu', address="tb1q694ccp5qcc0udmfwgp692u2s2hjpq5h407urtu",
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
amount=12300000 - 11000 - 5000000, amount=12300000 - 11000 - 5000000,
address_n=[], address_n=[],
multisig=None, multisig=None,
) )
tx = SignTx(coin_name='Testnet', version=1, lock_time=0, inputs_count=1, outputs_count=2) tx = SignTx(
coin_name="Testnet", version=1, lock_time=0, inputs_count=1, outputs_count=2
)
# precomputed tx weight is 142 = ceil(566 / 4) # precomputed tx weight is 142 = ceil(566 / 4)
fee_rate = 11000 / 142 fee_rate = 11000 / 142
messages = [ messages = [
None, None,
# check fee # check fee
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
helpers.UiConfirmForeignAddress(address_n=inp1.address_n), helpers.UiConfirmForeignAddress(address_n=inp1.address_n),
True, True,
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False), helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False),
True, True,
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out2)), TxAckOutput(tx=TxAckOutputWrapper(output=out2)),
helpers.UiConfirmOutput(out2, coin, AmountUnit.BITCOIN, 1, False), helpers.UiConfirmOutput(out2, coin, AmountUnit.BITCOIN, 1, False),
True, True,
helpers.UiConfirmTotal(
helpers.UiConfirmTotal(12300000, 11000, fee_rate, coin, AmountUnit.BITCOIN, inp1.address_n[:3]), 12300000, 11000, fee_rate, coin, AmountUnit.BITCOIN, inp1.address_n[:3]
),
True, True,
# check prev tx # check prev tx
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXMETA, details=TxRequestDetailsType(request_index=None, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXMETA,
details=TxRequestDetailsType(
request_index=None, tx_hash=inp1.prev_hash
),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevMeta(tx=ptx1), TxAckPrevMeta(tx=ptx1),
TxRequest(
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)), TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout2)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout2)),
# sign tx # sign tx
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized header # returned serialized header
serialized_tx=unhexlify('01000000000101'), serialized_tx=unhexlify("01000000000101"),
)), ),
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized inp1 # returned serialized inp1
serialized_tx=unhexlify('8a44999c07bba32df1cacdc50987944e68e3205b4429438fdde35c76024614090000000000ffffffff02'), serialized_tx=unhexlify(
)), "8a44999c07bba32df1cacdc50987944e68e3205b4429438fdde35c76024614090000000000ffffffff02"
),
),
),
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=None), serialized=TxRequestSerializedType( request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized out1 # returned serialized out1
serialized_tx=unhexlify('404b4c000000000017a9147a55d61848e77ca266e79a39bfc85c580a6426c987'), serialized_tx=unhexlify(
"404b4c000000000017a9147a55d61848e77ca266e79a39bfc85c580a6426c987"
),
signature_index=None, signature_index=None,
signature=None, signature=None,
)), ),
),
TxAckOutput(tx=TxAckOutputWrapper(output=out2)), TxAckOutput(tx=TxAckOutputWrapper(output=out2)),
# segwit # segwit
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized out2 # returned serialized out2
serialized_tx=unhexlify('a8386f0000000000160014d16b8c0680c61fc6ed2e407455715055e41052f5'), serialized_tx=unhexlify(
"a8386f0000000000160014d16b8c0680c61fc6ed2e407455715055e41052f5"
),
signature_index=None, signature_index=None,
signature=None, signature=None,
)), ),
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXFINISHED, details=TxRequestDetailsType(), serialized=TxRequestSerializedType( request_type=TXFINISHED,
serialized_tx=unhexlify('02483045022100a7ca8f097525f9044e64376dc0a0f5d4aeb8d15d66808ba97979a0475b06b66502200597c8ebcef63e047f9aeef1a8001d3560470cf896c12f6990eec4faec599b950121033add1f0e8e3c3136f7428dd4a4de1057380bd311f5b0856e2269170b4ffa65bf00000000'), details=TxRequestDetailsType(),
serialized=TxRequestSerializedType(
serialized_tx=unhexlify(
"02483045022100a7ca8f097525f9044e64376dc0a0f5d4aeb8d15d66808ba97979a0475b06b66502200597c8ebcef63e047f9aeef1a8001d3560470cf896c12f6990eec4faec599b950121033add1f0e8e3c3136f7428dd4a4de1057380bd311f5b0856e2269170b4ffa65bf00000000"
),
signature_index=0, signature_index=0,
signature=unhexlify('3045022100a7ca8f097525f9044e64376dc0a0f5d4aeb8d15d66808ba97979a0475b06b66502200597c8ebcef63e047f9aeef1a8001d3560470cf896c12f6990eec4faec599b95'), signature=unhexlify(
)), "3045022100a7ca8f097525f9044e64376dc0a0f5d4aeb8d15d66808ba97979a0475b06b66502200597c8ebcef63e047f9aeef1a8001d3560470cf896c12f6990eec4faec599b95"
),
),
),
] ]
ns = _get_schemas_for_coin(coin) ns = _get_schemas_for_coin(coin)
@ -173,31 +238,43 @@ class TestSignSegwitTxNativeP2WPKH(unittest.TestCase):
def test_send_native_p2wpkh_change(self): def test_send_native_p2wpkh_change(self):
coin = coins.by_name('Testnet') coin = coins.by_name("Testnet")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
inp1 = TxInput( inp1 = TxInput(
# 49'/1'/0'/0/0" - tb1qqzv60m9ajw8drqulta4ld4gfx0rdh82un5s65s # 49'/1'/0'/0/0" - tb1qqzv60m9ajw8drqulta4ld4gfx0rdh82un5s65s
address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 0, 0], address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 0, 0],
amount=12300000, amount=12300000,
prev_hash=unhexlify('09144602765ce3dd8f4329445b20e3684e948709c5cdcaf12da3bb079c99448a'), prev_hash=unhexlify(
"09144602765ce3dd8f4329445b20e3684e948709c5cdcaf12da3bb079c99448a"
),
prev_index=0, prev_index=0,
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
sequence=0xffffffff, sequence=0xFFFFFFFF,
multisig=None, multisig=None,
) )
ptx1 = PrevTx(version=1, lock_time=0, inputs_count=1, outputs_count=2, extra_data_len=0) ptx1 = PrevTx(
pinp1 = PrevInput(script_sig=unhexlify('160014d16b8c0680c61fc6ed2e407455715055e41052f5'), version=1, lock_time=0, inputs_count=1, outputs_count=2, extra_data_len=0
prev_hash=unhexlify('20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337'), )
pinp1 = PrevInput(
script_sig=unhexlify("160014d16b8c0680c61fc6ed2e407455715055e41052f5"),
prev_hash=unhexlify(
"20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337"
),
prev_index=0, prev_index=0,
sequence=4294967295) sequence=4294967295,
pout1 = PrevOutput(script_pubkey=unhexlify('00140099a7ecbd938ed1839f5f6bf6d50933c6db9d5c'), )
amount=12300000) pout1 = PrevOutput(
pout2 = PrevOutput(script_pubkey=unhexlify('a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87'), script_pubkey=unhexlify("00140099a7ecbd938ed1839f5f6bf6d50933c6db9d5c"),
amount=111145789) amount=12300000,
)
pout2 = PrevOutput(
script_pubkey=unhexlify("a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87"),
amount=111145789,
)
out1 = TxOutput( out1 = TxOutput(
address='2N4Q5FhU2497BryFfUgbqkAJE87aKHUhXMp', address="2N4Q5FhU2497BryFfUgbqkAJE87aKHUhXMp",
amount=5000000, amount=5000000,
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
address_n=[], address_n=[],
@ -211,88 +288,145 @@ class TestSignSegwitTxNativeP2WPKH(unittest.TestCase):
amount=12300000 - 11000 - 5000000, amount=12300000 - 11000 - 5000000,
multisig=None, multisig=None,
) )
tx = SignTx(coin_name='Testnet', version=1, lock_time=0, inputs_count=1, outputs_count=2) tx = SignTx(
coin_name="Testnet", version=1, lock_time=0, inputs_count=1, outputs_count=2
)
# precomputed tx weight is 142 = ceil(566 / 4) # precomputed tx weight is 142 = ceil(566 / 4)
fee_rate = 11000 / 142 fee_rate = 11000 / 142
messages = [ messages = [
None, None,
# check fee # check fee
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
helpers.UiConfirmForeignAddress(address_n=inp1.address_n), helpers.UiConfirmForeignAddress(address_n=inp1.address_n),
True, True,
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False), helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False),
True, True,
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out2)), TxAckOutput(tx=TxAckOutputWrapper(output=out2)),
helpers.UiConfirmForeignAddress(address_n=out2.address_n), helpers.UiConfirmForeignAddress(address_n=out2.address_n),
True, True,
helpers.UiConfirmTotal(
helpers.UiConfirmTotal(5000000 + 11000, 11000, fee_rate, coin, AmountUnit.BITCOIN, inp1.address_n[:3]), 5000000 + 11000,
11000,
fee_rate,
coin,
AmountUnit.BITCOIN,
inp1.address_n[:3],
),
True, True,
# check prev tx # check prev tx
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXMETA, details=TxRequestDetailsType(request_index=None, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXMETA,
details=TxRequestDetailsType(
request_index=None, tx_hash=inp1.prev_hash
),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevMeta(tx=ptx1), TxAckPrevMeta(tx=ptx1),
TxRequest(
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)), TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout2)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout2)),
# sign tx # sign tx
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized header # returned serialized header
serialized_tx=unhexlify('01000000000101'), serialized_tx=unhexlify("01000000000101"),
)), ),
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized inp1 # returned serialized inp1
serialized_tx=unhexlify('8a44999c07bba32df1cacdc50987944e68e3205b4429438fdde35c76024614090000000000ffffffff02'), serialized_tx=unhexlify(
)), "8a44999c07bba32df1cacdc50987944e68e3205b4429438fdde35c76024614090000000000ffffffff02"
),
),
),
# the out has to be cloned not to send the same object which was modified # the out has to be cloned not to send the same object which was modified
TxAckOutput(tx=TxAckOutputWrapper(output=TxOutput(**out1.__dict__))), TxAckOutput(tx=TxAckOutputWrapper(output=TxOutput(**out1.__dict__))),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=None), serialized=TxRequestSerializedType( request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized out1 # returned serialized out1
serialized_tx=unhexlify('404b4c000000000017a9147a55d61848e77ca266e79a39bfc85c580a6426c987'), serialized_tx=unhexlify(
"404b4c000000000017a9147a55d61848e77ca266e79a39bfc85c580a6426c987"
),
signature_index=None, signature_index=None,
signature=None, signature=None,
)), ),
),
TxAckOutput(tx=TxAckOutputWrapper(output=TxOutput(**out2.__dict__))), TxAckOutput(tx=TxAckOutputWrapper(output=TxOutput(**out2.__dict__))),
# segwit # segwit
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized out2 # returned serialized out2
serialized_tx=unhexlify('a8386f0000000000160014d16b8c0680c61fc6ed2e407455715055e41052f5'), serialized_tx=unhexlify(
"a8386f0000000000160014d16b8c0680c61fc6ed2e407455715055e41052f5"
),
signature_index=None, signature_index=None,
signature=None, signature=None,
)), ),
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXFINISHED, details=TxRequestDetailsType(), serialized=TxRequestSerializedType( request_type=TXFINISHED,
serialized_tx=unhexlify('02483045022100a7ca8f097525f9044e64376dc0a0f5d4aeb8d15d66808ba97979a0475b06b66502200597c8ebcef63e047f9aeef1a8001d3560470cf896c12f6990eec4faec599b950121033add1f0e8e3c3136f7428dd4a4de1057380bd311f5b0856e2269170b4ffa65bf00000000'), details=TxRequestDetailsType(),
serialized=TxRequestSerializedType(
serialized_tx=unhexlify(
"02483045022100a7ca8f097525f9044e64376dc0a0f5d4aeb8d15d66808ba97979a0475b06b66502200597c8ebcef63e047f9aeef1a8001d3560470cf896c12f6990eec4faec599b950121033add1f0e8e3c3136f7428dd4a4de1057380bd311f5b0856e2269170b4ffa65bf00000000"
),
signature_index=0, signature_index=0,
signature=unhexlify('3045022100a7ca8f097525f9044e64376dc0a0f5d4aeb8d15d66808ba97979a0475b06b66502200597c8ebcef63e047f9aeef1a8001d3560470cf896c12f6990eec4faec599b95'), signature=unhexlify(
)), "3045022100a7ca8f097525f9044e64376dc0a0f5d4aeb8d15d66808ba97979a0475b06b66502200597c8ebcef63e047f9aeef1a8001d3560470cf896c12f6990eec4faec599b95"
),
),
),
] ]
ns = _get_schemas_for_coin(coin) ns = _get_schemas_for_coin(coin)
@ -308,51 +442,70 @@ class TestSignSegwitTxNativeP2WPKH(unittest.TestCase):
def test_send_native_invalid_address(self): def test_send_native_invalid_address(self):
coin = coins.by_name('Testnet') coin = coins.by_name("Testnet")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
inp1 = TxInput( inp1 = TxInput(
# 49'/1'/0'/0/0" - tb1qqzv60m9ajw8drqulta4ld4gfx0rdh82un5s65s # 49'/1'/0'/0/0" - tb1qqzv60m9ajw8drqulta4ld4gfx0rdh82un5s65s
address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 0, 0], address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 0, 0],
amount=12300000, amount=12300000,
prev_hash=unhexlify('09144602765ce3dd8f4329445b20e3684e948709c5cdcaf12da3bb079c99448a'), prev_hash=unhexlify(
"09144602765ce3dd8f4329445b20e3684e948709c5cdcaf12da3bb079c99448a"
),
prev_index=0, prev_index=0,
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
sequence=0xffffffff, sequence=0xFFFFFFFF,
multisig=None, multisig=None,
) )
ptx1 = PrevTx(version=1, lock_time=0, inputs_count=1, outputs_count=2, extra_data_len=0) ptx1 = PrevTx(
pinp1 = PrevInput(script_sig=unhexlify('160014d16b8c0680c61fc6ed2e407455715055e41052f5'), version=1, lock_time=0, inputs_count=1, outputs_count=2, extra_data_len=0
prev_hash=unhexlify('20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337'), )
pinp1 = PrevInput(
script_sig=unhexlify("160014d16b8c0680c61fc6ed2e407455715055e41052f5"),
prev_hash=unhexlify(
"20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337"
),
prev_index=0, prev_index=0,
sequence=4294967295) sequence=4294967295,
pout1 = PrevOutput(script_pubkey=unhexlify('00140099a7ecbd938ed1839f5f6bf6d50933c6db9d5c'), )
amount=12300000) pout1 = PrevOutput(
pout2 = PrevOutput(script_pubkey=unhexlify('a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87'), script_pubkey=unhexlify("00140099a7ecbd938ed1839f5f6bf6d50933c6db9d5c"),
amount=111145789) amount=12300000,
)
pout2 = PrevOutput(
script_pubkey=unhexlify("a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87"),
amount=111145789,
)
out1 = TxOutput( out1 = TxOutput(
address='TB1Q694CCP5QCC0UDMFWGP692U2S2HJPQ5H407URTU', # Error: should be lower case address="TB1Q694CCP5QCC0UDMFWGP692U2S2HJPQ5H407URTU", # Error: should be lower case
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
amount=12300000 - 11000 - 5000000, amount=12300000 - 11000 - 5000000,
address_n=[], address_n=[],
multisig=None, multisig=None,
) )
tx = SignTx(coin_name='Testnet', version=1, lock_time=0, inputs_count=1, outputs_count=1) tx = SignTx(
coin_name="Testnet", version=1, lock_time=0, inputs_count=1, outputs_count=1
)
messages = [ messages = [
None, None,
# check fee # check fee
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
helpers.UiConfirmForeignAddress(address_n=inp1.address_n), helpers.UiConfirmForeignAddress(address_n=inp1.address_n),
True, True,
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
None None,
] ]
ns = _get_schemas_for_coin(coin) ns = _get_schemas_for_coin(coin)
@ -369,5 +522,5 @@ class TestSignSegwitTxNativeP2WPKH(unittest.TestCase):
self.assertEqual(response, expected_response) self.assertEqual(response, expected_response)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -41,124 +41,201 @@ class TestSignSegwitTxNativeP2WPKH_GRS(unittest.TestCase):
def test_send_native_p2wpkh(self): def test_send_native_p2wpkh(self):
coin = coins.by_name('Groestlcoin Testnet') coin = coins.by_name("Groestlcoin Testnet")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
inp1 = TxInput( inp1 = TxInput(
# 84'/1'/0'/0/0" - tgrs1qkvwu9g3k2pdxewfqr7syz89r3gj557l3ued7ja # 84'/1'/0'/0/0" - tgrs1qkvwu9g3k2pdxewfqr7syz89r3gj557l3ued7ja
address_n=[84 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 0, 0], address_n=[84 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 0, 0],
amount=12300000, amount=12300000,
prev_hash=unhexlify('4f2f857f39ed1afe05542d058fb0be865a387446e32fc876d086203f483f61d1'), prev_hash=unhexlify(
"4f2f857f39ed1afe05542d058fb0be865a387446e32fc876d086203f483f61d1"
),
prev_index=0, prev_index=0,
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
sequence=0xfffffffe, sequence=0xFFFFFFFE,
multisig=None, multisig=None,
) )
ptx1 = PrevTx(version=1, lock_time=650645, inputs_count=1, outputs_count=2, extra_data_len=0) ptx1 = PrevTx(
pinp1 = PrevInput(script_sig=unhexlify('483045022100d9615361c044e91f6dd7bb4455f3ad686cd5a663d7800bb74c448b2706500ccb022026bed24b81a501e8398411c5a9a793741d9bfe39617d51c363dde0a84f44f4f9012102659a6eefcc72d6f2eff92e57095388b17db0b06034946ecd44120e5e7a830ff4'), version=1,
prev_hash=unhexlify('1c92508b38239e5c10b23fb46dcf765ee2f3a95b835edbf0943ec21b21711160'), lock_time=650645,
inputs_count=1,
outputs_count=2,
extra_data_len=0,
)
pinp1 = PrevInput(
script_sig=unhexlify(
"483045022100d9615361c044e91f6dd7bb4455f3ad686cd5a663d7800bb74c448b2706500ccb022026bed24b81a501e8398411c5a9a793741d9bfe39617d51c363dde0a84f44f4f9012102659a6eefcc72d6f2eff92e57095388b17db0b06034946ecd44120e5e7a830ff4"
),
prev_hash=unhexlify(
"1c92508b38239e5c10b23fb46dcf765ee2f3a95b835edbf0943ec21b21711160"
),
prev_index=1, prev_index=1,
sequence=4294967293) sequence=4294967293,
pout1 = PrevOutput(script_pubkey=unhexlify('0014b31dc2a236505a6cb9201fa0411ca38a254a7bf1'), )
amount=12300000) pout1 = PrevOutput(
pout2 = PrevOutput(script_pubkey=unhexlify('76a91438cc090e4a4b2e458c33fe35af1c5c0094699ac288ac'), script_pubkey=unhexlify("0014b31dc2a236505a6cb9201fa0411ca38a254a7bf1"),
amount=9887699777) amount=12300000,
)
pout2 = PrevOutput(
script_pubkey=unhexlify(
"76a91438cc090e4a4b2e458c33fe35af1c5c0094699ac288ac"
),
amount=9887699777,
)
out1 = TxOutput( out1 = TxOutput(
address='2N4Q5FhU2497BryFfUgbqkAJE87aKDv3V3e', address="2N4Q5FhU2497BryFfUgbqkAJE87aKDv3V3e",
amount=5000000, amount=5000000,
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
address_n=[], address_n=[],
multisig=None, multisig=None,
) )
out2 = TxOutput( out2 = TxOutput(
address='tgrs1qejqxwzfld7zr6mf7ygqy5s5se5xq7vmt9lkd57', address="tgrs1qejqxwzfld7zr6mf7ygqy5s5se5xq7vmt9lkd57",
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
amount=12300000 - 11000 - 5000000, amount=12300000 - 11000 - 5000000,
address_n=[], address_n=[],
multisig=None, multisig=None,
) )
tx = SignTx(coin_name='Groestlcoin Testnet', version=1, lock_time=650713, inputs_count=1, outputs_count=2) tx = SignTx(
coin_name="Groestlcoin Testnet",
version=1,
lock_time=650713,
inputs_count=1,
outputs_count=2,
)
# precomputed tx weight is 142 = ceil(566 / 4) # precomputed tx weight is 142 = ceil(566 / 4)
fee_rate = 11000 / 142 fee_rate = 11000 / 142
messages = [ messages = [
None, None,
# check fee # check fee
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False), helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False),
True, True,
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out2)), TxAckOutput(tx=TxAckOutputWrapper(output=out2)),
helpers.UiConfirmOutput(out2, coin, AmountUnit.BITCOIN, 1, False), helpers.UiConfirmOutput(out2, coin, AmountUnit.BITCOIN, 1, False),
True, True,
helpers.UiConfirmNonDefaultLocktime(tx.lock_time, lock_time_disabled=False), helpers.UiConfirmNonDefaultLocktime(tx.lock_time, lock_time_disabled=False),
True, True,
helpers.UiConfirmTotal(
helpers.UiConfirmTotal(12300000, 11000, fee_rate, coin, AmountUnit.BITCOIN, inp1.address_n[:3]), 12300000, 11000, fee_rate, coin, AmountUnit.BITCOIN, inp1.address_n[:3]
),
True, True,
# check prev tx # check prev tx
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXMETA, details=TxRequestDetailsType(request_index=None, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXMETA,
details=TxRequestDetailsType(
request_index=None, tx_hash=inp1.prev_hash
),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevMeta(tx=ptx1), TxAckPrevMeta(tx=ptx1),
TxRequest(
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)), TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout2)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout2)),
# sign tx # sign tx
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized header # returned serialized header
serialized_tx=unhexlify('01000000000101'), serialized_tx=unhexlify("01000000000101"),
)), ),
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized inp1 # returned serialized inp1
serialized_tx=unhexlify('d1613f483f2086d076c82fe34674385a86beb08f052d5405fe1aed397f852f4f0000000000feffffff02'), serialized_tx=unhexlify(
)), "d1613f483f2086d076c82fe34674385a86beb08f052d5405fe1aed397f852f4f0000000000feffffff02"
),
),
),
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=None), serialized=TxRequestSerializedType( request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized out1 # returned serialized out1
serialized_tx=unhexlify('404b4c000000000017a9147a55d61848e77ca266e79a39bfc85c580a6426c987'), serialized_tx=unhexlify(
"404b4c000000000017a9147a55d61848e77ca266e79a39bfc85c580a6426c987"
),
signature_index=None, signature_index=None,
signature=None, signature=None,
)), ),
),
TxAckOutput(tx=TxAckOutputWrapper(output=out2)), TxAckOutput(tx=TxAckOutputWrapper(output=out2)),
# segwit # segwit
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized out2 # returned serialized out2
serialized_tx=unhexlify('a8386f0000000000160014cc8067093f6f843d6d3e22004a4290cd0c0f336b'), serialized_tx=unhexlify(
"a8386f0000000000160014cc8067093f6f843d6d3e22004a4290cd0c0f336b"
),
signature_index=None, signature_index=None,
signature=None, signature=None,
)), ),
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXFINISHED, details=TxRequestDetailsType(), serialized=TxRequestSerializedType( request_type=TXFINISHED,
serialized_tx=unhexlify('02483045022100ea8780bc1e60e14e945a80654a41748bbf1aa7d6f2e40a88d91dfc2de1f34bd10220181a474a3420444bd188501d8d270736e1e9fe379da9970de992ff445b0972e3012103adc58245cf28406af0ef5cc24b8afba7f1be6c72f279b642d85c48798685f862d9ed0900'), details=TxRequestDetailsType(),
serialized=TxRequestSerializedType(
serialized_tx=unhexlify(
"02483045022100ea8780bc1e60e14e945a80654a41748bbf1aa7d6f2e40a88d91dfc2de1f34bd10220181a474a3420444bd188501d8d270736e1e9fe379da9970de992ff445b0972e3012103adc58245cf28406af0ef5cc24b8afba7f1be6c72f279b642d85c48798685f862d9ed0900"
),
signature_index=0, signature_index=0,
signature=unhexlify('3045022100ea8780bc1e60e14e945a80654a41748bbf1aa7d6f2e40a88d91dfc2de1f34bd10220181a474a3420444bd188501d8d270736e1e9fe379da9970de992ff445b0972e3'), signature=unhexlify(
)), "3045022100ea8780bc1e60e14e945a80654a41748bbf1aa7d6f2e40a88d91dfc2de1f34bd10220181a474a3420444bd188501d8d270736e1e9fe379da9970de992ff445b0972e3"
),
),
),
] ]
ns = _get_schemas_for_coin(coin) ns = _get_schemas_for_coin(coin)
@ -174,31 +251,51 @@ class TestSignSegwitTxNativeP2WPKH_GRS(unittest.TestCase):
def test_send_native_p2wpkh_change(self): def test_send_native_p2wpkh_change(self):
coin = coins.by_name('Groestlcoin Testnet') coin = coins.by_name("Groestlcoin Testnet")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
inp1 = TxInput( inp1 = TxInput(
# 84'/1'/0'/0/0" - tgrs1qkvwu9g3k2pdxewfqr7syz89r3gj557l3ued7ja # 84'/1'/0'/0/0" - tgrs1qkvwu9g3k2pdxewfqr7syz89r3gj557l3ued7ja
address_n=[84 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 0, 0], address_n=[84 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 0, 0],
amount=12300000, amount=12300000,
prev_hash=unhexlify('4f2f857f39ed1afe05542d058fb0be865a387446e32fc876d086203f483f61d1'), prev_hash=unhexlify(
"4f2f857f39ed1afe05542d058fb0be865a387446e32fc876d086203f483f61d1"
),
prev_index=0, prev_index=0,
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
sequence=0xfffffffe, sequence=0xFFFFFFFE,
multisig=None, multisig=None,
) )
ptx1 = PrevTx(version=1, lock_time=650645, inputs_count=1, outputs_count=2, extra_data_len=0) ptx1 = PrevTx(
pinp1 = PrevInput(script_sig=unhexlify('483045022100d9615361c044e91f6dd7bb4455f3ad686cd5a663d7800bb74c448b2706500ccb022026bed24b81a501e8398411c5a9a793741d9bfe39617d51c363dde0a84f44f4f9012102659a6eefcc72d6f2eff92e57095388b17db0b06034946ecd44120e5e7a830ff4'), version=1,
prev_hash=unhexlify('1c92508b38239e5c10b23fb46dcf765ee2f3a95b835edbf0943ec21b21711160'), lock_time=650645,
inputs_count=1,
outputs_count=2,
extra_data_len=0,
)
pinp1 = PrevInput(
script_sig=unhexlify(
"483045022100d9615361c044e91f6dd7bb4455f3ad686cd5a663d7800bb74c448b2706500ccb022026bed24b81a501e8398411c5a9a793741d9bfe39617d51c363dde0a84f44f4f9012102659a6eefcc72d6f2eff92e57095388b17db0b06034946ecd44120e5e7a830ff4"
),
prev_hash=unhexlify(
"1c92508b38239e5c10b23fb46dcf765ee2f3a95b835edbf0943ec21b21711160"
),
prev_index=1, prev_index=1,
sequence=4294967293) sequence=4294967293,
pout1 = PrevOutput(script_pubkey=unhexlify('0014b31dc2a236505a6cb9201fa0411ca38a254a7bf1'), )
amount=12300000) pout1 = PrevOutput(
pout2 = PrevOutput(script_pubkey=unhexlify('76a91438cc090e4a4b2e458c33fe35af1c5c0094699ac288ac'), script_pubkey=unhexlify("0014b31dc2a236505a6cb9201fa0411ca38a254a7bf1"),
amount=9887699777) amount=12300000,
)
pout2 = PrevOutput(
script_pubkey=unhexlify(
"76a91438cc090e4a4b2e458c33fe35af1c5c0094699ac288ac"
),
amount=9887699777,
)
out1 = TxOutput( out1 = TxOutput(
address='2N4Q5FhU2497BryFfUgbqkAJE87aKDv3V3e', address="2N4Q5FhU2497BryFfUgbqkAJE87aKDv3V3e",
amount=5000000, amount=5000000,
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
address_n=[], address_n=[],
@ -212,85 +309,147 @@ class TestSignSegwitTxNativeP2WPKH_GRS(unittest.TestCase):
amount=12300000 - 11000 - 5000000, amount=12300000 - 11000 - 5000000,
multisig=None, multisig=None,
) )
tx = SignTx(coin_name='Groestlcoin Testnet', version=1, lock_time=650713, inputs_count=1, outputs_count=2) tx = SignTx(
coin_name="Groestlcoin Testnet",
version=1,
lock_time=650713,
inputs_count=1,
outputs_count=2,
)
# precomputed tx weight is 142 = ceil(566 / 4) # precomputed tx weight is 142 = ceil(566 / 4)
fee_rate = 11000 / 142 fee_rate = 11000 / 142
messages = [ messages = [
None, None,
# check fee # check fee
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False), helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False),
True, True,
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out2)), TxAckOutput(tx=TxAckOutputWrapper(output=out2)),
helpers.UiConfirmNonDefaultLocktime(tx.lock_time, lock_time_disabled=False), helpers.UiConfirmNonDefaultLocktime(tx.lock_time, lock_time_disabled=False),
True, True,
helpers.UiConfirmTotal(
helpers.UiConfirmTotal(5000000 + 11000, 11000, fee_rate, coin, AmountUnit.BITCOIN, inp1.address_n[:3]), 5000000 + 11000,
11000,
fee_rate,
coin,
AmountUnit.BITCOIN,
inp1.address_n[:3],
),
True, True,
# check prev tx # check prev tx
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXMETA, details=TxRequestDetailsType(request_index=None, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXMETA,
details=TxRequestDetailsType(
request_index=None, tx_hash=inp1.prev_hash
),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevMeta(tx=ptx1), TxAckPrevMeta(tx=ptx1),
TxRequest(
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)), TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout2)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout2)),
# sign tx # sign tx
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized header # returned serialized header
serialized_tx=unhexlify('01000000000101'), serialized_tx=unhexlify("01000000000101"),
)), ),
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized inp1 # returned serialized inp1
serialized_tx=unhexlify('d1613f483f2086d076c82fe34674385a86beb08f052d5405fe1aed397f852f4f0000000000feffffff02'), serialized_tx=unhexlify(
)), "d1613f483f2086d076c82fe34674385a86beb08f052d5405fe1aed397f852f4f0000000000feffffff02"
),
),
),
# the out has to be cloned not to send the same object which was modified # the out has to be cloned not to send the same object which was modified
TxAckOutput(tx=TxAckOutputWrapper(output=TxOutput(**out1.__dict__))), TxAckOutput(tx=TxAckOutputWrapper(output=TxOutput(**out1.__dict__))),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=None), serialized=TxRequestSerializedType( request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized out1 # returned serialized out1
serialized_tx=unhexlify('404b4c000000000017a9147a55d61848e77ca266e79a39bfc85c580a6426c987'), serialized_tx=unhexlify(
"404b4c000000000017a9147a55d61848e77ca266e79a39bfc85c580a6426c987"
),
signature_index=None, signature_index=None,
signature=None, signature=None,
)), ),
),
TxAckOutput(tx=TxAckOutputWrapper(output=TxOutput(**out2.__dict__))), TxAckOutput(tx=TxAckOutputWrapper(output=TxOutput(**out2.__dict__))),
# segwit # segwit
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized out2 # returned serialized out2
serialized_tx=unhexlify('a8386f0000000000160014cc8067093f6f843d6d3e22004a4290cd0c0f336b'), serialized_tx=unhexlify(
"a8386f0000000000160014cc8067093f6f843d6d3e22004a4290cd0c0f336b"
),
signature_index=None, signature_index=None,
signature=None, signature=None,
)), ),
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXFINISHED, details=TxRequestDetailsType(), serialized=TxRequestSerializedType( request_type=TXFINISHED,
serialized_tx=unhexlify('02483045022100ea8780bc1e60e14e945a80654a41748bbf1aa7d6f2e40a88d91dfc2de1f34bd10220181a474a3420444bd188501d8d270736e1e9fe379da9970de992ff445b0972e3012103adc58245cf28406af0ef5cc24b8afba7f1be6c72f279b642d85c48798685f862d9ed0900'), details=TxRequestDetailsType(),
serialized=TxRequestSerializedType(
serialized_tx=unhexlify(
"02483045022100ea8780bc1e60e14e945a80654a41748bbf1aa7d6f2e40a88d91dfc2de1f34bd10220181a474a3420444bd188501d8d270736e1e9fe379da9970de992ff445b0972e3012103adc58245cf28406af0ef5cc24b8afba7f1be6c72f279b642d85c48798685f862d9ed0900"
),
signature_index=0, signature_index=0,
signature=unhexlify('3045022100ea8780bc1e60e14e945a80654a41748bbf1aa7d6f2e40a88d91dfc2de1f34bd10220181a474a3420444bd188501d8d270736e1e9fe379da9970de992ff445b0972e3'), signature=unhexlify(
)), "3045022100ea8780bc1e60e14e945a80654a41748bbf1aa7d6f2e40a88d91dfc2de1f34bd10220181a474a3420444bd188501d8d270736e1e9fe379da9970de992ff445b0972e3"
),
),
),
] ]
ns = _get_schemas_for_coin(coin) ns = _get_schemas_for_coin(coin)
@ -305,5 +464,5 @@ class TestSignSegwitTxNativeP2WPKH_GRS(unittest.TestCase):
signer.send(None) signer.send(None)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -40,121 +40,196 @@ class TestSignSegwitTxP2WPKHInP2SH(unittest.TestCase):
def test_send_p2wpkh_in_p2sh(self): def test_send_p2wpkh_in_p2sh(self):
coin = coins.by_name('Testnet') coin = coins.by_name("Testnet")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
inp1 = TxInput( inp1 = TxInput(
# 49'/1'/0'/1/0" - 2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX # 49'/1'/0'/1/0" - 2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX
address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 0], address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 0],
amount=123456789, amount=123456789,
prev_hash=unhexlify('20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337'), prev_hash=unhexlify(
"20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337"
),
prev_index=0, prev_index=0,
script_type=InputScriptType.SPENDP2SHWITNESS, script_type=InputScriptType.SPENDP2SHWITNESS,
sequence=0xffffffff, sequence=0xFFFFFFFF,
multisig=None, multisig=None,
) )
ptx1 = PrevTx(version=1, lock_time=0, inputs_count=1, outputs_count=2, extra_data_len=0) ptx1 = PrevTx(
pinp1 = PrevInput(script_sig=unhexlify('4730440220548e087d0426b20b8a571b03b9e05829f7558b80c53c12143e342f56ab29e51d02205b68cb7fb223981d4c999725ac1485a982c4259c4f50b8280f137878c232998a012102794a25b254a268e59a5869da57fbae2fadc6727cb3309321dab409b12b2fa17c'), version=1, lock_time=0, inputs_count=1, outputs_count=2, extra_data_len=0
prev_hash=unhexlify('802cabf0843b945eabe136d7fc7c89f41021658abf56cba000acbce88c41143a'), )
pinp1 = PrevInput(
script_sig=unhexlify(
"4730440220548e087d0426b20b8a571b03b9e05829f7558b80c53c12143e342f56ab29e51d02205b68cb7fb223981d4c999725ac1485a982c4259c4f50b8280f137878c232998a012102794a25b254a268e59a5869da57fbae2fadc6727cb3309321dab409b12b2fa17c"
),
prev_hash=unhexlify(
"802cabf0843b945eabe136d7fc7c89f41021658abf56cba000acbce88c41143a"
),
prev_index=0, prev_index=0,
sequence=4294967295) sequence=4294967295,
pout1 = PrevOutput(script_pubkey=unhexlify('a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87'), )
amount=123456789) pout1 = PrevOutput(
pout2 = PrevOutput(script_pubkey=unhexlify('76a914b84bacdcd8f4cc59274a5bfb73f804ca10f7fd1488ac'), script_pubkey=unhexlify("a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87"),
amount=865519308) amount=123456789,
)
pout2 = PrevOutput(
script_pubkey=unhexlify(
"76a914b84bacdcd8f4cc59274a5bfb73f804ca10f7fd1488ac"
),
amount=865519308,
)
out1 = TxOutput( out1 = TxOutput(
address='mhRx1CeVfaayqRwq5zgRQmD7W5aWBfD5mC', address="mhRx1CeVfaayqRwq5zgRQmD7W5aWBfD5mC",
amount=12300000, amount=12300000,
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
address_n=[], address_n=[],
multisig=None, multisig=None,
) )
out2 = TxOutput( out2 = TxOutput(
address='2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX', address="2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX",
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
amount=123456789 - 11000 - 12300000, amount=123456789 - 11000 - 12300000,
address_n=[], address_n=[],
multisig=None, multisig=None,
) )
tx = SignTx(coin_name='Testnet', version=1, lock_time=0, inputs_count=1, outputs_count=2) tx = SignTx(
coin_name="Testnet", version=1, lock_time=0, inputs_count=1, outputs_count=2
)
# precomputed tx weight is 168 = ceil(670 / 4) # precomputed tx weight is 168 = ceil(670 / 4)
fee_rate = 11000 / 168 fee_rate = 11000 / 168
messages = [ messages = [
None, None,
# check fee # check fee
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False), helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False),
True, True,
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out2)), TxAckOutput(tx=TxAckOutputWrapper(output=out2)),
helpers.UiConfirmOutput(out2, coin, AmountUnit.BITCOIN, 1, False), helpers.UiConfirmOutput(out2, coin, AmountUnit.BITCOIN, 1, False),
True, True,
helpers.UiConfirmTotal(
helpers.UiConfirmTotal(123445789 + 11000, 11000, fee_rate, coin, AmountUnit.BITCOIN, inp1.address_n[:3]), 123445789 + 11000,
11000,
fee_rate,
coin,
AmountUnit.BITCOIN,
inp1.address_n[:3],
),
True, True,
# check prev tx # check prev tx
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXMETA, details=TxRequestDetailsType(request_index=None, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXMETA,
details=TxRequestDetailsType(
request_index=None, tx_hash=inp1.prev_hash
),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevMeta(tx=ptx1), TxAckPrevMeta(tx=ptx1),
TxRequest(
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)), TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout2)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout2)),
# sign tx # sign tx
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized header # returned serialized header
serialized_tx=unhexlify('01000000000101'), serialized_tx=unhexlify("01000000000101"),
)), ),
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized inp1 # returned serialized inp1
serialized_tx=unhexlify('37c361fb8f2d9056ba8c98c5611930fcb48cacfdd0fe2e0449d83eea982f91200000000017160014d16b8c0680c61fc6ed2e407455715055e41052f5ffffffff02'), serialized_tx=unhexlify(
)), "37c361fb8f2d9056ba8c98c5611930fcb48cacfdd0fe2e0449d83eea982f91200000000017160014d16b8c0680c61fc6ed2e407455715055e41052f5ffffffff02"
),
),
),
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=None), serialized=TxRequestSerializedType( request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized out1 # returned serialized out1
serialized_tx=unhexlify('e0aebb00000000001976a91414fdede0ddc3be652a0ce1afbc1b509a55b6b94888ac'), serialized_tx=unhexlify(
"e0aebb00000000001976a91414fdede0ddc3be652a0ce1afbc1b509a55b6b94888ac"
),
signature_index=None, signature_index=None,
signature=None, signature=None,
)), ),
),
TxAckOutput(tx=TxAckOutputWrapper(output=out2)), TxAckOutput(tx=TxAckOutputWrapper(output=out2)),
# segwit # segwit
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized out2 # returned serialized out2
serialized_tx=unhexlify('3df39f060000000017a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87'), serialized_tx=unhexlify(
"3df39f060000000017a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87"
),
signature_index=None, signature_index=None,
signature=None, signature=None,
)), ),
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXFINISHED, details=TxRequestDetailsType(), serialized=TxRequestSerializedType( request_type=TXFINISHED,
serialized_tx=unhexlify('02483045022100ccd253bfdf8a5593cd7b6701370c531199f0f05a418cd547dfc7da3f21515f0f02203fa08a0753688871c220648f9edadbdb98af42e5d8269364a326572cf703895b012103e7bfe10708f715e8538c92d46ca50db6f657bbc455b7494e6a0303ccdb868b7900000000'), details=TxRequestDetailsType(),
serialized=TxRequestSerializedType(
serialized_tx=unhexlify(
"02483045022100ccd253bfdf8a5593cd7b6701370c531199f0f05a418cd547dfc7da3f21515f0f02203fa08a0753688871c220648f9edadbdb98af42e5d8269364a326572cf703895b012103e7bfe10708f715e8538c92d46ca50db6f657bbc455b7494e6a0303ccdb868b7900000000"
),
signature_index=0, signature_index=0,
signature=unhexlify('3045022100ccd253bfdf8a5593cd7b6701370c531199f0f05a418cd547dfc7da3f21515f0f02203fa08a0753688871c220648f9edadbdb98af42e5d8269364a326572cf703895b'), signature=unhexlify(
)), "3045022100ccd253bfdf8a5593cd7b6701370c531199f0f05a418cd547dfc7da3f21515f0f02203fa08a0753688871c220648f9edadbdb98af42e5d8269364a326572cf703895b"
),
),
),
] ]
ns = _get_schemas_for_coin(coin) ns = _get_schemas_for_coin(coin)
@ -170,31 +245,47 @@ class TestSignSegwitTxP2WPKHInP2SH(unittest.TestCase):
def test_send_p2wpkh_in_p2sh_change(self): def test_send_p2wpkh_in_p2sh_change(self):
coin = coins.by_name('Testnet') coin = coins.by_name("Testnet")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
inp1 = TxInput( inp1 = TxInput(
# 49'/1'/0'/1/0" - 2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX # 49'/1'/0'/1/0" - 2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX
address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 0], address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 0],
amount=123456789, amount=123456789,
prev_hash=unhexlify('20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337'), prev_hash=unhexlify(
"20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337"
),
prev_index=0, prev_index=0,
script_type=InputScriptType.SPENDP2SHWITNESS, script_type=InputScriptType.SPENDP2SHWITNESS,
sequence=0xffffffff, sequence=0xFFFFFFFF,
multisig=None, multisig=None,
) )
ptx1 = PrevTx(version=1, lock_time=0, inputs_count=1, outputs_count=2, extra_data_len=0) ptx1 = PrevTx(
pinp1 = PrevInput(script_sig=unhexlify('4730440220548e087d0426b20b8a571b03b9e05829f7558b80c53c12143e342f56ab29e51d02205b68cb7fb223981d4c999725ac1485a982c4259c4f50b8280f137878c232998a012102794a25b254a268e59a5869da57fbae2fadc6727cb3309321dab409b12b2fa17c'), version=1, lock_time=0, inputs_count=1, outputs_count=2, extra_data_len=0
prev_hash=unhexlify('802cabf0843b945eabe136d7fc7c89f41021658abf56cba000acbce88c41143a'), )
pinp1 = PrevInput(
script_sig=unhexlify(
"4730440220548e087d0426b20b8a571b03b9e05829f7558b80c53c12143e342f56ab29e51d02205b68cb7fb223981d4c999725ac1485a982c4259c4f50b8280f137878c232998a012102794a25b254a268e59a5869da57fbae2fadc6727cb3309321dab409b12b2fa17c"
),
prev_hash=unhexlify(
"802cabf0843b945eabe136d7fc7c89f41021658abf56cba000acbce88c41143a"
),
prev_index=0, prev_index=0,
sequence=4294967295) sequence=4294967295,
pout1 = PrevOutput(script_pubkey=unhexlify('a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87'), )
amount=123456789) pout1 = PrevOutput(
pout2 = PrevOutput(script_pubkey=unhexlify('76a914b84bacdcd8f4cc59274a5bfb73f804ca10f7fd1488ac'), script_pubkey=unhexlify("a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87"),
amount=865519308) amount=123456789,
)
pout2 = PrevOutput(
script_pubkey=unhexlify(
"76a914b84bacdcd8f4cc59274a5bfb73f804ca10f7fd1488ac"
),
amount=865519308,
)
out1 = TxOutput( out1 = TxOutput(
address='mhRx1CeVfaayqRwq5zgRQmD7W5aWBfD5mC', address="mhRx1CeVfaayqRwq5zgRQmD7W5aWBfD5mC",
amount=12300000, amount=12300000,
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
address_n=[], address_n=[],
@ -207,93 +298,141 @@ class TestSignSegwitTxP2WPKHInP2SH(unittest.TestCase):
address=None, address=None,
multisig=None, multisig=None,
) )
tx = SignTx(coin_name='Testnet', version=1, lock_time=0, inputs_count=1, outputs_count=2) tx = SignTx(
coin_name="Testnet", version=1, lock_time=0, inputs_count=1, outputs_count=2
)
# precomputed tx weight is 168 = ceil(670 / 4) # precomputed tx weight is 168 = ceil(670 / 4)
fee_rate = 11000 / 168 fee_rate = 11000 / 168
messages = [ messages = [
None, None,
# check fee # check fee
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False), helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False),
True, True,
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out2)), TxAckOutput(tx=TxAckOutputWrapper(output=out2)),
helpers.UiConfirmTotal(
helpers.UiConfirmTotal(12300000 + 11000, 11000, fee_rate, coin, AmountUnit.BITCOIN, inp1.address_n[:3]), 12300000 + 11000,
11000,
fee_rate,
coin,
AmountUnit.BITCOIN,
inp1.address_n[:3],
),
True, True,
# check prev tx # check prev tx
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXMETA, details=TxRequestDetailsType(request_index=None, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXMETA,
details=TxRequestDetailsType(
request_index=None, tx_hash=inp1.prev_hash
),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevMeta(tx=ptx1), TxAckPrevMeta(tx=ptx1),
TxRequest(
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)), TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout2)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout2)),
# sign tx # sign tx
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType( serialized=TxRequestSerializedType(
# returned serialized header # returned serialized header
serialized_tx=unhexlify( serialized_tx=unhexlify("01000000000101"),
'01000000000101'), ),
)), ),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType( serialized=TxRequestSerializedType(
# returned serialized inp1 # returned serialized inp1
serialized_tx=unhexlify( serialized_tx=unhexlify(
'37c361fb8f2d9056ba8c98c5611930fcb48cacfdd0fe2e0449d83eea982f91200000000017160014d16b8c0680c61fc6ed2e407455715055e41052f5ffffffff02'), "37c361fb8f2d9056ba8c98c5611930fcb48cacfdd0fe2e0449d83eea982f91200000000017160014d16b8c0680c61fc6ed2e407455715055e41052f5ffffffff02"
)), ),
),
),
# the out has to be cloned not to send the same object which was modified # the out has to be cloned not to send the same object which was modified
TxAckOutput(tx=TxAckOutputWrapper(output=TxOutput(**out1.__dict__))), TxAckOutput(tx=TxAckOutputWrapper(output=TxOutput(**out1.__dict__))),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=None), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=None),
serialized=TxRequestSerializedType( serialized=TxRequestSerializedType(
# returned serialized out1 # returned serialized out1
serialized_tx=unhexlify( serialized_tx=unhexlify(
'e0aebb00000000001976a91414fdede0ddc3be652a0ce1afbc1b509a55b6b94888ac'), "e0aebb00000000001976a91414fdede0ddc3be652a0ce1afbc1b509a55b6b94888ac"
),
signature_index=None, signature_index=None,
signature=None, signature=None,
)), ),
),
TxAckOutput(tx=TxAckOutputWrapper(output=TxOutput(**out2.__dict__))), TxAckOutput(tx=TxAckOutputWrapper(output=TxOutput(**out2.__dict__))),
# segwit # segwit
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType( serialized=TxRequestSerializedType(
# returned serialized out2 # returned serialized out2
serialized_tx=unhexlify( serialized_tx=unhexlify(
'3df39f060000000017a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87'), "3df39f060000000017a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87"
),
signature_index=None, signature_index=None,
signature=None, signature=None,
)), ),
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXFINISHED, details=TxRequestDetailsType(), serialized=TxRequestSerializedType( request_type=TXFINISHED,
details=TxRequestDetailsType(),
serialized=TxRequestSerializedType(
serialized_tx=unhexlify( serialized_tx=unhexlify(
'02483045022100ccd253bfdf8a5593cd7b6701370c531199f0f05a418cd547dfc7da3f21515f0f02203fa08a0753688871c220648f9edadbdb98af42e5d8269364a326572cf703895b012103e7bfe10708f715e8538c92d46ca50db6f657bbc455b7494e6a0303ccdb868b7900000000'), "02483045022100ccd253bfdf8a5593cd7b6701370c531199f0f05a418cd547dfc7da3f21515f0f02203fa08a0753688871c220648f9edadbdb98af42e5d8269364a326572cf703895b012103e7bfe10708f715e8538c92d46ca50db6f657bbc455b7494e6a0303ccdb868b7900000000"
),
signature_index=0, signature_index=0,
signature=unhexlify('3045022100ccd253bfdf8a5593cd7b6701370c531199f0f05a418cd547dfc7da3f21515f0f02203fa08a0753688871c220648f9edadbdb98af42e5d8269364a326572cf703895b'), signature=unhexlify(
)), "3045022100ccd253bfdf8a5593cd7b6701370c531199f0f05a418cd547dfc7da3f21515f0f02203fa08a0753688871c220648f9edadbdb98af42e5d8269364a326572cf703895b"
),
),
),
] ]
ns = _get_schemas_for_coin(coin) ns = _get_schemas_for_coin(coin)
@ -309,41 +448,59 @@ class TestSignSegwitTxP2WPKHInP2SH(unittest.TestCase):
def test_send_p2wpkh_in_p2sh_attack_amount(self): def test_send_p2wpkh_in_p2sh_attack_amount(self):
coin = coins.by_name('Testnet') coin = coins.by_name("Testnet")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
inp1 = TxInput( inp1 = TxInput(
# 49'/1'/0'/1/0" - 2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX # 49'/1'/0'/1/0" - 2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX
address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 0], address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 0],
amount=10, amount=10,
prev_hash=unhexlify('20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337'), prev_hash=unhexlify(
"20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337"
),
prev_index=0, prev_index=0,
script_type=InputScriptType.SPENDP2SHWITNESS, script_type=InputScriptType.SPENDP2SHWITNESS,
sequence=0xffffffff, sequence=0xFFFFFFFF,
multisig=None, multisig=None,
) )
ptx1 = PrevTx(version=1, lock_time=0, inputs_count=1, outputs_count=2, extra_data_len=0) ptx1 = PrevTx(
pinp1 = PrevInput(script_sig=unhexlify('4730440220548e087d0426b20b8a571b03b9e05829f7558b80c53c12143e342f56ab29e51d02205b68cb7fb223981d4c999725ac1485a982c4259c4f50b8280f137878c232998a012102794a25b254a268e59a5869da57fbae2fadc6727cb3309321dab409b12b2fa17c'), version=1, lock_time=0, inputs_count=1, outputs_count=2, extra_data_len=0
prev_hash=unhexlify('802cabf0843b945eabe136d7fc7c89f41021658abf56cba000acbce88c41143a'), )
pinp1 = PrevInput(
script_sig=unhexlify(
"4730440220548e087d0426b20b8a571b03b9e05829f7558b80c53c12143e342f56ab29e51d02205b68cb7fb223981d4c999725ac1485a982c4259c4f50b8280f137878c232998a012102794a25b254a268e59a5869da57fbae2fadc6727cb3309321dab409b12b2fa17c"
),
prev_hash=unhexlify(
"802cabf0843b945eabe136d7fc7c89f41021658abf56cba000acbce88c41143a"
),
prev_index=0, prev_index=0,
sequence=4294967295) sequence=4294967295,
pout1 = PrevOutput(script_pubkey=unhexlify('a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87'), )
amount=123456789) pout1 = PrevOutput(
pout2 = PrevOutput(script_pubkey=unhexlify('76a914b84bacdcd8f4cc59274a5bfb73f804ca10f7fd1488ac'), script_pubkey=unhexlify("a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87"),
amount=865519308) amount=123456789,
)
pout2 = PrevOutput(
script_pubkey=unhexlify(
"76a914b84bacdcd8f4cc59274a5bfb73f804ca10f7fd1488ac"
),
amount=865519308,
)
inpattack = TxInput( inpattack = TxInput(
# 49'/1'/0'/1/0" - 2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX # 49'/1'/0'/1/0" - 2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX
address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 0], address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 0],
amount=9, # modified! amount=9, # modified!
prev_hash=unhexlify('20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337'), prev_hash=unhexlify(
"20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337"
),
prev_index=0, prev_index=0,
script_type=InputScriptType.SPENDP2SHWITNESS, script_type=InputScriptType.SPENDP2SHWITNESS,
sequence=0xffffffff, sequence=0xFFFFFFFF,
multisig=None, multisig=None,
) )
out1 = TxOutput( out1 = TxOutput(
address='mhRx1CeVfaayqRwq5zgRQmD7W5aWBfD5mC', address="mhRx1CeVfaayqRwq5zgRQmD7W5aWBfD5mC",
amount=8, amount=8,
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
address_n=[], address_n=[],
@ -356,53 +513,83 @@ class TestSignSegwitTxP2WPKHInP2SH(unittest.TestCase):
address=None, address=None,
multisig=None, multisig=None,
) )
tx = SignTx(coin_name='Testnet', version=1, lock_time=0, inputs_count=1, outputs_count=2) tx = SignTx(
coin_name="Testnet", version=1, lock_time=0, inputs_count=1, outputs_count=2
)
# precomputed tx weight is 168 = ceil(670 / 4) # precomputed tx weight is 168 = ceil(670 / 4)
fee_rate = (9 - 8 - 1) / 168 fee_rate = (9 - 8 - 1) / 168
messages = [ messages = [
None, None,
# check fee # check fee
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inpattack)), TxAckInput(tx=TxAckInputWrapper(input=inpattack)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False), helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False),
True, True,
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out2)), TxAckOutput(tx=TxAckOutputWrapper(output=out2)),
helpers.UiConfirmTotal(
helpers.UiConfirmTotal(9 - 1, 9 - 8 - 1, fee_rate, coin, AmountUnit.BITCOIN, inp1.address_n[:3]), 9 - 1, 9 - 8 - 1, fee_rate, coin, AmountUnit.BITCOIN, inp1.address_n[:3]
),
True, True,
# check prev tx # check prev tx
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXMETA, details=TxRequestDetailsType(request_index=None, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXMETA,
details=TxRequestDetailsType(
request_index=None, tx_hash=inp1.prev_hash
),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevMeta(tx=ptx1), TxAckPrevMeta(tx=ptx1),
TxRequest(
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)), TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout2)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout2)),
# sign tx # sign tx
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType( serialized=TxRequestSerializedType(
# returned serialized header # returned serialized header
serialized_tx=unhexlify( serialized_tx=unhexlify("01000000000101"),
'01000000000101'), ),
)), ),
] ]
ns = _get_schemas_for_coin(coin) ns = _get_schemas_for_coin(coin)
@ -423,5 +610,5 @@ class TestSignSegwitTxP2WPKHInP2SH(unittest.TestCase):
signer.send(None) signer.send(None)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -41,124 +41,206 @@ class TestSignSegwitTxP2WPKHInP2SH_GRS(unittest.TestCase):
def test_send_p2wpkh_in_p2sh(self): def test_send_p2wpkh_in_p2sh(self):
coin = coins.by_name('Groestlcoin Testnet') coin = coins.by_name("Groestlcoin Testnet")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
inp1 = TxInput( inp1 = TxInput(
# 49'/1'/0'/1/0" - 2N1LGaGg836mqSQqiuUBLfcyGBhyZYBtBZ7 # 49'/1'/0'/1/0" - 2N1LGaGg836mqSQqiuUBLfcyGBhyZYBtBZ7
address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 0], address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 0],
amount=123456789, amount=123456789,
prev_hash=unhexlify('09a48bce2f9d5c6e4f0cb9ea1b32d0891855e8acfe5334f9ebd72b9ad2de60cf'), prev_hash=unhexlify(
"09a48bce2f9d5c6e4f0cb9ea1b32d0891855e8acfe5334f9ebd72b9ad2de60cf"
),
prev_index=0, prev_index=0,
script_type=InputScriptType.SPENDP2SHWITNESS, script_type=InputScriptType.SPENDP2SHWITNESS,
sequence=0xfffffffe, sequence=0xFFFFFFFE,
multisig=None, multisig=None,
) )
ptx1 = PrevTx(version=1, lock_time=650749, inputs_count=1, outputs_count=2, extra_data_len=0) ptx1 = PrevTx(
pinp1 = PrevInput(script_sig=unhexlify('47304402201f8f57f708144c3a11da322546cb37bd385aa825d940c37e8016f0efd6ec3e9402202a41bc02c29e4f3f13efd4bededbcd4308a6393279111d614ee1f7635cf3e65701210371546a36bdf6bc82087301b3f6e759736dc8790150673d2e7e2715d2ad72f3a4'), version=1,
prev_hash=unhexlify('4f2f857f39ed1afe05542d058fb0be865a387446e32fc876d086203f483f61d1'), lock_time=650749,
inputs_count=1,
outputs_count=2,
extra_data_len=0,
)
pinp1 = PrevInput(
script_sig=unhexlify(
"47304402201f8f57f708144c3a11da322546cb37bd385aa825d940c37e8016f0efd6ec3e9402202a41bc02c29e4f3f13efd4bededbcd4308a6393279111d614ee1f7635cf3e65701210371546a36bdf6bc82087301b3f6e759736dc8790150673d2e7e2715d2ad72f3a4"
),
prev_hash=unhexlify(
"4f2f857f39ed1afe05542d058fb0be865a387446e32fc876d086203f483f61d1"
),
prev_index=1, prev_index=1,
sequence=4294967294) sequence=4294967294,
pout1 = PrevOutput(script_pubkey=unhexlify('a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87'), )
amount=123456789) pout1 = PrevOutput(
pout2 = PrevOutput(script_pubkey=unhexlify('76a91435528b20e9a793cf2c3a1cf9cff1f2127ad377da88ac'), script_pubkey=unhexlify("a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87"),
amount=9764242764) amount=123456789,
)
pout2 = PrevOutput(
script_pubkey=unhexlify(
"76a91435528b20e9a793cf2c3a1cf9cff1f2127ad377da88ac"
),
amount=9764242764,
)
out1 = TxOutput( out1 = TxOutput(
address='mvbu1Gdy8SUjTenqerxUaZyYjmvedc787y', address="mvbu1Gdy8SUjTenqerxUaZyYjmvedc787y",
amount=12300000, amount=12300000,
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
address_n=[], address_n=[],
multisig=None, multisig=None,
) )
out2 = TxOutput( out2 = TxOutput(
address='2N1LGaGg836mqSQqiuUBLfcyGBhyZYBtBZ7', address="2N1LGaGg836mqSQqiuUBLfcyGBhyZYBtBZ7",
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
amount=123456789 - 11000 - 12300000, amount=123456789 - 11000 - 12300000,
address_n=[], address_n=[],
multisig=None, multisig=None,
) )
tx = SignTx(coin_name='Groestlcoin Testnet', version=1, lock_time=650756, inputs_count=1, outputs_count=2) tx = SignTx(
coin_name="Groestlcoin Testnet",
version=1,
lock_time=650756,
inputs_count=1,
outputs_count=2,
)
# precomputed tx weight is 168 = ceil(670 / 4) # precomputed tx weight is 168 = ceil(670 / 4)
fee_rate = 11000 / 168 fee_rate = 11000 / 168
messages = [ messages = [
None, None,
# check fee # check fee
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False), helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False),
True, True,
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out2)), TxAckOutput(tx=TxAckOutputWrapper(output=out2)),
helpers.UiConfirmOutput(out2, coin, AmountUnit.BITCOIN, 1, False), helpers.UiConfirmOutput(out2, coin, AmountUnit.BITCOIN, 1, False),
True, True,
helpers.UiConfirmNonDefaultLocktime(tx.lock_time, lock_time_disabled=False), helpers.UiConfirmNonDefaultLocktime(tx.lock_time, lock_time_disabled=False),
True, True,
helpers.UiConfirmTotal(
helpers.UiConfirmTotal(123445789 + 11000, 11000, fee_rate, coin, AmountUnit.BITCOIN, inp1.address_n[:3]), 123445789 + 11000,
11000,
fee_rate,
coin,
AmountUnit.BITCOIN,
inp1.address_n[:3],
),
True, True,
# check prev tx # check prev tx
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXMETA, details=TxRequestDetailsType(request_index=None, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXMETA,
details=TxRequestDetailsType(
request_index=None, tx_hash=inp1.prev_hash
),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevMeta(tx=ptx1), TxAckPrevMeta(tx=ptx1),
TxRequest(
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)), TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout2)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout2)),
# sign tx # sign tx
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized header # returned serialized header
serialized_tx=unhexlify('01000000000101'), serialized_tx=unhexlify("01000000000101"),
)), ),
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized inp1 # returned serialized inp1
serialized_tx=unhexlify('cf60ded29a2bd7ebf93453feace8551889d0321beab90c4f6e5c9d2fce8ba4090000000017160014d16b8c0680c61fc6ed2e407455715055e41052f5feffffff02'), serialized_tx=unhexlify(
)), "cf60ded29a2bd7ebf93453feace8551889d0321beab90c4f6e5c9d2fce8ba4090000000017160014d16b8c0680c61fc6ed2e407455715055e41052f5feffffff02"
),
),
),
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=None), serialized=TxRequestSerializedType( request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized out1 # returned serialized out1
serialized_tx=unhexlify('e0aebb00000000001976a914a579388225827d9f2fe9014add644487808c695d88ac'), serialized_tx=unhexlify(
"e0aebb00000000001976a914a579388225827d9f2fe9014add644487808c695d88ac"
),
signature_index=None, signature_index=None,
signature=None, signature=None,
)), ),
),
TxAckOutput(tx=TxAckOutputWrapper(output=out2)), TxAckOutput(tx=TxAckOutputWrapper(output=out2)),
# segwit # segwit
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
# returned serialized out2 # returned serialized out2
serialized_tx=unhexlify('3df39f060000000017a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87'), serialized_tx=unhexlify(
"3df39f060000000017a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87"
),
signature_index=None, signature_index=None,
signature=None, signature=None,
)), ),
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXFINISHED, details=TxRequestDetailsType(), serialized=TxRequestSerializedType( request_type=TXFINISHED,
serialized_tx=unhexlify('02483045022100b7ce2972bcbc3a661fe320ba901e680913b2753fcb47055c9c6ba632fc4acf81022001c3cfd6c2fe92eb60f5176ce0f43707114dd7223da19c56f2df89c13c2fef80012103e7bfe10708f715e8538c92d46ca50db6f657bbc455b7494e6a0303ccdb868b7904ee0900'), details=TxRequestDetailsType(),
serialized=TxRequestSerializedType(
serialized_tx=unhexlify(
"02483045022100b7ce2972bcbc3a661fe320ba901e680913b2753fcb47055c9c6ba632fc4acf81022001c3cfd6c2fe92eb60f5176ce0f43707114dd7223da19c56f2df89c13c2fef80012103e7bfe10708f715e8538c92d46ca50db6f657bbc455b7494e6a0303ccdb868b7904ee0900"
),
signature_index=0, signature_index=0,
signature=unhexlify('3045022100b7ce2972bcbc3a661fe320ba901e680913b2753fcb47055c9c6ba632fc4acf81022001c3cfd6c2fe92eb60f5176ce0f43707114dd7223da19c56f2df89c13c2fef80'), signature=unhexlify(
)), "3045022100b7ce2972bcbc3a661fe320ba901e680913b2753fcb47055c9c6ba632fc4acf81022001c3cfd6c2fe92eb60f5176ce0f43707114dd7223da19c56f2df89c13c2fef80"
),
),
),
] ]
ns = _get_schemas_for_coin(coin) ns = _get_schemas_for_coin(coin)
@ -174,31 +256,51 @@ class TestSignSegwitTxP2WPKHInP2SH_GRS(unittest.TestCase):
def test_send_p2wpkh_in_p2sh_change(self): def test_send_p2wpkh_in_p2sh_change(self):
coin = coins.by_name('Groestlcoin Testnet') coin = coins.by_name("Groestlcoin Testnet")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
inp1 = TxInput( inp1 = TxInput(
# 49'/1'/0'/1/0" - 2N1LGaGg836mqSQqiuUBLfcyGBhyZYBtBZ7 # 49'/1'/0'/1/0" - 2N1LGaGg836mqSQqiuUBLfcyGBhyZYBtBZ7
address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 0], address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 0],
amount=123456789, amount=123456789,
prev_hash=unhexlify('09a48bce2f9d5c6e4f0cb9ea1b32d0891855e8acfe5334f9ebd72b9ad2de60cf'), prev_hash=unhexlify(
"09a48bce2f9d5c6e4f0cb9ea1b32d0891855e8acfe5334f9ebd72b9ad2de60cf"
),
prev_index=0, prev_index=0,
script_type=InputScriptType.SPENDP2SHWITNESS, script_type=InputScriptType.SPENDP2SHWITNESS,
sequence=0xfffffffe, sequence=0xFFFFFFFE,
multisig=None, multisig=None,
) )
ptx1 = PrevTx(version=1, lock_time=650749, inputs_count=1, outputs_count=2, extra_data_len=0) ptx1 = PrevTx(
pinp1 = PrevInput(script_sig=unhexlify('47304402201f8f57f708144c3a11da322546cb37bd385aa825d940c37e8016f0efd6ec3e9402202a41bc02c29e4f3f13efd4bededbcd4308a6393279111d614ee1f7635cf3e65701210371546a36bdf6bc82087301b3f6e759736dc8790150673d2e7e2715d2ad72f3a4'), version=1,
prev_hash=unhexlify('4f2f857f39ed1afe05542d058fb0be865a387446e32fc876d086203f483f61d1'), lock_time=650749,
inputs_count=1,
outputs_count=2,
extra_data_len=0,
)
pinp1 = PrevInput(
script_sig=unhexlify(
"47304402201f8f57f708144c3a11da322546cb37bd385aa825d940c37e8016f0efd6ec3e9402202a41bc02c29e4f3f13efd4bededbcd4308a6393279111d614ee1f7635cf3e65701210371546a36bdf6bc82087301b3f6e759736dc8790150673d2e7e2715d2ad72f3a4"
),
prev_hash=unhexlify(
"4f2f857f39ed1afe05542d058fb0be865a387446e32fc876d086203f483f61d1"
),
prev_index=1, prev_index=1,
sequence=4294967294) sequence=4294967294,
pout1 = PrevOutput(script_pubkey=unhexlify('a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87'), )
amount=123456789) pout1 = PrevOutput(
pout2 = PrevOutput(script_pubkey=unhexlify('76a91435528b20e9a793cf2c3a1cf9cff1f2127ad377da88ac'), script_pubkey=unhexlify("a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87"),
amount=9764242764) amount=123456789,
)
pout2 = PrevOutput(
script_pubkey=unhexlify(
"76a91435528b20e9a793cf2c3a1cf9cff1f2127ad377da88ac"
),
amount=9764242764,
)
out1 = TxOutput( out1 = TxOutput(
address='mvbu1Gdy8SUjTenqerxUaZyYjmvedc787y', address="mvbu1Gdy8SUjTenqerxUaZyYjmvedc787y",
amount=12300000, amount=12300000,
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
address_n=[], address_n=[],
@ -211,93 +313,147 @@ class TestSignSegwitTxP2WPKHInP2SH_GRS(unittest.TestCase):
address=None, address=None,
multisig=None, multisig=None,
) )
tx = SignTx(coin_name='Groestlcoin Testnet', version=1, lock_time=650756, inputs_count=1, outputs_count=2) tx = SignTx(
coin_name="Groestlcoin Testnet",
version=1,
lock_time=650756,
inputs_count=1,
outputs_count=2,
)
# precomputed tx weight is 168 = ceil(670 / 4) # precomputed tx weight is 168 = ceil(670 / 4)
fee_rate = 11000 / 168 fee_rate = 11000 / 168
messages = [ messages = [
None, None,
# check fee # check fee
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False), helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False),
True, True,
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out2)), TxAckOutput(tx=TxAckOutputWrapper(output=out2)),
helpers.UiConfirmNonDefaultLocktime(tx.lock_time, lock_time_disabled=False), helpers.UiConfirmNonDefaultLocktime(tx.lock_time, lock_time_disabled=False),
True, True,
helpers.UiConfirmTotal(
helpers.UiConfirmTotal(12300000 + 11000, 11000, fee_rate, coin, AmountUnit.BITCOIN, inp1.address_n[:3]), 12300000 + 11000,
11000,
fee_rate,
coin,
AmountUnit.BITCOIN,
inp1.address_n[:3],
),
True, True,
# check prev tx # check prev tx
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXMETA, details=TxRequestDetailsType(request_index=None, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXMETA,
details=TxRequestDetailsType(
request_index=None, tx_hash=inp1.prev_hash
),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevMeta(tx=ptx1), TxAckPrevMeta(tx=ptx1),
TxRequest(
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)), TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash), serialized=EMPTY_SERIALIZED), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout2)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout2)),
# sign tx # sign tx
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType( serialized=TxRequestSerializedType(
# returned serialized header # returned serialized header
serialized_tx=unhexlify( serialized_tx=unhexlify("01000000000101"),
'01000000000101'), ),
)), ),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType( serialized=TxRequestSerializedType(
# returned serialized inp1 # returned serialized inp1
serialized_tx=unhexlify( serialized_tx=unhexlify(
'cf60ded29a2bd7ebf93453feace8551889d0321beab90c4f6e5c9d2fce8ba4090000000017160014d16b8c0680c61fc6ed2e407455715055e41052f5feffffff02'), "cf60ded29a2bd7ebf93453feace8551889d0321beab90c4f6e5c9d2fce8ba4090000000017160014d16b8c0680c61fc6ed2e407455715055e41052f5feffffff02"
)), ),
),
),
# the out has to be cloned not to send the same object which was modified # the out has to be cloned not to send the same object which was modified
TxAckOutput(tx=TxAckOutputWrapper(output=TxOutput(**out1.__dict__))), TxAckOutput(tx=TxAckOutputWrapper(output=TxOutput(**out1.__dict__))),
TxRequest(
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=1, tx_hash=None), request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=1, tx_hash=None),
serialized=TxRequestSerializedType( serialized=TxRequestSerializedType(
# returned serialized out1 # returned serialized out1
serialized_tx=unhexlify( serialized_tx=unhexlify(
'e0aebb00000000001976a914a579388225827d9f2fe9014add644487808c695d88ac'), "e0aebb00000000001976a914a579388225827d9f2fe9014add644487808c695d88ac"
),
signature_index=None, signature_index=None,
signature=None, signature=None,
)), ),
),
TxAckOutput(tx=TxAckOutputWrapper(output=TxOutput(**out2.__dict__))), TxAckOutput(tx=TxAckOutputWrapper(output=TxOutput(**out2.__dict__))),
# segwit # segwit
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType( serialized=TxRequestSerializedType(
# returned serialized out2 # returned serialized out2
serialized_tx=unhexlify( serialized_tx=unhexlify(
'3df39f060000000017a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87'), "3df39f060000000017a91458b53ea7f832e8f096e896b8713a8c6df0e892ca87"
),
signature_index=None, signature_index=None,
signature=None, signature=None,
)), ),
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(
TxRequest(request_type=TXFINISHED, details=TxRequestDetailsType(), serialized=TxRequestSerializedType( request_type=TXFINISHED,
serialized_tx=unhexlify('02483045022100b7ce2972bcbc3a661fe320ba901e680913b2753fcb47055c9c6ba632fc4acf81022001c3cfd6c2fe92eb60f5176ce0f43707114dd7223da19c56f2df89c13c2fef80012103e7bfe10708f715e8538c92d46ca50db6f657bbc455b7494e6a0303ccdb868b7904ee0900'), details=TxRequestDetailsType(),
serialized=TxRequestSerializedType(
serialized_tx=unhexlify(
"02483045022100b7ce2972bcbc3a661fe320ba901e680913b2753fcb47055c9c6ba632fc4acf81022001c3cfd6c2fe92eb60f5176ce0f43707114dd7223da19c56f2df89c13c2fef80012103e7bfe10708f715e8538c92d46ca50db6f657bbc455b7494e6a0303ccdb868b7904ee0900"
),
signature_index=0, signature_index=0,
signature=unhexlify('3045022100b7ce2972bcbc3a661fe320ba901e680913b2753fcb47055c9c6ba632fc4acf81022001c3cfd6c2fe92eb60f5176ce0f43707114dd7223da19c56f2df89c13c2fef80'), signature=unhexlify(
)), "3045022100b7ce2972bcbc3a661fe320ba901e680913b2753fcb47055c9c6ba632fc4acf81022001c3cfd6c2fe92eb60f5176ce0f43707114dd7223da19c56f2df89c13c2fef80"
),
),
),
] ]
ns = _get_schemas_for_coin(coin) ns = _get_schemas_for_coin(coin)
@ -312,5 +468,5 @@ class TestSignSegwitTxP2WPKHInP2SH_GRS(unittest.TestCase):
signer.send(None) signer.send(None)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -15,7 +15,7 @@ class TestWriters(unittest.TestCase):
"d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882" "d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"
), ),
prev_index=0, prev_index=0,
sequence=0xffffffff, sequence=0xFFFFFFFF,
script_sig=b"0123456789", script_sig=b"0123456789",
) )
@ -25,7 +25,9 @@ class TestWriters(unittest.TestCase):
for bad_prevhash in (b"", b"x", b"hello", b"x" * 33): for bad_prevhash in (b"", b"x", b"hello", b"x" * 33):
inp.prev_hash = bad_prevhash inp.prev_hash = bad_prevhash
self.assertRaises(AssertionError, writers.write_tx_input, b, inp, inp.script_sig) self.assertRaises(
AssertionError, writers.write_tx_input, b, inp, inp.script_sig
)
def test_tx_input_check(self): def test_tx_input_check(self):
inp = TxInput( inp = TxInput(
@ -36,18 +38,23 @@ class TestWriters(unittest.TestCase):
), ),
prev_index=0, prev_index=0,
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
sequence=0xffffffff, sequence=0xFFFFFFFF,
script_pubkey=unhexlify("76a91424a56db43cf6f2b02e838ea493f95d8d6047423188ac"), script_pubkey=unhexlify(
"76a91424a56db43cf6f2b02e838ea493f95d8d6047423188ac"
),
script_sig=b"0123456789", script_sig=b"0123456789",
) )
b = bytearray() b = bytearray()
writers.write_tx_input_check(b, inp) writers.write_tx_input_check(b, inp)
self.assertEqual(len(b), 4 + 4 + 32 + 4 + 11 + 4 + 4 + 1 + 8 + 1 + 1 + 1 + 4 + 26) self.assertEqual(
len(b), 4 + 4 + 32 + 4 + 11 + 4 + 4 + 1 + 8 + 1 + 1 + 1 + 4 + 26
)
for bad_prevhash in (b"", b"x", b"hello", b"x" * 33): for bad_prevhash in (b"", b"x", b"hello", b"x" * 33):
inp.prev_hash = bad_prevhash inp.prev_hash = bad_prevhash
self.assertRaises(AssertionError, writers.write_tx_input_check, b, inp) self.assertRaises(AssertionError, writers.write_tx_input_check, b, inp)
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -107,65 +107,150 @@ class TestSignTxFeeThreshold(unittest.TestCase):
""" """
def test_under_threshold(self): def test_under_threshold(self):
coin_bitcoin = coins.by_name('Bitcoin') coin_bitcoin = coins.by_name("Bitcoin")
ptx1 = PrevTx(version=1, lock_time=0, inputs_count=2, outputs_count=1, extra_data_len=0) ptx1 = PrevTx(
pinp1 = PrevInput(script_sig=unhexlify('483045022072ba61305fe7cb542d142b8f3299a7b10f9ea61f6ffaab5dca8142601869d53c0221009a8027ed79eb3b9bc13577ac2853269323434558528c6b6a7e542be46e7e9a820141047a2d177c0f3626fc68c53610b0270fa6156181f46586c679ba6a88b34c6f4874686390b4d92e5769fbb89c8050b984f4ec0b257a0e5c4ff8bd3b035a51709503'), version=1, lock_time=0, inputs_count=2, outputs_count=1, extra_data_len=0
prev_hash=unhexlify('c16a03f1cf8f99f6b5297ab614586cacec784c2d259af245909dedb0e39eddcf'), )
pinp1 = PrevInput(
script_sig=unhexlify(
"483045022072ba61305fe7cb542d142b8f3299a7b10f9ea61f6ffaab5dca8142601869d53c0221009a8027ed79eb3b9bc13577ac2853269323434558528c6b6a7e542be46e7e9a820141047a2d177c0f3626fc68c53610b0270fa6156181f46586c679ba6a88b34c6f4874686390b4d92e5769fbb89c8050b984f4ec0b257a0e5c4ff8bd3b035a51709503"
),
prev_hash=unhexlify(
"c16a03f1cf8f99f6b5297ab614586cacec784c2d259af245909dedb0e39eddcf"
),
prev_index=1, prev_index=1,
sequence=0xffff_ffff) sequence=0xFFFF_FFFF,
pinp2 = PrevInput(script_sig=unhexlify('48304502200fd63adc8f6cb34359dc6cca9e5458d7ea50376cbd0a74514880735e6d1b8a4c0221008b6ead7fe5fbdab7319d6dfede3a0bc8e2a7c5b5a9301636d1de4aa31a3ee9b101410486ad608470d796236b003635718dfc07c0cac0cfc3bfc3079e4f491b0426f0676e6643a39198e8e7bdaffb94f4b49ea21baa107ec2e237368872836073668214'), )
prev_hash=unhexlify('1ae39a2f8d59670c8fc61179148a8e61e039d0d9e8ab08610cb69b4a19453eaf'), pinp2 = PrevInput(
script_sig=unhexlify(
"48304502200fd63adc8f6cb34359dc6cca9e5458d7ea50376cbd0a74514880735e6d1b8a4c0221008b6ead7fe5fbdab7319d6dfede3a0bc8e2a7c5b5a9301636d1de4aa31a3ee9b101410486ad608470d796236b003635718dfc07c0cac0cfc3bfc3079e4f491b0426f0676e6643a39198e8e7bdaffb94f4b49ea21baa107ec2e237368872836073668214"
),
prev_hash=unhexlify(
"1ae39a2f8d59670c8fc61179148a8e61e039d0d9e8ab08610cb69b4a19453eaf"
),
prev_index=1, prev_index=1,
sequence=0xffff_ffff) sequence=0xFFFF_FFFF,
pout1 = PrevOutput(script_pubkey=unhexlify('76a91424a56db43cf6f2b02e838ea493f95d8d6047423188ac'), )
amount=390000) pout1 = PrevOutput(
script_pubkey=unhexlify(
inp1 = TxInput(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e "76a91424a56db43cf6f2b02e838ea493f95d8d6047423188ac"
),
amount=390000, amount=390000,
prev_hash=unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), )
inp1 = TxInput(
address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e
amount=390000,
prev_hash=unhexlify(
"d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"
),
prev_index=0, prev_index=0,
multisig=None, multisig=None,
sequence=0xffff_ffff) sequence=0xFFFF_FFFF,
out1 = TxOutput(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', )
amount=390000 - 90000, # fee increased to 90000, slightly less than the threshold out1 = TxOutput(
address="1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1",
amount=390000
- 90000, # fee increased to 90000, slightly less than the threshold
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
multisig=None, multisig=None,
address_n=[]) address_n=[],
tx = SignTx(coin_name=None, version=1, lock_time=0, inputs_count=1, outputs_count=1) )
tx = SignTx(
coin_name=None, version=1, lock_time=0, inputs_count=1, outputs_count=1
)
# precomputed tx weight is 768 # precomputed tx weight is 768
fee_rate = 90000 / (768 / 4) fee_rate = 90000 / (768 / 4)
messages = [ messages = [
None, None,
TxRequest(
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
helpers.UiConfirmForeignAddress(address_n=inp1.address_n), helpers.UiConfirmForeignAddress(address_n=inp1.address_n),
True, True,
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
helpers.UiConfirmOutput(out1, coin_bitcoin, AmountUnit.BITCOIN, 0, False), helpers.UiConfirmOutput(out1, coin_bitcoin, AmountUnit.BITCOIN, 0, False),
True, True,
helpers.UiConfirmMultipleAccounts(), helpers.UiConfirmMultipleAccounts(),
True, True,
helpers.UiConfirmTotal(300000 + 90000, 90000, fee_rate, coin_bitcoin, AmountUnit.BITCOIN, None), helpers.UiConfirmTotal(
300000 + 90000, 90000, fee_rate, coin_bitcoin, AmountUnit.BITCOIN, None
),
True, True,
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(request_type=TXMETA, details=TxRequestDetailsType(request_index=None, tx_hash=unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882')), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXMETA,
details=TxRequestDetailsType(
request_index=None,
tx_hash=unhexlify(
"d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"
),
),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevMeta(tx=ptx1), TxAckPrevMeta(tx=ptx1),
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882')), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(
request_index=0,
tx_hash=unhexlify(
"d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"
),
),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)), TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)),
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=1, tx_hash=unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882')), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(
request_index=1,
tx_hash=unhexlify(
"d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"
),
),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp2)), TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp2)),
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882')), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXOUTPUT,
details=TxRequestDetailsType(
request_index=0,
tx_hash=unhexlify(
"d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"
),
),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)),
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType(serialized_tx=unhexlify('0100000001'))), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
serialized_tx=unhexlify("0100000001")
),
),
] ]
seed = bip39.seed('alcohol woman abuse must during monitor noble actual mixed trade anger aisle', '') seed = bip39.seed(
"alcohol woman abuse must during monitor noble actual mixed trade anger aisle",
"",
)
keychain = Keychain(seed, coin_bitcoin.curve_name, [AlwaysMatchingSchema]) keychain = Keychain(seed, coin_bitcoin.curve_name, [AlwaysMatchingSchema])
signer = bitcoin.Bitcoin(tx, keychain, coin_bitcoin, None).signer() signer = bitcoin.Bitcoin(tx, keychain, coin_bitcoin, None).signer()
@ -176,5 +261,5 @@ class TestSignTxFeeThreshold(unittest.TestCase):
self.assertEqual(res, response) self.assertEqual(res, response)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -2,8 +2,8 @@ from common import *
from apps.bitcoin.sign_tx.omni import is_valid, parse from apps.bitcoin.sign_tx.omni import is_valid, parse
class TestSignTxOmni(unittest.TestCase):
class TestSignTxOmni(unittest.TestCase):
def test_is_valid(self): def test_is_valid(self):
VECTORS = { VECTORS = {
"6f6d6e69": False, "6f6d6e69": False,
@ -30,5 +30,6 @@ class TestSignTxOmni(unittest.TestCase):
k = unhexlify(k) k = unhexlify(k)
self.assertEqual(parse(k), v) self.assertEqual(parse(k), v)
if __name__ == '__main__':
if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -113,7 +113,14 @@ class TestSignTx(unittest.TestCase):
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
helpers.UiConfirmOutput(out1, coin_bitcoin, AmountUnit.BITCOIN, 0, False), helpers.UiConfirmOutput(out1, coin_bitcoin, AmountUnit.BITCOIN, 0, False),
True, True,
helpers.UiConfirmTotal(3_801_747, 50_000, fee_rate, coin_bitcoin, AmountUnit.BITCOIN, inp1.address_n[:3]), helpers.UiConfirmTotal(
3_801_747,
50_000,
fee_rate,
coin_bitcoin,
AmountUnit.BITCOIN,
inp1.address_n[:3],
),
True, True,
# ButtonRequest(code=ButtonRequest_ConfirmOutput), # ButtonRequest(code=ButtonRequest_ConfirmOutput),
# ButtonRequest(code=ButtonRequest_SignTx), # ButtonRequest(code=ButtonRequest_SignTx),

View File

@ -112,7 +112,12 @@ class TestSignTxDecred(unittest.TestCase):
helpers.UiConfirmOutput(out1, coin_decred, AmountUnit.BITCOIN, 0, False), helpers.UiConfirmOutput(out1, coin_decred, AmountUnit.BITCOIN, 0, False),
True, True,
helpers.UiConfirmTotal( helpers.UiConfirmTotal(
200_000_000, 100_000, fee_rate, coin_decred, AmountUnit.BITCOIN, inp1.address_n[:3] 200_000_000,
100_000,
fee_rate,
coin_decred,
AmountUnit.BITCOIN,
inp1.address_n[:3],
), ),
True, True,
TxRequest( TxRequest(
@ -294,7 +299,12 @@ class TestSignTxDecred(unittest.TestCase):
), ),
TxAckOutput(tx=TxAckOutputWrapper(output=out3)), TxAckOutput(tx=TxAckOutputWrapper(output=out3)),
helpers.UiConfirmTotal( helpers.UiConfirmTotal(
200_000_000, 100_000, fee_rate, coin_decred, AmountUnit.BITCOIN, inp1.address_n[:3] 200_000_000,
100_000,
fee_rate,
coin_decred,
AmountUnit.BITCOIN,
inp1.address_n[:3],
), ),
True, True,
TxRequest( TxRequest(

View File

@ -41,69 +41,168 @@ class TestSignTx_GRS(unittest.TestCase):
# http://groestlsight.groestlcoin.org/tx/f56521b17b828897f72b30dd21b0192fd942342e89acbb06abf1d446282c30f5 # http://groestlsight.groestlcoin.org/tx/f56521b17b828897f72b30dd21b0192fd942342e89acbb06abf1d446282c30f5
# ptx1: http://groestlsight.groestlcoin.org/api/tx/cb74c8478c5814742c87cffdb4a21231869888f8042fb07a90e015a9db1f9d4a # ptx1: http://groestlsight.groestlcoin.org/api/tx/cb74c8478c5814742c87cffdb4a21231869888f8042fb07a90e015a9db1f9d4a
coin = coins.by_name('Groestlcoin') coin = coins.by_name("Groestlcoin")
ptx1 = PrevTx(version=1, lock_time=2160993, inputs_count=1, outputs_count=1, extra_data_len=0) ptx1 = PrevTx(
pinp1 = PrevInput(script_sig=unhexlify('48304502210096a287593b1212a188e778596eb8ecd4cc169b93a4d115226460d8e3deae431c02206c78ec09b3df977f04a6df5eb53181165c4ea5a0b35f826551349130f879d6b8012102cf5126ff54e38a80a919579d7091cafe24840eab1d30fe2b4d59bdd9d267cad8'), version=1,
prev_hash=unhexlify('7dc74a738c50c2ae1228ce9890841e5355fd6d7f2c1367e0a74403ab60db3224'), lock_time=2160993,
inputs_count=1,
outputs_count=1,
extra_data_len=0,
)
pinp1 = PrevInput(
script_sig=unhexlify(
"48304502210096a287593b1212a188e778596eb8ecd4cc169b93a4d115226460d8e3deae431c02206c78ec09b3df977f04a6df5eb53181165c4ea5a0b35f826551349130f879d6b8012102cf5126ff54e38a80a919579d7091cafe24840eab1d30fe2b4d59bdd9d267cad8"
),
prev_hash=unhexlify(
"7dc74a738c50c2ae1228ce9890841e5355fd6d7f2c1367e0a74403ab60db3224"
),
prev_index=0, prev_index=0,
sequence=4294967294) sequence=4294967294,
pout1 = PrevOutput(script_pubkey=unhexlify('76a914172b4e06e9b7881a48d2ee8062b495d0b2517fe888ac'), )
amount=210016) pout1 = PrevOutput(
script_pubkey=unhexlify(
"76a914172b4e06e9b7881a48d2ee8062b495d0b2517fe888ac"
),
amount=210016,
)
inp1 = TxInput(address_n=[44 | 0x80000000, 17 | 0x80000000, 0 | 0x80000000, 0, 2], # FXHDsC5ZqWQHkDmShzgRVZ1MatpWhwxTAA inp1 = TxInput(
prev_hash=unhexlify('cb74c8478c5814742c87cffdb4a21231869888f8042fb07a90e015a9db1f9d4a'), address_n=[
44 | 0x80000000,
17 | 0x80000000,
0 | 0x80000000,
0,
2,
], # FXHDsC5ZqWQHkDmShzgRVZ1MatpWhwxTAA
prev_hash=unhexlify(
"cb74c8478c5814742c87cffdb4a21231869888f8042fb07a90e015a9db1f9d4a"
),
prev_index=0, prev_index=0,
amount=210016) amount=210016,
out1 = TxOutput(address='FtM4zAn9aVYgHgxmamWBgWPyZsb6RhvkA9', )
out1 = TxOutput(
address="FtM4zAn9aVYgHgxmamWBgWPyZsb6RhvkA9",
amount=210016 - 192, amount=210016 - 192,
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
address_n=[]) address_n=[],
tx = SignTx(coin_name='Groestlcoin', version=1, lock_time=0, inputs_count=1, outputs_count=1) )
tx = SignTx(
coin_name="Groestlcoin",
version=1,
lock_time=0,
inputs_count=1,
outputs_count=1,
)
# precomputed tx weight is 768 # precomputed tx weight is 768
fee_rate = 192 / (768 / 4) fee_rate = 192 / (768 / 4)
messages = [ messages = [
None, None,
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False), helpers.UiConfirmOutput(out1, coin, AmountUnit.BITCOIN, 0, False),
True, True,
helpers.UiConfirmTotal(210016, 192, fee_rate, coin, AmountUnit.BITCOIN, inp1.address_n[:3]), helpers.UiConfirmTotal(
210016, 192, fee_rate, coin, AmountUnit.BITCOIN, inp1.address_n[:3]
),
True, True,
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(request_type=TXMETA, details=TxRequestDetailsType(request_index=None, tx_hash=unhexlify('cb74c8478c5814742c87cffdb4a21231869888f8042fb07a90e015a9db1f9d4a')), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXMETA,
details=TxRequestDetailsType(
request_index=None,
tx_hash=unhexlify(
"cb74c8478c5814742c87cffdb4a21231869888f8042fb07a90e015a9db1f9d4a"
),
),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevMeta(tx=ptx1), TxAckPrevMeta(tx=ptx1),
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=unhexlify('cb74c8478c5814742c87cffdb4a21231869888f8042fb07a90e015a9db1f9d4a')), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(
request_index=0,
tx_hash=unhexlify(
"cb74c8478c5814742c87cffdb4a21231869888f8042fb07a90e015a9db1f9d4a"
),
),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)), TxAckPrevInput(tx=TxAckPrevInputWrapper(input=pinp1)),
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=unhexlify('cb74c8478c5814742c87cffdb4a21231869888f8042fb07a90e015a9db1f9d4a')), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXOUTPUT,
details=TxRequestDetailsType(
request_index=0,
tx_hash=unhexlify(
"cb74c8478c5814742c87cffdb4a21231869888f8042fb07a90e015a9db1f9d4a"
),
),
serialized=EMPTY_SERIALIZED,
),
TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)), TxAckPrevOutput(tx=TxAckPrevOutputWrapper(output=pout1)),
# ButtonRequest(code=ButtonRequest_ConfirmOutput), # ButtonRequest(code=ButtonRequest_ConfirmOutput),
# ButtonRequest(code=ButtonRequest_SignTx), # ButtonRequest(code=ButtonRequest_SignTx),
TxRequest(request_type=TXINPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( TxRequest(
request_type=TXINPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
signature_index=None, signature_index=None,
signature=None, signature=None,
serialized_tx=unhexlify('0100000001'))), serialized_tx=unhexlify("0100000001"),
),
),
TxAckInput(tx=TxAckInputWrapper(input=inp1)), TxAckInput(tx=TxAckInputWrapper(input=inp1)),
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=EMPTY_SERIALIZED), TxRequest(
request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=EMPTY_SERIALIZED,
),
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
TxRequest(request_type=TXOUTPUT, details=TxRequestDetailsType(request_index=0, tx_hash=None), serialized=TxRequestSerializedType( TxRequest(
request_type=TXOUTPUT,
details=TxRequestDetailsType(request_index=0, tx_hash=None),
serialized=TxRequestSerializedType(
signature_index=0, signature_index=0,
signature=unhexlify('304402201fb96d20d0778f54520ab59afe70d5fb20e500ecc9f02281cf57934e8029e8e10220383d5a3e80f2e1eb92765b6da0f23d454aecbd8236f083d483e9a74302368761'), signature=unhexlify(
serialized_tx=unhexlify('4a9d1fdba915e0907ab02f04f88898863112a2b4fdcf872c7414588c47c874cb000000006a47304402201fb96d20d0778f54520ab59afe70d5fb20e500ecc9f02281cf57934e8029e8e10220383d5a3e80f2e1eb92765b6da0f23d454aecbd8236f083d483e9a7430236876101210331693756f749180aeed0a65a0fab0625a2250bd9abca502282a4cf0723152e67ffffffff01'))), "304402201fb96d20d0778f54520ab59afe70d5fb20e500ecc9f02281cf57934e8029e8e10220383d5a3e80f2e1eb92765b6da0f23d454aecbd8236f083d483e9a74302368761"
),
serialized_tx=unhexlify(
"4a9d1fdba915e0907ab02f04f88898863112a2b4fdcf872c7414588c47c874cb000000006a47304402201fb96d20d0778f54520ab59afe70d5fb20e500ecc9f02281cf57934e8029e8e10220383d5a3e80f2e1eb92765b6da0f23d454aecbd8236f083d483e9a7430236876101210331693756f749180aeed0a65a0fab0625a2250bd9abca502282a4cf0723152e67ffffffff01"
),
),
),
TxAckOutput(tx=TxAckOutputWrapper(output=out1)), TxAckOutput(tx=TxAckOutputWrapper(output=out1)),
TxRequest(request_type=TXFINISHED, details=TxRequestDetailsType(), serialized=TxRequestSerializedType( TxRequest(
request_type=TXFINISHED,
details=TxRequestDetailsType(),
serialized=TxRequestSerializedType(
signature_index=None, signature_index=None,
signature=None, signature=None,
serialized_tx=unhexlify('a0330300000000001976a914fe40329c95c5598ac60752a5310b320cb52d18e688ac00000000'), serialized_tx=unhexlify(
)), "a0330300000000001976a914fe40329c95c5598ac60752a5310b320cb52d18e688ac00000000"
),
),
),
] ]
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
ns = _get_schemas_for_coin(coin) ns = _get_schemas_for_coin(coin)
keychain = Keychain(seed, coin.curve_name, ns) keychain = Keychain(seed, coin.curve_name, ns)
signer = bitcoinlike.Bitcoinlike(tx, keychain, coin, None).signer() signer = bitcoinlike.Bitcoinlike(tx, keychain, coin, None).signer()
@ -116,5 +215,5 @@ class TestSignTx_GRS(unittest.TestCase):
signer.send(None) signer.send(None)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -19,54 +19,64 @@ class TestCalculateTxWeight(unittest.TestCase):
def test_p2pkh_txweight(self): def test_p2pkh_txweight(self):
coin = coins.by_name('Bitcoin') coin = coins.by_name("Bitcoin")
inp1 = TxInput(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e inp1 = TxInput(
address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e
# amount=390000, # amount=390000,
prev_hash=unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), prev_hash=unhexlify(
"d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"
),
prev_index=0, prev_index=0,
amount=None, amount=None,
script_type=InputScriptType.SPENDADDRESS, script_type=InputScriptType.SPENDADDRESS,
sequence=0xffff_ffff, sequence=0xFFFF_FFFF,
multisig=None) multisig=None,
out1 = TxOutput(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', )
out1 = TxOutput(
address="1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1",
amount=390000 - 10000, amount=390000 - 10000,
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
address_n=[], address_n=[],
multisig=None) multisig=None,
)
calculator = TxWeightCalculator() calculator = TxWeightCalculator()
calculator.add_input(inp1) calculator.add_input(inp1)
calculator.add_output(output_derive_script(out1.address, coin)) calculator.add_output(output_derive_script(out1.address, coin))
serialized_tx = '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000' serialized_tx = "010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000"
tx_weight = len(serialized_tx) / 2 * 4 # non-segwit tx's weight is simple length*4 tx_weight = (
len(serialized_tx) / 2 * 4
) # non-segwit tx's weight is simple length*4
self.assertEqual(calculator.get_weight(), tx_weight) self.assertEqual(calculator.get_weight(), tx_weight)
def test_p2wpkh_in_p2sh_txweight(self): def test_p2wpkh_in_p2sh_txweight(self):
coin = coins.by_name('Testnet') coin = coins.by_name("Testnet")
inp1 = TxInput( inp1 = TxInput(
# 49'/1'/0'/1/0" - 2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX # 49'/1'/0'/1/0" - 2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX
address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 0], address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 0],
amount=123456789, amount=123456789,
prev_hash=unhexlify('20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337'), prev_hash=unhexlify(
"20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337"
),
prev_index=0, prev_index=0,
script_type=InputScriptType.SPENDP2SHWITNESS, script_type=InputScriptType.SPENDP2SHWITNESS,
sequence=0xffffffff, sequence=0xFFFFFFFF,
multisig=None, multisig=None,
) )
out1 = TxOutput( out1 = TxOutput(
address='mhRx1CeVfaayqRwq5zgRQmD7W5aWBfD5mC', address="mhRx1CeVfaayqRwq5zgRQmD7W5aWBfD5mC",
amount=12300000, amount=12300000,
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
address_n=[], address_n=[],
multisig=None, multisig=None,
) )
out2 = TxOutput( out2 = TxOutput(
address='2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX', address="2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX",
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
amount=123456789 - 11000 - 12300000, amount=123456789 - 11000 - 12300000,
address_n=[], address_n=[],
@ -85,27 +95,29 @@ class TestCalculateTxWeight(unittest.TestCase):
def test_native_p2wpkh_txweight(self): def test_native_p2wpkh_txweight(self):
coin = coins.by_name('Testnet') coin = coins.by_name("Testnet")
inp1 = TxInput( inp1 = TxInput(
# 49'/1'/0'/0/0" - tb1qqzv60m9ajw8drqulta4ld4gfx0rdh82un5s65s # 49'/1'/0'/0/0" - tb1qqzv60m9ajw8drqulta4ld4gfx0rdh82un5s65s
address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 0, 0], address_n=[49 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 0, 0],
amount=12300000, amount=12300000,
prev_hash=unhexlify('09144602765ce3dd8f4329445b20e3684e948709c5cdcaf12da3bb079c99448a'), prev_hash=unhexlify(
"09144602765ce3dd8f4329445b20e3684e948709c5cdcaf12da3bb079c99448a"
),
prev_index=0, prev_index=0,
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
sequence=0xffffffff, sequence=0xFFFFFFFF,
multisig=None, multisig=None,
) )
out1 = TxOutput( out1 = TxOutput(
address='2N4Q5FhU2497BryFfUgbqkAJE87aKHUhXMp', address="2N4Q5FhU2497BryFfUgbqkAJE87aKHUhXMp",
amount=5000000, amount=5000000,
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
address_n=[], address_n=[],
multisig=None, multisig=None,
) )
out2 = TxOutput( out2 = TxOutput(
address='tb1q694ccp5qcc0udmfwgp692u2s2hjpq5h407urtu', address="tb1q694ccp5qcc0udmfwgp692u2s2hjpq5h407urtu",
script_type=OutputScriptType.PAYTOADDRESS, script_type=OutputScriptType.PAYTOADDRESS,
amount=12300000 - 11000 - 5000000, amount=12300000 - 11000 - 5000000,
address_n=[], address_n=[],
@ -123,12 +135,14 @@ class TestCalculateTxWeight(unittest.TestCase):
# total 566 # total 566
def test_taproot_txweight(self): def test_taproot_txweight(self):
coin = coins.by_name('Testnet') coin = coins.by_name("Testnet")
inp1 = TxInput( inp1 = TxInput(
address_n=[86 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 0], address_n=[86 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 1, 0],
amount=4600, amount=4600,
prev_hash=unhexlify('7956f1de3e7362b04115b64a31f0b6822c50dd6c08d78398f392a0ac3f0e357b'), prev_hash=unhexlify(
"7956f1de3e7362b04115b64a31f0b6822c50dd6c08d78398f392a0ac3f0e357b"
),
prev_index=1, prev_index=1,
script_type=InputScriptType.SPENDTAPROOT, script_type=InputScriptType.SPENDTAPROOT,
) )
@ -144,23 +158,27 @@ class TestCalculateTxWeight(unittest.TestCase):
calculator.add_output(output_derive_script(out1.address, coin)) calculator.add_output(output_derive_script(out1.address, coin))
# 010000000001017b350e3faca092f39883d7086cdd502c82b6f0314ab61541b062733edef156790100000000ffffffff016211000000000000225120e9af2fc69e20b0be2629cd0e9c34da9f3ef56af7beac4fb4298262bc5a45ec5d0140493145b992dacbd7ea579a415efc2cba20c3bf0f7827d1bcf999109c0d11783fe96f91ddb04a889faa17ad21ecc5c81a578009744e95c7e721aff2a5c442916600000000 # 010000000001017b350e3faca092f39883d7086cdd502c82b6f0314ab61541b062733edef156790100000000ffffffff016211000000000000225120e9af2fc69e20b0be2629cd0e9c34da9f3ef56af7beac4fb4298262bc5a45ec5d0140493145b992dacbd7ea579a415efc2cba20c3bf0f7827d1bcf999109c0d11783fe96f91ddb04a889faa17ad21ecc5c81a578009744e95c7e721aff2a5c442916600000000
self.assertEqual(calculator.get_weight(), 4*94 + 68) self.assertEqual(calculator.get_weight(), 4 * 94 + 68)
def test_legacy_multisig_txweight(self): def test_legacy_multisig_txweight(self):
coin = coins.by_name('Bitcoin') coin = coins.by_name("Bitcoin")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
keychain = Keychain(seed, coin.curve_name, [AlwaysMatchingSchema]) keychain = Keychain(seed, coin.curve_name, [AlwaysMatchingSchema])
nodes = [] nodes = []
for index in range(1, 4): for index in range(1, 4):
node = keychain.derive([48 | 0x80000000, 0 | 0x80000000, index | 0x80000000, 0 | 0x80000000]) node = keychain.derive(
nodes.append(HDNodeType( [48 | 0x80000000, 0 | 0x80000000, index | 0x80000000, 0 | 0x80000000]
)
nodes.append(
HDNodeType(
depth=node.depth(), depth=node.depth(),
child_num=node.child_num(), child_num=node.child_num(),
fingerprint=node.fingerprint(), fingerprint=node.fingerprint(),
chain_code=node.chain_code(), chain_code=node.chain_code(),
public_key=node.public_key(), public_key=node.public_key(),
)) )
)
multisig = MultisigRedeemScriptType( multisig = MultisigRedeemScriptType(
nodes=nodes, address_n=[0, 0], signatures=[b"", b"", b""], m=2 nodes=nodes, address_n=[0, 0], signatures=[b"", b"", b""], m=2
@ -169,7 +187,9 @@ class TestCalculateTxWeight(unittest.TestCase):
inp1 = TxInput( inp1 = TxInput(
address_n=[48 | 0x80000000, 0 | 0x80000000, 1 | 0x80000000, 0, 0], address_n=[48 | 0x80000000, 0 | 0x80000000, 1 | 0x80000000, 0, 0],
amount=100000, amount=100000,
prev_hash=unhexlify('c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52'), prev_hash=unhexlify(
"c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"
),
prev_index=1, prev_index=1,
script_type=InputScriptType.SPENDMULTISIG, script_type=InputScriptType.SPENDMULTISIG,
multisig=multisig, multisig=multisig,
@ -186,23 +206,27 @@ class TestCalculateTxWeight(unittest.TestCase):
calculator.add_output(output_derive_script(out1.address, coin)) calculator.add_output(output_derive_script(out1.address, coin))
# 010000000152ba4dfcde9c4bed88f55479cdea03e711ae586e9a89352a98230c4cdf1a09c601000000fdfe00004830450221009276eea820aa54a24bd9f1a056cb09a15f50c0816570a7c7878bd1c5ee7248540220677d200aec5e2f25bcf4000bdfab3faa9e1746d7f80c4ae4bfa1f5892eb5dcbf01483045022100c2a9fbfbff1be87036d8a6a22745512b158154f7f3d8f4cad4ba7ed130b37b83022058f5299b4c26222588dcc669399bd88b6f2bc6e04b48276373683853187a4fd6014c69522103dc0ff15b9c85c0d2c87099758bf47d36229c2514aeefcf8dea123f0f93c679762102bfe426e8671601ad46d54d09ee15aa035610d36d411961c87474908d403fbc122102a5d57129c6c96df663ad29492aa18605dad97231e043be8a92f9406073815c5d53aeffffffff01a0860100000000001976a91412e8391ad256dcdc023365978418d658dfecba1c88ac00000000 # 010000000152ba4dfcde9c4bed88f55479cdea03e711ae586e9a89352a98230c4cdf1a09c601000000fdfe00004830450221009276eea820aa54a24bd9f1a056cb09a15f50c0816570a7c7878bd1c5ee7248540220677d200aec5e2f25bcf4000bdfab3faa9e1746d7f80c4ae4bfa1f5892eb5dcbf01483045022100c2a9fbfbff1be87036d8a6a22745512b158154f7f3d8f4cad4ba7ed130b37b83022058f5299b4c26222588dcc669399bd88b6f2bc6e04b48276373683853187a4fd6014c69522103dc0ff15b9c85c0d2c87099758bf47d36229c2514aeefcf8dea123f0f93c679762102bfe426e8671601ad46d54d09ee15aa035610d36d411961c87474908d403fbc122102a5d57129c6c96df663ad29492aa18605dad97231e043be8a92f9406073815c5d53aeffffffff01a0860100000000001976a91412e8391ad256dcdc023365978418d658dfecba1c88ac00000000
self.assertEqual(calculator.get_weight(), 4*341) self.assertEqual(calculator.get_weight(), 4 * 341)
def test_segwit_multisig_txweight(self): def test_segwit_multisig_txweight(self):
coin = coins.by_name('Testnet') coin = coins.by_name("Testnet")
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
keychain = Keychain(seed, coin.curve_name, [AlwaysMatchingSchema]) keychain = Keychain(seed, coin.curve_name, [AlwaysMatchingSchema])
nodes = [] nodes = []
for index in range(1, 4): for index in range(1, 4):
node = keychain.derive([49 | 0x80000000, 1 | 0x80000000, index | 0x80000000]) node = keychain.derive(
nodes.append(HDNodeType( [49 | 0x80000000, 1 | 0x80000000, index | 0x80000000]
)
nodes.append(
HDNodeType(
depth=node.depth(), depth=node.depth(),
child_num=node.child_num(), child_num=node.child_num(),
fingerprint=node.fingerprint(), fingerprint=node.fingerprint(),
chain_code=node.chain_code(), chain_code=node.chain_code(),
public_key=node.public_key(), public_key=node.public_key(),
)) )
)
multisig = MultisigRedeemScriptType( multisig = MultisigRedeemScriptType(
nodes=nodes, address_n=[0, 0], signatures=[b"", b"", b""], m=2 nodes=nodes, address_n=[0, 0], signatures=[b"", b"", b""], m=2
@ -210,7 +234,9 @@ class TestCalculateTxWeight(unittest.TestCase):
inp1 = TxInput( inp1 = TxInput(
address_n=[49 | 0x80000000, 1 | 0x80000000, 1 | 0x80000000, 0, 0], address_n=[49 | 0x80000000, 1 | 0x80000000, 1 | 0x80000000, 0, 0],
prev_hash=unhexlify('c9348040bbc2024e12dcb4a0b4806b0398646b91acf314da028c3f03dd0179fc'), prev_hash=unhexlify(
"c9348040bbc2024e12dcb4a0b4806b0398646b91acf314da028c3f03dd0179fc"
),
prev_index=1, prev_index=1,
script_type=InputScriptType.SPENDP2SHWITNESS, script_type=InputScriptType.SPENDP2SHWITNESS,
multisig=multisig, multisig=multisig,
@ -228,36 +254,44 @@ class TestCalculateTxWeight(unittest.TestCase):
calculator.add_output(output_derive_script(out1.address, coin)) calculator.add_output(output_derive_script(out1.address, coin))
# 01000000000101be0210025c5be68a473f6a38bf53b53bc88d5c46567616026dc056e72b92319c01000000232200208d398cfb58a1d9cdb59ccbce81559c095e8c6f4a3e64966ca385078d9879f95effffffff01887d180000000000220020c5f4a0a4ea7c0392efe0a9670a73264cffa90b19107cd8a8e9750ff93c77fdfb0400483045022100dd6342c65197af27d7894d8b8b88b16b568ee3b5ebfdc55fdfb7caa9650e3b4c02200c7074a5bcb0068f63d9014c7cd2b0490aba75822d315d41aad444e9b86adf5201483045022100e7e6c2d21109512ba0609e93903e84bfb7731ac3962ee2c1cad54a7a30ff99a20220421497930226c39fc3834e8d6da3fc876516239518b0e82e2dc1e3c46271a17c01695221021630971f20fa349ba940a6ba3706884c41579cd760c89901374358db5dd545b92102f2ff4b353702d2bb03d4c494be19d77d0ab53d16161b53fbcaf1afeef4ad0cb52103e9b6b1c691a12ce448f1aedbbd588e064869c79fbd760eae3b8cd8a5f1a224db53ae00000000 # 01000000000101be0210025c5be68a473f6a38bf53b53bc88d5c46567616026dc056e72b92319c01000000232200208d398cfb58a1d9cdb59ccbce81559c095e8c6f4a3e64966ca385078d9879f95effffffff01887d180000000000220020c5f4a0a4ea7c0392efe0a9670a73264cffa90b19107cd8a8e9750ff93c77fdfb0400483045022100dd6342c65197af27d7894d8b8b88b16b568ee3b5ebfdc55fdfb7caa9650e3b4c02200c7074a5bcb0068f63d9014c7cd2b0490aba75822d315d41aad444e9b86adf5201483045022100e7e6c2d21109512ba0609e93903e84bfb7731ac3962ee2c1cad54a7a30ff99a20220421497930226c39fc3834e8d6da3fc876516239518b0e82e2dc1e3c46271a17c01695221021630971f20fa349ba940a6ba3706884c41579cd760c89901374358db5dd545b92102f2ff4b353702d2bb03d4c494be19d77d0ab53d16161b53fbcaf1afeef4ad0cb52103e9b6b1c691a12ce448f1aedbbd588e064869c79fbd760eae3b8cd8a5f1a224db53ae00000000
self.assertEqual(calculator.get_weight(), 4*129 + 256) self.assertEqual(calculator.get_weight(), 4 * 129 + 256)
def test_mixed_txweight(self): def test_mixed_txweight(self):
coin = coins.by_name('Testnet') coin = coins.by_name("Testnet")
inp1 = TxInput( inp1 = TxInput(
address_n=[49 | 0x80000000, 1 | 0x80000000, 1 | 0x80000000, 0, 0], address_n=[49 | 0x80000000, 1 | 0x80000000, 1 | 0x80000000, 0, 0],
amount=20000, amount=20000,
prev_hash=unhexlify('8c3ea7a10ab6d289119b722ec8c27b70c17c722334ced31a0370d782e4b6775d'), prev_hash=unhexlify(
"8c3ea7a10ab6d289119b722ec8c27b70c17c722334ced31a0370d782e4b6775d"
),
prev_index=0, prev_index=0,
script_type=InputScriptType.SPENDP2SHWITNESS, script_type=InputScriptType.SPENDP2SHWITNESS,
) )
inp2 = TxInput( inp2 = TxInput(
address_n=[84 | 0x80000000, 1 | 0x80000000, 1 | 0x80000000, 0, 0], address_n=[84 | 0x80000000, 1 | 0x80000000, 1 | 0x80000000, 0, 0],
amount=15000, amount=15000,
prev_hash=unhexlify('7956f1de3e7362b04115b64a31f0b6822c50dd6c08d78398f392a0ac3f0e357b'), prev_hash=unhexlify(
"7956f1de3e7362b04115b64a31f0b6822c50dd6c08d78398f392a0ac3f0e357b"
),
prev_index=0, prev_index=0,
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
) )
inp3 = TxInput( inp3 = TxInput(
address_n=[86 | 0x80000000, 1 | 0x80000000, 1 | 0x80000000, 0, 0], address_n=[86 | 0x80000000, 1 | 0x80000000, 1 | 0x80000000, 0, 0],
amount=4450, amount=4450,
prev_hash=unhexlify('7956f1de3e7362b04115b64a31f0b6822c50dd6c08d78398f392a0ac3f0e357b'), prev_hash=unhexlify(
"7956f1de3e7362b04115b64a31f0b6822c50dd6c08d78398f392a0ac3f0e357b"
),
prev_index=0, prev_index=0,
script_type=InputScriptType.SPENDTAPROOT, script_type=InputScriptType.SPENDTAPROOT,
) )
inp4 = TxInput( inp4 = TxInput(
address_n=[44 | 0x80000000, 1 | 0x80000000, 1 | 0x80000000, 0, 0], address_n=[44 | 0x80000000, 1 | 0x80000000, 1 | 0x80000000, 0, 0],
amount=10000, amount=10000,
prev_hash=unhexlify('3ac32e90831d79385eee49d6030a2123cd9d009fe8ffc3d470af9a6a777a119b'), prev_hash=unhexlify(
"3ac32e90831d79385eee49d6030a2123cd9d009fe8ffc3d470af9a6a777a119b"
),
prev_index=2, prev_index=2,
script_type=InputScriptType.SPENDADDRESS, script_type=InputScriptType.SPENDADDRESS,
) )
@ -302,25 +336,29 @@ class TestCalculateTxWeight(unittest.TestCase):
# 010000000001045d77b6e482d770031ad3ce3423727cc1707bc2c82e729b1189d2b60aa1a73e8c0000000017160014a33c6e24c99e108b97bc411e7e9ef31e9d5d6164ffffffff7b350e3faca092f39883d7086cdd502c82b6f0314ab61541b062733edef156790000000000ffffffff852e125137abca2dd7a42837dccfc34edc358c72eefd62978d6747d3be9315900000000000ffffffff9b117a776a9aaf70d4c3ffe89f009dcd23210a03d649ee5e38791d83902ec33a020000006b483045022100f6bd64136839b49822cf7e2050bc5c91346fc18b5cf97a945d4fd6c502f712d002207d1859e66d218f705b704f3cfca0c75410349bb1f50623f4fc2d09d5d8df0a3f012103bae960983f83e28fcb8f0e5f3dc1f1297b9f9636612fd0835b768e1b7275fb9dffffffff05a861000000000000160014d1a739f628f7eca55e8b99e7f32b22dcdbf672d4581b0000000000001976a91402e9b094fd98e2a26e805894eb78f7ff3fef199b88acf41a00000000000017a9141ff816cbeb74817050de585ceb2c772ebf71147a870000000000000000186a1674657374206f66206f705f72657475726e206461746110270000000000002251205a02573f7b39770ac53f73d161dc86f5104c6812bac297cb6ba418f6f1219c070247304402205fae7fa2b5141548593d5623ce5bd82ee18dfc751c243526039c91848efd603702200febfbe3467a68c599245ff89055514f26e146c79b58d932ced2325e6dad1b1a0121021630971f20fa349ba940a6ba3706884c41579cd760c89901374358db5dd545b90247304402201b21212100c84207697cebb852374669c382ed97cbd08afbbdfe1b302802161602206b32b2140d094cf5b7e758135961c95478c8e82fea0df30f56ccee284b79eaea012103f6b2377d52960a6094ec158cf19dcf9e33b3da4798c2302aa5806483ed4187ae01404a81e4b7f55d6d4a26923c5e2daf3cc86ed6030f83ea6e7bb16d7b81b988b34585be21a64ab45ddcc2fb9f17be2dfeff6b22cf943bc3fc8f125a7f463af428ed0000000000 # 010000000001045d77b6e482d770031ad3ce3423727cc1707bc2c82e729b1189d2b60aa1a73e8c0000000017160014a33c6e24c99e108b97bc411e7e9ef31e9d5d6164ffffffff7b350e3faca092f39883d7086cdd502c82b6f0314ab61541b062733edef156790000000000ffffffff852e125137abca2dd7a42837dccfc34edc358c72eefd62978d6747d3be9315900000000000ffffffff9b117a776a9aaf70d4c3ffe89f009dcd23210a03d649ee5e38791d83902ec33a020000006b483045022100f6bd64136839b49822cf7e2050bc5c91346fc18b5cf97a945d4fd6c502f712d002207d1859e66d218f705b704f3cfca0c75410349bb1f50623f4fc2d09d5d8df0a3f012103bae960983f83e28fcb8f0e5f3dc1f1297b9f9636612fd0835b768e1b7275fb9dffffffff05a861000000000000160014d1a739f628f7eca55e8b99e7f32b22dcdbf672d4581b0000000000001976a91402e9b094fd98e2a26e805894eb78f7ff3fef199b88acf41a00000000000017a9141ff816cbeb74817050de585ceb2c772ebf71147a870000000000000000186a1674657374206f66206f705f72657475726e206461746110270000000000002251205a02573f7b39770ac53f73d161dc86f5104c6812bac297cb6ba418f6f1219c070247304402205fae7fa2b5141548593d5623ce5bd82ee18dfc751c243526039c91848efd603702200febfbe3467a68c599245ff89055514f26e146c79b58d932ced2325e6dad1b1a0121021630971f20fa349ba940a6ba3706884c41579cd760c89901374358db5dd545b90247304402201b21212100c84207697cebb852374669c382ed97cbd08afbbdfe1b302802161602206b32b2140d094cf5b7e758135961c95478c8e82fea0df30f56ccee284b79eaea012103f6b2377d52960a6094ec158cf19dcf9e33b3da4798c2302aa5806483ed4187ae01404a81e4b7f55d6d4a26923c5e2daf3cc86ed6030f83ea6e7bb16d7b81b988b34585be21a64ab45ddcc2fb9f17be2dfeff6b22cf943bc3fc8f125a7f463af428ed0000000000
# The witness data is 283 bytes, but two of the DER signatures are one byte below the # The witness data is 283 bytes, but two of the DER signatures are one byte below the
# average length, so the caculator should estimate 285 bytes of witness data. # average length, so the caculator should estimate 285 bytes of witness data.
self.assertEqual(calculator.get_weight(), 4*477 + 285) self.assertEqual(calculator.get_weight(), 4 * 477 + 285)
def test_external_txweight(self): def test_external_txweight(self):
coin = coins.by_name('Testnet') coin = coins.by_name("Testnet")
inp1 = TxInput( inp1 = TxInput(
amount=100000, amount=100000,
prev_hash=unhexlify('e5b7e21b5ba720e81efd6bfa9f854ababdcddc75a43bfa60bf0fe069cfd1bb8a'), prev_hash=unhexlify(
"e5b7e21b5ba720e81efd6bfa9f854ababdcddc75a43bfa60bf0fe069cfd1bb8a"
),
prev_index=0, prev_index=0,
script_type=InputScriptType.EXTERNAL, script_type=InputScriptType.EXTERNAL,
script_pubkey=unhexlify('00149c02608d469160a92f40fdf8c6ccced029493088'), script_pubkey=unhexlify("00149c02608d469160a92f40fdf8c6ccced029493088"),
ownership_proof=unhexlify( ownership_proof=unhexlify(
'534c001900016b2055d8190244b2ed2d46513c40658a574d3bc2deb6969c0535bb818b44d2c40002483045022100d4ad0374c922848c71d913fba59c81b9075e0d33e884d953f0c4b4806b8ffd0c022024740e6717a2b6a5aa03148c3a28b02c713b4e30fc8aeae67fa69eb20e8ddcd9012103505f0d82bbdd251511591b34f36ad5eea37d3220c2b81a1189084431ddb3aa3d' "534c001900016b2055d8190244b2ed2d46513c40658a574d3bc2deb6969c0535bb818b44d2c40002483045022100d4ad0374c922848c71d913fba59c81b9075e0d33e884d953f0c4b4806b8ffd0c022024740e6717a2b6a5aa03148c3a28b02c713b4e30fc8aeae67fa69eb20e8ddcd9012103505f0d82bbdd251511591b34f36ad5eea37d3220c2b81a1189084431ddb3aa3d"
), ),
) )
inp2 = TxInput( inp2 = TxInput(
address_n=[84 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 0, 0], address_n=[84 | 0x80000000, 1 | 0x80000000, 0 | 0x80000000, 0, 0],
prev_hash=unhexlify('70f9871eb03a38405cfd7a01e0e1448678132d815e2c9f552ad83ae23969509e'), prev_hash=unhexlify(
"70f9871eb03a38405cfd7a01e0e1448678132d815e2c9f552ad83ae23969509e"
),
prev_index=0, prev_index=0,
amount=100000, amount=100000,
script_type=InputScriptType.SPENDWITNESS, script_type=InputScriptType.SPENDWITNESS,
@ -329,14 +367,16 @@ class TestCalculateTxWeight(unittest.TestCase):
inp3 = TxInput( inp3 = TxInput(
# tb1qldlynaqp0hy4zc2aag3pkenzvxy65saesxw3wd # tb1qldlynaqp0hy4zc2aag3pkenzvxy65saesxw3wd
# address_n=parse_path("m/84h/1h/0h/0/1"), # address_n=parse_path("m/84h/1h/0h/0/1"),
prev_hash=unhexlify('65b768dacccfb209eebd95a1fb80a04f1dd6a3abc6d7b41d5e9d9f91605b37d9'), prev_hash=unhexlify(
"65b768dacccfb209eebd95a1fb80a04f1dd6a3abc6d7b41d5e9d9f91605b37d9"
),
prev_index=0, prev_index=0,
amount=10000, amount=10000,
script_type=InputScriptType.EXTERNAL, script_type=InputScriptType.EXTERNAL,
script_pubkey=unhexlify('0014fb7e49f4017dc951615dea221b66626189aa43b9'), script_pubkey=unhexlify("0014fb7e49f4017dc951615dea221b66626189aa43b9"),
script_sig=bytes(0), script_sig=bytes(0),
witness=unhexlify( witness=unhexlify(
'024730440220432ac60461de52713ad543cbb1484f7eca1a72c615d539b3f42f5668da4501d2022063786a6d6940a5c1ed9c2d2fd02cef90b6c01ddd84829c946561e15be6c0aae1012103dcf3bc936ecb2ec57b8f468050abce8c8756e75fd74273c9977744b1a0be7d03' "024730440220432ac60461de52713ad543cbb1484f7eca1a72c615d539b3f42f5668da4501d2022063786a6d6940a5c1ed9c2d2fd02cef90b6c01ddd84829c946561e15be6c0aae1012103dcf3bc936ecb2ec57b8f468050abce8c8756e75fd74273c9977744b1a0be7d03"
), ),
) )
@ -352,11 +392,11 @@ class TestCalculateTxWeight(unittest.TestCase):
calculator.add_input(inp3) calculator.add_input(inp3)
calculator.add_output(output_derive_script(out1.address, coin)) calculator.add_output(output_derive_script(out1.address, coin))
self.assertEqual(calculator.get_weight(), 4*164 + 325) self.assertEqual(calculator.get_weight(), 4 * 164 + 325)
# non-segwit: header, inputs, outputs, locktime 4*(4+1+3*41+1+31+4) = 4*164 # non-segwit: header, inputs, outputs, locktime 4*(4+1+3*41+1+31+4) = 4*164
# segwit: segwit header, 2x estimated witness (including stack item count) # segwit: segwit header, 2x estimated witness (including stack item count)
# and 1x exact witness (including stack item count) 1*(2+108+108+107) = 325 # and 1x exact witness (including stack item count) 1*(2+108+108+107) = 325
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -142,32 +142,32 @@ class TestZcashZip243(unittest.TestCase):
}, },
# "Test vector 3" from https://github.com/zcash/zips/blob/master/zip-0243.rst # "Test vector 3" from https://github.com/zcash/zips/blob/master/zip-0243.rst
{ {
"expiry": 0x0004b048, "expiry": 0x0004B048,
"inputs": [ "inputs": [
{ {
"amount": 0x02faf080, "amount": 0x02FAF080,
"prevout": [ "prevout": [
"d9042195d9a1b65b2f1f79d68ceb1a5ea6459c9651a6ad4dc1f465824785c6a8", "d9042195d9a1b65b2f1f79d68ceb1a5ea6459c9651a6ad4dc1f465824785c6a8",
1, 1,
], ],
"script_type": InputScriptType.SPENDADDRESS, "script_type": InputScriptType.SPENDADDRESS,
"pubkey": "03c6d9cc725bb7e19c026df03bf693ee1171371a8eaf25f04b7a58f6befabcd38c", "pubkey": "03c6d9cc725bb7e19c026df03bf693ee1171371a8eaf25f04b7a58f6befabcd38c",
"sequence": 0xfffffffe, "sequence": 0xFFFFFFFE,
} }
], ],
"lock_time": 0x0004b029, "lock_time": 0x0004B029,
"outputs": [ "outputs": [
{ {
"script_pubkey": "76a9148132712c3ff19f3a151234616777420a6d7ef22688ac", "script_pubkey": "76a9148132712c3ff19f3a151234616777420a6d7ef22688ac",
"amount": 0x02625a00, "amount": 0x02625A00,
}, },
{ {
"script_pubkey": "76a9145453e4698f02a38abdaa521cd1ff2dee6fac187188ac", "script_pubkey": "76a9145453e4698f02a38abdaa521cd1ff2dee6fac187188ac",
"amount": 0x0098958b, "amount": 0x0098958B,
}, },
], ],
"version": 4, "version": 4,
"version_group_id": 0x892f2085, "version_group_id": 0x892F2085,
"branch_id": 0x76B809BB, "branch_id": 0x76B809BB,
"prevouts_hash": b"fae31b8dec7b0b77e2c8d6b6eb0e7e4e55abc6574c26dd44464d9408a8e33f11", "prevouts_hash": b"fae31b8dec7b0b77e2c8d6b6eb0e7e4e55abc6574c26dd44464d9408a8e33f11",
"sequence_hash": b"6c80d37f12d89b6f17ff198723e7db1247c4811d1a695d74d930f99e98418790", "sequence_hash": b"6c80d37f12d89b6f17ff198723e7db1247c4811d1a695d74d930f99e98418790",
@ -195,25 +195,41 @@ class TestZcashZip243(unittest.TestCase):
for i in v["inputs"]: for i in v["inputs"]:
txi = TxInput( txi = TxInput(
amount = i["amount"], amount=i["amount"],
prev_hash = unhexlify(i["prevout"][0]), prev_hash=unhexlify(i["prevout"][0]),
prev_index = i["prevout"][1], prev_index=i["prevout"][1],
script_type = i["script_type"], script_type=i["script_type"],
sequence = i["sequence"], sequence=i["sequence"],
) )
zip243.add_input(txi, b"") zip243.add_input(txi, b"")
for o in v["outputs"]: for o in v["outputs"]:
txo = PrevOutput( txo = PrevOutput(
amount = o["amount"], amount=o["amount"],
script_pubkey = unhexlify(o["script_pubkey"]), script_pubkey=unhexlify(o["script_pubkey"]),
) )
zip243.add_output(txo, txo.script_pubkey) zip243.add_output(txo, txo.script_pubkey)
self.assertEqual(hexlify(get_tx_hash(zip243.h_prevouts)), v["prevouts_hash"]) self.assertEqual(
self.assertEqual(hexlify(get_tx_hash(zip243.h_sequence)), v["sequence_hash"]) hexlify(get_tx_hash(zip243.h_prevouts)), v["prevouts_hash"]
)
self.assertEqual(
hexlify(get_tx_hash(zip243.h_sequence)), v["sequence_hash"]
)
self.assertEqual(hexlify(get_tx_hash(zip243.h_outputs)), v["outputs_hash"]) self.assertEqual(hexlify(get_tx_hash(zip243.h_outputs)), v["outputs_hash"])
self.assertEqual(hexlify(zip243.hash143(txi, [unhexlify(i["pubkey"])], 1, tx, coin, SigHashType.SIGHASH_ALL)), v["preimage_hash"]) self.assertEqual(
hexlify(
zip243.hash143(
txi,
[unhexlify(i["pubkey"])],
1,
tx,
coin,
SigHashType.SIGHASH_ALL,
)
),
v["preimage_hash"],
)
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -9,7 +9,10 @@ from apps.common import seed
from apps.common.paths import HARDENED from apps.common.paths import HARDENED
if not utils.BITCOIN_ONLY: if not utils.BITCOIN_ONLY:
from apps.cardano.addresses import derive_human_readable, validate_address_parameters from apps.cardano.addresses import (
derive_human_readable,
validate_address_parameters,
)
from apps.cardano.byron_addresses import _address_hash from apps.cardano.byron_addresses import _address_hash
from apps.cardano.helpers import network_ids, protocol_magics from apps.cardano.helpers import network_ids, protocol_magics
from apps.cardano.seed import Keychain from apps.cardano.seed import Keychain
@ -35,9 +38,20 @@ class TestCardanoAddress(unittest.TestCase):
# 44'/1815'/0'/0/i' # 44'/1815'/0'/0/i'
address_parameters = CardanoAddressParametersType( address_parameters = CardanoAddressParametersType(
address_type=CardanoAddressType.BYRON, address_type=CardanoAddressType.BYRON,
address_n=[0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, 0x80000000 + i], address_n=[
0x80000000 | 44,
0x80000000 | 1815,
0x80000000,
0,
0x80000000 + i,
],
)
address = derive_human_readable(
self.keychain,
address_parameters,
protocol_magics.MAINNET,
network_ids.MAINNET,
) )
address = derive_human_readable(self.keychain, address_parameters, protocol_magics.MAINNET, network_ids.MAINNET)
self.assertEqual(expected, address) self.assertEqual(expected, address)
nodes = [ nodes = [
@ -45,24 +59,26 @@ class TestCardanoAddress(unittest.TestCase):
b"3881a8de77d069001010d7f7d5211552e7d539b0e253add710367f95e528ed51", b"3881a8de77d069001010d7f7d5211552e7d539b0e253add710367f95e528ed51",
b"9b77608b38e0a0c7861aa234557c81482f42aae2d17993a8ddaec1868fb04d60", b"9b77608b38e0a0c7861aa234557c81482f42aae2d17993a8ddaec1868fb04d60",
b"a938c8554ae04616cfaae7cd0eb557475082c4e910242ce774967e0bd7492408", b"a938c8554ae04616cfaae7cd0eb557475082c4e910242ce774967e0bd7492408",
b"cbf6ab47c8eb1a0477fc40b25dbb6c4a99454edb97d6fe5acedd3e238ef46fe0" b"cbf6ab47c8eb1a0477fc40b25dbb6c4a99454edb97d6fe5acedd3e238ef46fe0",
), ),
( (
b"3003aca659846540b9ed04f2b844f2d8ea964856ca38a7dffedef4f6e528ed51", b"3003aca659846540b9ed04f2b844f2d8ea964856ca38a7dffedef4f6e528ed51",
b"8844ccc81d633e1c7126f30c2524c1652617cf58da755014070215bf5070ba38", b"8844ccc81d633e1c7126f30c2524c1652617cf58da755014070215bf5070ba38",
b"be28c00ed6cb9b70310f78028f8e3a2db935baf482d84afa590b0b5b864571cc", b"be28c00ed6cb9b70310f78028f8e3a2db935baf482d84afa590b0b5b864571cc",
b"584b4631d752023a249e980779517280e6c0b3ac7a7f27c6e9456bfd228ca60b" b"584b4631d752023a249e980779517280e6c0b3ac7a7f27c6e9456bfd228ca60b",
), ),
( (
b"68e4482add0a741e14c8f2306bf83206a623e3729dd24175915eedece428ed51", b"68e4482add0a741e14c8f2306bf83206a623e3729dd24175915eedece428ed51",
b"3165a80c5efe846224d46a0427cdb2be4f31ea3585c51f4131faefc4328ad95a", b"3165a80c5efe846224d46a0427cdb2be4f31ea3585c51f4131faefc4328ad95a",
b"9a32499976ffb582daa9988dfc42a303de5ed00c320c929f496be3c6eb1cf405", b"9a32499976ffb582daa9988dfc42a303de5ed00c320c929f496be3c6eb1cf405",
b"da07ca30a3d1c5fe3c34ce5fa197722446a646624a10bdf8889a4b9c347b2ef2" b"da07ca30a3d1c5fe3c34ce5fa197722446a646624a10bdf8889a4b9c347b2ef2",
), ),
] ]
for i, (priv, ext, pub, chain) in enumerate(nodes): for i, (priv, ext, pub, chain) in enumerate(nodes):
n = self.keychain.derive([0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, 0x80000000 + i]) n = self.keychain.derive(
[0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, 0x80000000 + i]
)
self.assertEqual(hexlify(n.private_key()), priv) self.assertEqual(hexlify(n.private_key()), priv)
self.assertEqual(hexlify(n.private_key_ext()), ext) self.assertEqual(hexlify(n.private_key_ext()), ext)
self.assertEqual(hexlify(seed.remove_ed25519_prefix(n.public_key())), pub) self.assertEqual(hexlify(seed.remove_ed25519_prefix(n.public_key())), pub)
@ -81,7 +97,12 @@ class TestCardanoAddress(unittest.TestCase):
address_type=CardanoAddressType.BYRON, address_type=CardanoAddressType.BYRON,
address_n=[0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, i], address_n=[0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, i],
) )
address = derive_human_readable(self.keychain, address_parameters, protocol_magics.MAINNET, network_ids.MAINNET) address = derive_human_readable(
self.keychain,
address_parameters,
protocol_magics.MAINNET,
network_ids.MAINNET,
)
self.assertEqual(address, expected) self.assertEqual(address, expected)
nodes = [ nodes = [
@ -89,44 +110,52 @@ class TestCardanoAddress(unittest.TestCase):
b"d03ba81163fd55af97bd132bf651a0da5b5e6201b15b1caca60b0be8e028ed51", b"d03ba81163fd55af97bd132bf651a0da5b5e6201b15b1caca60b0be8e028ed51",
b"493f44aa8d25fe0d3fe2935c76ea6b3e9e41c79e9dbcbe7131357c5aa1b6cac5", b"493f44aa8d25fe0d3fe2935c76ea6b3e9e41c79e9dbcbe7131357c5aa1b6cac5",
b"b90fb812a2268e9569ff1172e8daed1da3dc7e72c7bded7c5bcb7282039f90d5", b"b90fb812a2268e9569ff1172e8daed1da3dc7e72c7bded7c5bcb7282039f90d5",
b"fd8e71c1543de2cdc7f7623130c5f2cceb53549055fa1f5bc88199989e08cce7" b"fd8e71c1543de2cdc7f7623130c5f2cceb53549055fa1f5bc88199989e08cce7",
), ),
( (
b"08b6438c8dd49d34b71c8e914d6ac3184e5ab3dcc8af023d08503a7edf28ed51", b"08b6438c8dd49d34b71c8e914d6ac3184e5ab3dcc8af023d08503a7edf28ed51",
b"3fee605fdfaddc1ee2ea0b246b02c9abc54ad741054bc83943e8b21487b5a053", b"3fee605fdfaddc1ee2ea0b246b02c9abc54ad741054bc83943e8b21487b5a053",
b"89053545a6c254b0d9b1464e48d2b5fcf91d4e25c128afb1fcfc61d0843338ea", b"89053545a6c254b0d9b1464e48d2b5fcf91d4e25c128afb1fcfc61d0843338ea",
b"26308151516f3b0e02bb1638142747863c520273ce9bd3e5cd91e1d46fe2a635" b"26308151516f3b0e02bb1638142747863c520273ce9bd3e5cd91e1d46fe2a635",
), ),
( (
b"088f0275bf4a1bd18f08d7ef06c6ddb6ce7e3dc415fb4e89fe21bf39e628ed51", b"088f0275bf4a1bd18f08d7ef06c6ddb6ce7e3dc415fb4e89fe21bf39e628ed51",
b"4c44563c7df519ea9b4d1801c1ab98b449db28b87f1c3837759c20f68c4c1e65", b"4c44563c7df519ea9b4d1801c1ab98b449db28b87f1c3837759c20f68c4c1e65",
b"52548cb98e6f46a592bdf7f3598a9abc0126c78dfa3f46d1894ee52a5213e833", b"52548cb98e6f46a592bdf7f3598a9abc0126c78dfa3f46d1894ee52a5213e833",
b"91af0668ee449e613e61bbb2482e5ddee1d9b15785727ec3e362c36861bff923" b"91af0668ee449e613e61bbb2482e5ddee1d9b15785727ec3e362c36861bff923",
), ),
] ]
for i, (priv, ext, pub, chain) in enumerate(nodes): for i, (priv, ext, pub, chain) in enumerate(nodes):
n = self.keychain.derive([0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, i]) n = self.keychain.derive(
[0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, i]
)
self.assertEqual(hexlify(n.private_key()), priv) self.assertEqual(hexlify(n.private_key()), priv)
self.assertEqual(hexlify(n.private_key_ext()), ext) self.assertEqual(hexlify(n.private_key_ext()), ext)
self.assertEqual(hexlify(seed.remove_ed25519_prefix(n.public_key())), pub) self.assertEqual(hexlify(seed.remove_ed25519_prefix(n.public_key())), pub)
self.assertEqual(hexlify(n.chain_code()), chain) self.assertEqual(hexlify(n.chain_code()), chain)
def test_root_address_derivation_scheme(self): def test_root_address_derivation_scheme(self):
# 44'/1815' # 44'/1815'
address_parameters = CardanoAddressParametersType( address_parameters = CardanoAddressParametersType(
address_type=CardanoAddressType.BYRON, address_type=CardanoAddressType.BYRON,
address_n=[0x80000000 | 44, 0x80000000 | 1815], address_n=[0x80000000 | 44, 0x80000000 | 1815],
) )
address = derive_human_readable(self.keychain, address_parameters, protocol_magics.MAINNET, network_ids.MAINNET) address = derive_human_readable(
self.assertEqual(address, "Ae2tdPwUPEZ2FGHX3yCKPSbSgyuuTYgMxNq652zKopxT4TuWvEd8Utd92w3") self.keychain,
address_parameters,
protocol_magics.MAINNET,
network_ids.MAINNET,
)
self.assertEqual(
address, "Ae2tdPwUPEZ2FGHX3yCKPSbSgyuuTYgMxNq652zKopxT4TuWvEd8Utd92w3"
)
priv, ext, pub, chain = ( priv, ext, pub, chain = (
b"204ec79cbb6502a141de60d274962010c7f1c94a2987b26506433184d228ed51", b"204ec79cbb6502a141de60d274962010c7f1c94a2987b26506433184d228ed51",
b"975cdd1c8610b44701567f05934c45c8716064263ccfe72ed2167ccb705c09b6", b"975cdd1c8610b44701567f05934c45c8716064263ccfe72ed2167ccb705c09b6",
b"8c47ebce34234d04fd3dfbac33feaba6133e4e3d77c4b5ab18120ec6878ad4ce", b"8c47ebce34234d04fd3dfbac33feaba6133e4e3d77c4b5ab18120ec6878ad4ce",
b"02ac67c59a8b0264724a635774ca2c242afa10d7ab70e2bf0a8f7d4bb10f1f7a" b"02ac67c59a8b0264724a635774ca2c242afa10d7ab70e2bf0a8f7d4bb10f1f7a",
) )
n = self.keychain.derive([0x80000000 | 44, 0x80000000 | 1815]) n = self.keychain.derive([0x80000000 | 44, 0x80000000 | 1815])
@ -135,13 +164,21 @@ class TestCardanoAddress(unittest.TestCase):
self.assertEqual(hexlify(seed.remove_ed25519_prefix(n.public_key())), pub) self.assertEqual(hexlify(seed.remove_ed25519_prefix(n.public_key())), pub)
self.assertEqual(hexlify(n.chain_code()), chain) self.assertEqual(hexlify(n.chain_code()), chain)
def test_address_hash(self): def test_address_hash(self):
data = [0, [0, b"}\x1d\xe3\xf2/S\x90M\x00\x7f\xf83\xfa\xdd|\xd6H.\xa1\xe89\x18\xb9\x85\xb4\xea3\xe6<\x16\xd1\x83z\x04\xa6\xaa\xb0\xed\x12\xafV*&\xdbM\x104DT'M\x0b\xfan5\x81\xdf\x1d\xc0/\x13\xc5\xfb\xe5"], {}] data = [
0,
[
0,
b"}\x1d\xe3\xf2/S\x90M\x00\x7f\xf83\xfa\xdd|\xd6H.\xa1\xe89\x18\xb9\x85\xb4\xea3\xe6<\x16\xd1\x83z\x04\xa6\xaa\xb0\xed\x12\xafV*&\xdbM\x104DT'M\x0b\xfan5\x81\xdf\x1d\xc0/\x13\xc5\xfb\xe5",
],
{},
]
result = _address_hash(data) result = _address_hash(data)
self.assertEqual(result, b'\x1c\xca\xee\xc9\x80\xaf}\xb0\x9a\xa8\x96E\xd6\xa4\xd1\xb4\x13\x85\xb9\xc2q\x1d5/{\x12"\xca') self.assertEqual(
result,
b'\x1c\xca\xee\xc9\x80\xaf}\xb0\x9a\xa8\x96E\xd6\xa4\xd1\xb4\x13\x85\xb9\xc2q\x1d5/{\x12"\xca',
)
def test_slip39_128(self): def test_slip39_128(self):
mnemonics = [ mnemonics = [
@ -150,7 +187,7 @@ class TestCardanoAddress(unittest.TestCase):
"extra extend academic acne away best indicate impact square oasis " "extra extend academic acne away best indicate impact square oasis "
"prospect painting voting guest either argue username racism enemy eclipse", "prospect painting voting guest either argue username racism enemy eclipse",
"extra extend academic arcade born dive legal hush gross briefing " "extra extend academic arcade born dive legal hush gross briefing "
"talent drug much home firefly toxic analysis idea umbrella slice" "talent drug much home firefly toxic analysis idea umbrella slice",
] ]
passphrase = b"TREZOR" passphrase = b"TREZOR"
identifier, exponent, ems = slip39.recover_ems(mnemonics) identifier, exponent, ems = slip39.recover_ems(mnemonics)
@ -166,7 +203,9 @@ class TestCardanoAddress(unittest.TestCase):
self.assertEqual(hexlify(node.private_key()), root_priv) self.assertEqual(hexlify(node.private_key()), root_priv)
self.assertEqual(hexlify(node.private_key_ext()), root_ext) self.assertEqual(hexlify(node.private_key_ext()), root_ext)
self.assertEqual(hexlify(seed.remove_ed25519_prefix(node.public_key())), root_pub) self.assertEqual(
hexlify(seed.remove_ed25519_prefix(node.public_key())), root_pub
)
self.assertEqual(hexlify(node.chain_code()), root_chain) self.assertEqual(hexlify(node.chain_code()), root_chain)
# Check derived nodes and addresses. # Check derived nodes and addresses.
@ -192,8 +231,8 @@ class TestCardanoAddress(unittest.TestCase):
b"e8320644cce22a6e9fc33865fc5a598b1cda061c47a548aead3af4ed1cd13954", b"e8320644cce22a6e9fc33865fc5a598b1cda061c47a548aead3af4ed1cd13954",
b"9e2ece5d7fe8119cb76090009be926a84fc5d3b95855b5962ffe2f880836cf09", b"9e2ece5d7fe8119cb76090009be926a84fc5d3b95855b5962ffe2f880836cf09",
b"831a63d381a8dab1e6e1ee991a4300fc70687aae5f97f4fcf92ed1b6c2bd99de", b"831a63d381a8dab1e6e1ee991a4300fc70687aae5f97f4fcf92ed1b6c2bd99de",
b"672d6af4707aba201b7940231e83dd357f92f8851b3dfdc224ef311e1b64cdeb" b"672d6af4707aba201b7940231e83dd357f92f8851b3dfdc224ef311e1b64cdeb",
) ),
] ]
for i, (address, priv, ext, pub, chain) in enumerate(nodes): for i, (address, priv, ext, pub, chain) in enumerate(nodes):
@ -202,7 +241,12 @@ class TestCardanoAddress(unittest.TestCase):
address_type=CardanoAddressType.BYRON, address_type=CardanoAddressType.BYRON,
address_n=[0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, i], address_n=[0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, i],
) )
a = derive_human_readable(keychain, address_parameters, protocol_magics.MAINNET, network_ids.MAINNET) a = derive_human_readable(
keychain,
address_parameters,
protocol_magics.MAINNET,
network_ids.MAINNET,
)
n = keychain.derive([0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, i]) n = keychain.derive([0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, i])
self.assertEqual(a, address) self.assertEqual(a, address)
self.assertEqual(hexlify(n.private_key()), priv) self.assertEqual(hexlify(n.private_key()), priv)
@ -217,7 +261,7 @@ class TestCardanoAddress(unittest.TestCase):
"ladle lying voter typical security quantity hawk legs idle leaves gasoline", "ladle lying voter typical security quantity hawk legs idle leaves gasoline",
"hobo romp academic agency ancestor industry argue sister scene midst graduate " "hobo romp academic agency ancestor industry argue sister scene midst graduate "
"profile numb paid headset airport daisy flame express scene usual welcome " "profile numb paid headset airport daisy flame express scene usual welcome "
"quick silent downtown oral critical step remove says rhythm venture aunt" "quick silent downtown oral critical step remove says rhythm venture aunt",
] ]
passphrase = b"TREZOR" passphrase = b"TREZOR"
identifier, exponent, ems = slip39.recover_ems(mnemonics) identifier, exponent, ems = slip39.recover_ems(mnemonics)
@ -233,7 +277,9 @@ class TestCardanoAddress(unittest.TestCase):
self.assertEqual(hexlify(node.private_key()), root_priv) self.assertEqual(hexlify(node.private_key()), root_priv)
self.assertEqual(hexlify(node.private_key_ext()), root_ext) self.assertEqual(hexlify(node.private_key_ext()), root_ext)
self.assertEqual(hexlify(seed.remove_ed25519_prefix(node.public_key())), root_pub) self.assertEqual(
hexlify(seed.remove_ed25519_prefix(node.public_key())), root_pub
)
self.assertEqual(hexlify(node.chain_code()), root_chain) self.assertEqual(hexlify(node.chain_code()), root_chain)
# Check derived nodes and addresses. # Check derived nodes and addresses.
@ -260,7 +306,7 @@ class TestCardanoAddress(unittest.TestCase):
b"ddfe7f27e2894b983df773d8ac2a07973fc37ff36e93a2f2d71fb7327d4e18f4", b"ddfe7f27e2894b983df773d8ac2a07973fc37ff36e93a2f2d71fb7327d4e18f4",
b"7f145b50ef07fb9accc40ee07a01fe93ceb6fa07d5a9f20fc3c8a48246dd4d02", b"7f145b50ef07fb9accc40ee07a01fe93ceb6fa07d5a9f20fc3c8a48246dd4d02",
b"e67d2864614ada5eec8fb8ee1225a94a6fb0a1b3c347c854ec3037351c6a0fc7", b"e67d2864614ada5eec8fb8ee1225a94a6fb0a1b3c347c854ec3037351c6a0fc7",
) ),
] ]
for i, (address, priv, ext, pub, chain) in enumerate(nodes): for i, (address, priv, ext, pub, chain) in enumerate(nodes):
@ -269,7 +315,12 @@ class TestCardanoAddress(unittest.TestCase):
address_type=CardanoAddressType.BYRON, address_type=CardanoAddressType.BYRON,
address_n=[0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, i], address_n=[0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, i],
) )
a = derive_human_readable(keychain, address_parameters, protocol_magics.MAINNET, network_ids.MAINNET) a = derive_human_readable(
keychain,
address_parameters,
protocol_magics.MAINNET,
network_ids.MAINNET,
)
n = keychain.derive([0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, i]) n = keychain.derive([0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, i])
self.assertEqual(a, address) self.assertEqual(a, address)
self.assertEqual(hexlify(n.private_key()), priv) self.assertEqual(hexlify(n.private_key()), priv)
@ -290,7 +341,9 @@ class TestCardanoAddress(unittest.TestCase):
address_type=CardanoAddressType.BYRON, address_type=CardanoAddressType.BYRON,
address_n=[0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, i], address_n=[0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, i],
) )
address = derive_human_readable(self.keychain, address_parameters, protocol_magics.TESTNET_LEGACY, 0) address = derive_human_readable(
self.keychain, address_parameters, protocol_magics.TESTNET_LEGACY, 0
)
self.assertEqual(expected, address) self.assertEqual(expected, address)
def test_derive_address(self): def test_derive_address(self):
@ -298,59 +351,95 @@ class TestCardanoAddress(unittest.TestCase):
"BASE": CardanoAddressParametersType( "BASE": CardanoAddressParametersType(
address_type=CardanoAddressType.BASE, address_type=CardanoAddressType.BASE,
address_n=[1852 | HARDENED, 1815 | HARDENED, 4 | HARDENED, 0, 0], address_n=[1852 | HARDENED, 1815 | HARDENED, 4 | HARDENED, 0, 0],
address_n_staking=[1852 | HARDENED, 1815 | HARDENED, 4 | HARDENED, 2, 0] address_n_staking=[
1852 | HARDENED,
1815 | HARDENED,
4 | HARDENED,
2,
0,
],
), ),
"BASE_OWN_STAKING_KEY_HASH": CardanoAddressParametersType( "BASE_OWN_STAKING_KEY_HASH": CardanoAddressParametersType(
address_type=CardanoAddressType.BASE, address_type=CardanoAddressType.BASE,
address_n=[1852 | HARDENED, 1815 | HARDENED, 4 | HARDENED, 0, 0], address_n=[1852 | HARDENED, 1815 | HARDENED, 4 | HARDENED, 0, 0],
staking_key_hash=unhexlify("1bc428e4720702ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff") staking_key_hash=unhexlify(
"1bc428e4720702ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff"
),
), ),
"BASE_OWN_STAKING_KEY_HASH": CardanoAddressParametersType( "BASE_OWN_STAKING_KEY_HASH": CardanoAddressParametersType(
address_type=CardanoAddressType.BASE, address_type=CardanoAddressType.BASE,
address_n=[1852 | HARDENED, 1815 | HARDENED, 4 | HARDENED, 0, 0], address_n=[1852 | HARDENED, 1815 | HARDENED, 4 | HARDENED, 0, 0],
staking_key_hash=unhexlify("1bc428e4720702ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff") staking_key_hash=unhexlify(
"1bc428e4720702ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff"
),
), ),
# staking key hash not owned - derived with "all all..." mnenomnic # staking key hash not owned - derived with "all all..." mnenomnic
"BASE_FOREIGN_STAKING_KEY_HASH_ACCOUNT_4": CardanoAddressParametersType( "BASE_FOREIGN_STAKING_KEY_HASH_ACCOUNT_4": CardanoAddressParametersType(
address_type=CardanoAddressType.BASE, address_type=CardanoAddressType.BASE,
address_n=[1852 | HARDENED, 1815 | HARDENED, 4 | HARDENED, 0, 0], address_n=[1852 | HARDENED, 1815 | HARDENED, 4 | HARDENED, 0, 0],
staking_key_hash=unhexlify("122a946b9ad3d2ddf029d3a828f0468aece76895f15c9efbd69b4277") staking_key_hash=unhexlify(
"122a946b9ad3d2ddf029d3a828f0468aece76895f15c9efbd69b4277"
),
), ),
# staking key hash not owned - derived with "all all..." mnenomnic # staking key hash not owned - derived with "all all..." mnenomnic
"BASE_FOREIGN_STAKING_KEY_HASH_ACCOUNT_0": CardanoAddressParametersType( "BASE_FOREIGN_STAKING_KEY_HASH_ACCOUNT_0": CardanoAddressParametersType(
address_type=CardanoAddressType.BASE, address_type=CardanoAddressType.BASE,
address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0], address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
staking_key_hash=unhexlify("122a946b9ad3d2ddf029d3a828f0468aece76895f15c9efbd69b4277") staking_key_hash=unhexlify(
"122a946b9ad3d2ddf029d3a828f0468aece76895f15c9efbd69b4277"
), ),
"BASE_SCRIPT_KEY_SCRIPT_HASH":CardanoAddressParametersType( ),
"BASE_SCRIPT_KEY_SCRIPT_HASH": CardanoAddressParametersType(
address_type=CardanoAddressType.BASE_SCRIPT_KEY, address_type=CardanoAddressType.BASE_SCRIPT_KEY,
address_n_staking=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 2, 0], address_n_staking=[
script_payment_hash=unhexlify("0d5acbf6a1dfb0c8724e60df314987315ccbf78bb6c0f9b6f3d568fe"), 1852 | HARDENED,
1815 | HARDENED,
0 | HARDENED,
2,
0,
],
script_payment_hash=unhexlify(
"0d5acbf6a1dfb0c8724e60df314987315ccbf78bb6c0f9b6f3d568fe"
), ),
"BASE_KEY_SCRIPT_HASH":CardanoAddressParametersType( ),
"BASE_KEY_SCRIPT_HASH": CardanoAddressParametersType(
address_type=CardanoAddressType.BASE_KEY_SCRIPT, address_type=CardanoAddressType.BASE_KEY_SCRIPT,
address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0], address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
script_staking_hash=unhexlify("8d7bebc7a58f1c7b5fb7c9391071ecd3b51b032695522f8c555343a9"), script_staking_hash=unhexlify(
"8d7bebc7a58f1c7b5fb7c9391071ecd3b51b032695522f8c555343a9"
),
), ),
"BASE_SCRIPT_SCRIPT_HASHES": CardanoAddressParametersType( "BASE_SCRIPT_SCRIPT_HASHES": CardanoAddressParametersType(
address_type=CardanoAddressType.BASE_SCRIPT_SCRIPT, address_type=CardanoAddressType.BASE_SCRIPT_SCRIPT,
script_payment_hash=unhexlify("0d5acbf6a1dfb0c8724e60df314987315ccbf78bb6c0f9b6f3d568fe"), script_payment_hash=unhexlify(
script_staking_hash=unhexlify("8d7bebc7a58f1c7b5fb7c9391071ecd3b51b032695522f8c555343a9"), "0d5acbf6a1dfb0c8724e60df314987315ccbf78bb6c0f9b6f3d568fe"
),
script_staking_hash=unhexlify(
"8d7bebc7a58f1c7b5fb7c9391071ecd3b51b032695522f8c555343a9"
),
), ),
"POINTER1": CardanoAddressParametersType( "POINTER1": CardanoAddressParametersType(
address_type=CardanoAddressType.POINTER, address_type=CardanoAddressType.POINTER,
address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0], address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
certificate_pointer=CardanoBlockchainPointerType(block_index=1, tx_index=2, certificate_index=3), certificate_pointer=CardanoBlockchainPointerType(
block_index=1, tx_index=2, certificate_index=3
),
), ),
"POINTER2": CardanoAddressParametersType( "POINTER2": CardanoAddressParametersType(
address_type=CardanoAddressType.POINTER, address_type=CardanoAddressType.POINTER,
address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0], address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
certificate_pointer=CardanoBlockchainPointerType(block_index=24157, tx_index=177, certificate_index=42), certificate_pointer=CardanoBlockchainPointerType(
block_index=24157, tx_index=177, certificate_index=42
),
), ),
"POINTER_SCRIPT_HASH": CardanoAddressParametersType( "POINTER_SCRIPT_HASH": CardanoAddressParametersType(
address_type=CardanoAddressType.POINTER_SCRIPT, address_type=CardanoAddressType.POINTER_SCRIPT,
certificate_pointer=CardanoBlockchainPointerType(block_index=24157, tx_index=177, certificate_index=42), certificate_pointer=CardanoBlockchainPointerType(
script_payment_hash=unhexlify("0d5acbf6a1dfb0c8724e60df314987315ccbf78bb6c0f9b6f3d568fe"), block_index=24157, tx_index=177, certificate_index=42
),
script_payment_hash=unhexlify(
"0d5acbf6a1dfb0c8724e60df314987315ccbf78bb6c0f9b6f3d568fe"
),
), ),
"ENTERPRISE": CardanoAddressParametersType( "ENTERPRISE": CardanoAddressParametersType(
address_type=CardanoAddressType.ENTERPRISE, address_type=CardanoAddressType.ENTERPRISE,
@ -358,60 +447,201 @@ class TestCardanoAddress(unittest.TestCase):
), ),
"ENTERPRISE_SCRIPT_HASH": CardanoAddressParametersType( "ENTERPRISE_SCRIPT_HASH": CardanoAddressParametersType(
address_type=CardanoAddressType.ENTERPRISE_SCRIPT, address_type=CardanoAddressType.ENTERPRISE_SCRIPT,
script_payment_hash=unhexlify("0d5acbf6a1dfb0c8724e60df314987315ccbf78bb6c0f9b6f3d568fe"), script_payment_hash=unhexlify(
"0d5acbf6a1dfb0c8724e60df314987315ccbf78bb6c0f9b6f3d568fe"
),
), ),
"REWARD": CardanoAddressParametersType( "REWARD": CardanoAddressParametersType(
address_type=CardanoAddressType.REWARD, address_type=CardanoAddressType.REWARD,
address_n_staking=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 2, 0], address_n_staking=[
1852 | HARDENED,
1815 | HARDENED,
0 | HARDENED,
2,
0,
],
), ),
"REWARD_SCRIPT_HASH": CardanoAddressParametersType( "REWARD_SCRIPT_HASH": CardanoAddressParametersType(
address_type=CardanoAddressType.REWARD_SCRIPT, address_type=CardanoAddressType.REWARD_SCRIPT,
script_staking_hash=unhexlify("8d7bebc7a58f1c7b5fb7c9391071ecd3b51b032695522f8c555343a9"), script_staking_hash=unhexlify(
"8d7bebc7a58f1c7b5fb7c9391071ecd3b51b032695522f8c555343a9"
),
), ),
} }
test_vectors = [ test_vectors = [
# base address # base address
(network_ids.MAINNET, CardanoAddressType.BASE, address_parameters["BASE"], "addr1q8v42wjda8r6mpfj40d36znlgfdcqp7jtj03ah8skh6u8wnrqua2vw243tmjfjt0h5wsru6appuz8c0pfd75ur7myyeqsx9990"), (
(network_ids.TESTNET, CardanoAddressType.BASE, address_parameters["BASE"], "addr_test1qrv42wjda8r6mpfj40d36znlgfdcqp7jtj03ah8skh6u8wnrqua2vw243tmjfjt0h5wsru6appuz8c0pfd75ur7myyeqnsc9fs"), network_ids.MAINNET,
CardanoAddressType.BASE,
address_parameters["BASE"],
"addr1q8v42wjda8r6mpfj40d36znlgfdcqp7jtj03ah8skh6u8wnrqua2vw243tmjfjt0h5wsru6appuz8c0pfd75ur7myyeqsx9990",
),
(
network_ids.TESTNET,
CardanoAddressType.BASE,
address_parameters["BASE"],
"addr_test1qrv42wjda8r6mpfj40d36znlgfdcqp7jtj03ah8skh6u8wnrqua2vw243tmjfjt0h5wsru6appuz8c0pfd75ur7myyeqnsc9fs",
),
# base address with staking key hash # base address with staking key hash
(network_ids.MAINNET, CardanoAddressType.BASE, address_parameters["BASE_OWN_STAKING_KEY_HASH"], "addr1q8v42wjda8r6mpfj40d36znlgfdcqp7jtj03ah8skh6u8wsmcs5wgus8qt4atk45lvt4xfxpjtwfhdmvchdf2m3u3hlsydc62k"), (
(network_ids.TESTNET, CardanoAddressType.BASE, address_parameters["BASE_OWN_STAKING_KEY_HASH"], "addr_test1qrv42wjda8r6mpfj40d36znlgfdcqp7jtj03ah8skh6u8wsmcs5wgus8qt4atk45lvt4xfxpjtwfhdmvchdf2m3u3hls8m96xf"), network_ids.MAINNET,
(network_ids.MAINNET, CardanoAddressType.BASE, address_parameters["BASE_FOREIGN_STAKING_KEY_HASH_ACCOUNT_4"], "addr1q8v42wjda8r6mpfj40d36znlgfdcqp7jtj03ah8skh6u8wsj922xhxkn6twlq2wn4q50q352annk3903tj00h45mgfms06skxl"), CardanoAddressType.BASE,
(network_ids.MAINNET, CardanoAddressType.BASE, address_parameters["BASE_FOREIGN_STAKING_KEY_HASH_ACCOUNT_0"], "addr1qxq0nckg3ekgzuqg7w5p9mvgnd9ym28qh5grlph8xd2z92sj922xhxkn6twlq2wn4q50q352annk3903tj00h45mgfmsl3s9zt"), address_parameters["BASE_OWN_STAKING_KEY_HASH"],
(network_ids.TESTNET, CardanoAddressType.BASE, address_parameters["BASE_FOREIGN_STAKING_KEY_HASH_ACCOUNT_4"], "addr_test1qrv42wjda8r6mpfj40d36znlgfdcqp7jtj03ah8skh6u8wsj922xhxkn6twlq2wn4q50q352annk3903tj00h45mgfmsvvdk2q"), "addr1q8v42wjda8r6mpfj40d36znlgfdcqp7jtj03ah8skh6u8wsmcs5wgus8qt4atk45lvt4xfxpjtwfhdmvchdf2m3u3hlsydc62k",
),
(
network_ids.TESTNET,
CardanoAddressType.BASE,
address_parameters["BASE_OWN_STAKING_KEY_HASH"],
"addr_test1qrv42wjda8r6mpfj40d36znlgfdcqp7jtj03ah8skh6u8wsmcs5wgus8qt4atk45lvt4xfxpjtwfhdmvchdf2m3u3hls8m96xf",
),
(
network_ids.MAINNET,
CardanoAddressType.BASE,
address_parameters["BASE_FOREIGN_STAKING_KEY_HASH_ACCOUNT_4"],
"addr1q8v42wjda8r6mpfj40d36znlgfdcqp7jtj03ah8skh6u8wsj922xhxkn6twlq2wn4q50q352annk3903tj00h45mgfms06skxl",
),
(
network_ids.MAINNET,
CardanoAddressType.BASE,
address_parameters["BASE_FOREIGN_STAKING_KEY_HASH_ACCOUNT_0"],
"addr1qxq0nckg3ekgzuqg7w5p9mvgnd9ym28qh5grlph8xd2z92sj922xhxkn6twlq2wn4q50q352annk3903tj00h45mgfmsl3s9zt",
),
(
network_ids.TESTNET,
CardanoAddressType.BASE,
address_parameters["BASE_FOREIGN_STAKING_KEY_HASH_ACCOUNT_4"],
"addr_test1qrv42wjda8r6mpfj40d36znlgfdcqp7jtj03ah8skh6u8wsj922xhxkn6twlq2wn4q50q352annk3903tj00h45mgfmsvvdk2q",
),
# base_script_key address # base_script_key address
(network_ids.MAINNET, CardanoAddressType.BASE_SCRIPT_KEY, address_parameters["BASE_SCRIPT_KEY_SCRIPT_HASH"], "addr1zyx44jlk580mpjrjfesd7v2fsuc4ejlh3wmvp7dk702k3lsj922xhxkn6twlq2wn4q50q352annk3903tj00h45mgfmsf42dkl"), (
(network_ids.TESTNET, CardanoAddressType.BASE_SCRIPT_KEY, address_parameters["BASE_SCRIPT_KEY_SCRIPT_HASH"], "addr_test1zqx44jlk580mpjrjfesd7v2fsuc4ejlh3wmvp7dk702k3lsj922xhxkn6twlq2wn4q50q352annk3903tj00h45mgfms2rhd6q"), network_ids.MAINNET,
CardanoAddressType.BASE_SCRIPT_KEY,
address_parameters["BASE_SCRIPT_KEY_SCRIPT_HASH"],
"addr1zyx44jlk580mpjrjfesd7v2fsuc4ejlh3wmvp7dk702k3lsj922xhxkn6twlq2wn4q50q352annk3903tj00h45mgfmsf42dkl",
),
(
network_ids.TESTNET,
CardanoAddressType.BASE_SCRIPT_KEY,
address_parameters["BASE_SCRIPT_KEY_SCRIPT_HASH"],
"addr_test1zqx44jlk580mpjrjfesd7v2fsuc4ejlh3wmvp7dk702k3lsj922xhxkn6twlq2wn4q50q352annk3903tj00h45mgfms2rhd6q",
),
# base_key_script address # base_key_script address
(network_ids.MAINNET, CardanoAddressType.BASE_KEY_SCRIPT, address_parameters["BASE_KEY_SCRIPT_HASH"], "addr1yxq0nckg3ekgzuqg7w5p9mvgnd9ym28qh5grlph8xd2z925d004u0fv0r3a4ld7f8yg8rmxnk5dsxf542ghcc42ngw5s8vnrtt"), (
(network_ids.TESTNET, CardanoAddressType.BASE_KEY_SCRIPT, address_parameters["BASE_KEY_SCRIPT_HASH"], "addr_test1yzq0nckg3ekgzuqg7w5p9mvgnd9ym28qh5grlph8xd2z925d004u0fv0r3a4ld7f8yg8rmxnk5dsxf542ghcc42ngw5sy6wr85"), network_ids.MAINNET,
CardanoAddressType.BASE_KEY_SCRIPT,
address_parameters["BASE_KEY_SCRIPT_HASH"],
"addr1yxq0nckg3ekgzuqg7w5p9mvgnd9ym28qh5grlph8xd2z925d004u0fv0r3a4ld7f8yg8rmxnk5dsxf542ghcc42ngw5s8vnrtt",
),
(
network_ids.TESTNET,
CardanoAddressType.BASE_KEY_SCRIPT,
address_parameters["BASE_KEY_SCRIPT_HASH"],
"addr_test1yzq0nckg3ekgzuqg7w5p9mvgnd9ym28qh5grlph8xd2z925d004u0fv0r3a4ld7f8yg8rmxnk5dsxf542ghcc42ngw5sy6wr85",
),
# base_script_script address # base_script_script address
(network_ids.MAINNET, CardanoAddressType.BASE_SCRIPT_SCRIPT, address_parameters["BASE_SCRIPT_SCRIPT_HASHES"], "addr1xyx44jlk580mpjrjfesd7v2fsuc4ejlh3wmvp7dk702k3l5d004u0fv0r3a4ld7f8yg8rmxnk5dsxf542ghcc42ngw5s3gftll"), (
(network_ids.TESTNET, CardanoAddressType.BASE_SCRIPT_SCRIPT, address_parameters["BASE_SCRIPT_SCRIPT_HASHES"], "addr_test1xqx44jlk580mpjrjfesd7v2fsuc4ejlh3wmvp7dk702k3l5d004u0fv0r3a4ld7f8yg8rmxnk5dsxf542ghcc42ngw5sj75tnq"), network_ids.MAINNET,
CardanoAddressType.BASE_SCRIPT_SCRIPT,
address_parameters["BASE_SCRIPT_SCRIPT_HASHES"],
"addr1xyx44jlk580mpjrjfesd7v2fsuc4ejlh3wmvp7dk702k3l5d004u0fv0r3a4ld7f8yg8rmxnk5dsxf542ghcc42ngw5s3gftll",
),
(
network_ids.TESTNET,
CardanoAddressType.BASE_SCRIPT_SCRIPT,
address_parameters["BASE_SCRIPT_SCRIPT_HASHES"],
"addr_test1xqx44jlk580mpjrjfesd7v2fsuc4ejlh3wmvp7dk702k3l5d004u0fv0r3a4ld7f8yg8rmxnk5dsxf542ghcc42ngw5sj75tnq",
),
# pointer address # pointer address
(network_ids.MAINNET, CardanoAddressType.POINTER, address_parameters["POINTER1"], "addr1gxq0nckg3ekgzuqg7w5p9mvgnd9ym28qh5grlph8xd2z92spqgpsl97q83"), (
(network_ids.TESTNET, CardanoAddressType.POINTER, address_parameters["POINTER2"], "addr_test1gzq0nckg3ekgzuqg7w5p9mvgnd9ym28qh5grlph8xd2z925ph3wczvf2ag2x9t"), network_ids.MAINNET,
CardanoAddressType.POINTER,
address_parameters["POINTER1"],
"addr1gxq0nckg3ekgzuqg7w5p9mvgnd9ym28qh5grlph8xd2z92spqgpsl97q83",
),
(
network_ids.TESTNET,
CardanoAddressType.POINTER,
address_parameters["POINTER2"],
"addr_test1gzq0nckg3ekgzuqg7w5p9mvgnd9ym28qh5grlph8xd2z925ph3wczvf2ag2x9t",
),
# pointer_script address # pointer_script address
(network_ids.MAINNET, CardanoAddressType.POINTER_SCRIPT, address_parameters["POINTER_SCRIPT_HASH"], "addr12yx44jlk580mpjrjfesd7v2fsuc4ejlh3wmvp7dk702k3l5ph3wczvf2zmd4yp"), (
(network_ids.TESTNET, CardanoAddressType.POINTER_SCRIPT, address_parameters["POINTER_SCRIPT_HASH"], "addr_test12qx44jlk580mpjrjfesd7v2fsuc4ejlh3wmvp7dk702k3l5ph3wczvf2d4sugn"), network_ids.MAINNET,
CardanoAddressType.POINTER_SCRIPT,
address_parameters["POINTER_SCRIPT_HASH"],
"addr12yx44jlk580mpjrjfesd7v2fsuc4ejlh3wmvp7dk702k3l5ph3wczvf2zmd4yp",
),
(
network_ids.TESTNET,
CardanoAddressType.POINTER_SCRIPT,
address_parameters["POINTER_SCRIPT_HASH"],
"addr_test12qx44jlk580mpjrjfesd7v2fsuc4ejlh3wmvp7dk702k3l5ph3wczvf2d4sugn",
),
# enterprise address # enterprise address
(network_ids.MAINNET, CardanoAddressType.ENTERPRISE, address_parameters["ENTERPRISE"], "addr1vxq0nckg3ekgzuqg7w5p9mvgnd9ym28qh5grlph8xd2z92su77c6m"), (
(network_ids.TESTNET, CardanoAddressType.ENTERPRISE, address_parameters["ENTERPRISE"], "addr_test1vzq0nckg3ekgzuqg7w5p9mvgnd9ym28qh5grlph8xd2z92s8k2y47"), network_ids.MAINNET,
CardanoAddressType.ENTERPRISE,
address_parameters["ENTERPRISE"],
"addr1vxq0nckg3ekgzuqg7w5p9mvgnd9ym28qh5grlph8xd2z92su77c6m",
),
(
network_ids.TESTNET,
CardanoAddressType.ENTERPRISE,
address_parameters["ENTERPRISE"],
"addr_test1vzq0nckg3ekgzuqg7w5p9mvgnd9ym28qh5grlph8xd2z92s8k2y47",
),
# enterprise_script address # enterprise_script address
(network_ids.MAINNET, CardanoAddressType.ENTERPRISE_SCRIPT, address_parameters["ENTERPRISE_SCRIPT_HASH"], "addr1wyx44jlk580mpjrjfesd7v2fsuc4ejlh3wmvp7dk702k3lsqee7sp"), (
(network_ids.TESTNET, CardanoAddressType.ENTERPRISE_SCRIPT, address_parameters["ENTERPRISE_SCRIPT_HASH"], "addr_test1wqx44jlk580mpjrjfesd7v2fsuc4ejlh3wmvp7dk702k3lsm3dzly"), network_ids.MAINNET,
CardanoAddressType.ENTERPRISE_SCRIPT,
address_parameters["ENTERPRISE_SCRIPT_HASH"],
"addr1wyx44jlk580mpjrjfesd7v2fsuc4ejlh3wmvp7dk702k3lsqee7sp",
),
(
network_ids.TESTNET,
CardanoAddressType.ENTERPRISE_SCRIPT,
address_parameters["ENTERPRISE_SCRIPT_HASH"],
"addr_test1wqx44jlk580mpjrjfesd7v2fsuc4ejlh3wmvp7dk702k3lsm3dzly",
),
# reward address # reward address
(network_ids.MAINNET, CardanoAddressType.REWARD, address_parameters["REWARD"], "stake1uyfz49rtntfa9h0s98f6s28sg69weemgjhc4e8hm66d5yacalmqha"), (
(network_ids.TESTNET, CardanoAddressType.REWARD, address_parameters["REWARD"], "stake_test1uqfz49rtntfa9h0s98f6s28sg69weemgjhc4e8hm66d5yac643znq"), network_ids.MAINNET,
CardanoAddressType.REWARD,
address_parameters["REWARD"],
"stake1uyfz49rtntfa9h0s98f6s28sg69weemgjhc4e8hm66d5yacalmqha",
),
(
network_ids.TESTNET,
CardanoAddressType.REWARD,
address_parameters["REWARD"],
"stake_test1uqfz49rtntfa9h0s98f6s28sg69weemgjhc4e8hm66d5yac643znq",
),
# reward_script address # reward_script address
(network_ids.MAINNET, CardanoAddressType.REWARD_SCRIPT, address_parameters["REWARD_SCRIPT_HASH"], "stake17xxhh6785k83c76lklynjyr3anfm2xcry624ytuv24f582gt5mad4"), (
(network_ids.TESTNET, CardanoAddressType.REWARD_SCRIPT, address_parameters["REWARD_SCRIPT_HASH"], "stake_test17zxhh6785k83c76lklynjyr3anfm2xcry624ytuv24f582gv73lfg"), network_ids.MAINNET,
CardanoAddressType.REWARD_SCRIPT,
address_parameters["REWARD_SCRIPT_HASH"],
"stake17xxhh6785k83c76lklynjyr3anfm2xcry624ytuv24f582gt5mad4",
),
(
network_ids.TESTNET,
CardanoAddressType.REWARD_SCRIPT,
address_parameters["REWARD_SCRIPT_HASH"],
"stake_test17zxhh6785k83c76lklynjyr3anfm2xcry624ytuv24f582gv73lfg",
),
] ]
for (
for network_id, address_type, address_parameters, expected_address in test_vectors: network_id,
address_type,
address_parameters,
expected_address,
) in test_vectors:
validate_address_parameters(address_parameters) validate_address_parameters(address_parameters)
actual_address = derive_human_readable(self.keychain, address_parameters, protocol_magics.MAINNET, network_id) actual_address = derive_human_readable(
self.keychain, address_parameters, protocol_magics.MAINNET, network_id
)
self.assertEqual(actual_address, expected_address) self.assertEqual(actual_address, expected_address)
@ -428,34 +658,60 @@ class TestCardanoAddress(unittest.TestCase):
CardanoAddressParametersType( CardanoAddressParametersType(
address_type=CardanoAddressType.BASE, address_type=CardanoAddressType.BASE,
address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0], address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
address_n_staking=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 2, 0], address_n_staking=[
staking_key_hash=unhexlify("1bc428e4720702ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff"), 1852 | HARDENED,
1815 | HARDENED,
0 | HARDENED,
2,
0,
],
staking_key_hash=unhexlify(
"1bc428e4720702ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff"
),
), ),
# base address - staking_key_hash is too short # base address - staking_key_hash is too short
CardanoAddressParametersType( CardanoAddressParametersType(
address_type=CardanoAddressType.BASE, address_type=CardanoAddressType.BASE,
address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0], address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
address_n_staking=None, address_n_staking=None,
staking_key_hash=unhexlify("1bc428e4720702ebd5dab4fb175324c192dc9bb76cc5da956e3c8d"), staking_key_hash=unhexlify(
"1bc428e4720702ebd5dab4fb175324c192dc9bb76cc5da956e3c8d"
),
), ),
# base address - address_n_staking is not a staking path # base address - address_n_staking is not a staking path
CardanoAddressParametersType( CardanoAddressParametersType(
address_type=CardanoAddressType.BASE, address_type=CardanoAddressType.BASE,
address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0], address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
address_n_staking=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0], address_n_staking=[
1852 | HARDENED,
1815 | HARDENED,
0 | HARDENED,
0,
0,
],
staking_key_hash=None, staking_key_hash=None,
), ),
# base_script_key address - script_payment_hash is None # base_script_key address - script_payment_hash is None
CardanoAddressParametersType( CardanoAddressParametersType(
address_type=CardanoAddressType.BASE_SCRIPT_KEY, address_type=CardanoAddressType.BASE_SCRIPT_KEY,
script_payment_hash=None, script_payment_hash=None,
staking_key_hash=unhexlify("1bc428e4720702ebd5dab4fb175324c192dc9bb76cc5da956e3c8d"), staking_key_hash=unhexlify(
"1bc428e4720702ebd5dab4fb175324c192dc9bb76cc5da956e3c8d"
),
), ),
# base_script_key address - address_n_staking is not a staking path # base_script_key address - address_n_staking is not a staking path
CardanoAddressParametersType( CardanoAddressParametersType(
address_type=CardanoAddressType.BASE_SCRIPT_KEY, address_type=CardanoAddressType.BASE_SCRIPT_KEY,
script_payment_hash=unhexlify("0d5acbf6a1dfb0c8724e60df314987315ccbf78bb6c0f9b6f3d568fe"), script_payment_hash=unhexlify(
address_n_staking=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0], "0d5acbf6a1dfb0c8724e60df314987315ccbf78bb6c0f9b6f3d568fe"
),
address_n_staking=[
1852 | HARDENED,
1815 | HARDENED,
0 | HARDENED,
0,
0,
],
), ),
# base_key_script address - script_staking_hash is None # base_key_script address - script_staking_hash is None
CardanoAddressParametersType( CardanoAddressParametersType(
@ -467,12 +723,16 @@ class TestCardanoAddress(unittest.TestCase):
CardanoAddressParametersType( CardanoAddressParametersType(
address_type=CardanoAddressType.BASE_SCRIPT_SCRIPT, address_type=CardanoAddressType.BASE_SCRIPT_SCRIPT,
script_payment_hash=None, script_payment_hash=None,
script_staking_hash=unhexlify("8d7bebc7a58f1c7b5fb7c9391071ecd3b51b032695522f8c555343a9"), script_staking_hash=unhexlify(
"8d7bebc7a58f1c7b5fb7c9391071ecd3b51b032695522f8c555343a9"
),
), ),
# base_script_script address - script_staking and script_staking_hash are None # base_script_script address - script_staking and script_staking_hash are None
CardanoAddressParametersType( CardanoAddressParametersType(
address_type=CardanoAddressType.BASE_SCRIPT_SCRIPT, address_type=CardanoAddressType.BASE_SCRIPT_SCRIPT,
script_payment_hash=unhexlify("0d5acbf6a1dfb0c8724e60df314987315ccbf78bb6c0f9b6f3d568fe"), script_payment_hash=unhexlify(
"0d5acbf6a1dfb0c8724e60df314987315ccbf78bb6c0f9b6f3d568fe"
),
script_staking_hash=None, script_staking_hash=None,
), ),
# pointer address - pointer is None # pointer address - pointer is None
@ -484,14 +744,18 @@ class TestCardanoAddress(unittest.TestCase):
# pointer_script address - pointer is None # pointer_script address - pointer is None
CardanoAddressParametersType( CardanoAddressParametersType(
address_type=CardanoAddressType.POINTER_SCRIPT, address_type=CardanoAddressType.POINTER_SCRIPT,
script_payment_hash=unhexlify("0d5acbf6a1dfb0c8724e60df314987315ccbf78bb6c0f9b6f3d568fe"), script_payment_hash=unhexlify(
"0d5acbf6a1dfb0c8724e60df314987315ccbf78bb6c0f9b6f3d568fe"
),
certificate_pointer=None, certificate_pointer=None,
), ),
# pointer_script address - script_payment_script is None # pointer_script address - script_payment_script is None
CardanoAddressParametersType( CardanoAddressParametersType(
address_type=CardanoAddressType.POINTER_SCRIPT, address_type=CardanoAddressType.POINTER_SCRIPT,
script_payment_hash=None, script_payment_hash=None,
certificate_pointer=CardanoBlockchainPointerType(block_index=24157, tx_index=177, certificate_index=42), certificate_pointer=CardanoBlockchainPointerType(
block_index=24157, tx_index=177, certificate_index=42
),
), ),
# enterprise_script address - script_payment_hash is None # enterprise_script address - script_payment_hash is None
CardanoAddressParametersType( CardanoAddressParametersType(
@ -501,29 +765,34 @@ class TestCardanoAddress(unittest.TestCase):
# reward address - non staking path # reward address - non staking path
CardanoAddressParametersType( CardanoAddressParametersType(
address_type=CardanoAddressType.REWARD, address_type=CardanoAddressType.REWARD,
address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0] address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
), ),
# reward_script address - script_staking_hash is None # reward_script address - script_staking_hash is None
CardanoAddressParametersType( CardanoAddressParametersType(
address_type=CardanoAddressType.REWARD_SCRIPT, address_type=CardanoAddressType.REWARD_SCRIPT,
script_staking_hash=None, script_staking_hash=None,
), ),
# Shelley addresses with Byron namespace # Shelley addresses with Byron namespace
CardanoAddressParametersType( CardanoAddressParametersType(
address_type=CardanoAddressType.BASE, address_type=CardanoAddressType.BASE,
address_n=[44 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0], address_n=[44 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
staking_key_hash=unhexlify("1bc428e4720702ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff"), staking_key_hash=unhexlify(
"1bc428e4720702ebd5dab4fb175324c192dc9bb76cc5da956e3c8dff"
),
), ),
CardanoAddressParametersType( CardanoAddressParametersType(
address_type=CardanoAddressType.BASE_KEY_SCRIPT, address_type=CardanoAddressType.BASE_KEY_SCRIPT,
address_n=[44 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0], address_n=[44 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
script_staking_hash=unhexlify("8d7bebc7a58f1c7b5fb7c9391071ecd3b51b032695522f8c555343a9"), script_staking_hash=unhexlify(
"8d7bebc7a58f1c7b5fb7c9391071ecd3b51b032695522f8c555343a9"
),
), ),
CardanoAddressParametersType( CardanoAddressParametersType(
address_type=CardanoAddressType.POINTER, address_type=CardanoAddressType.POINTER,
address_n=[44 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0], address_n=[44 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
certificate_pointer=CardanoBlockchainPointerType(block_index=0, tx_index=0, certificate_index=0) certificate_pointer=CardanoBlockchainPointerType(
block_index=0, tx_index=0, certificate_index=0
),
), ),
CardanoAddressParametersType( CardanoAddressParametersType(
address_type=CardanoAddressType.ENTERPRISE, address_type=CardanoAddressType.ENTERPRISE,
@ -533,12 +802,11 @@ class TestCardanoAddress(unittest.TestCase):
address_type=CardanoAddressType.REWARD, address_type=CardanoAddressType.REWARD,
address_n=[44 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0], address_n=[44 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
), ),
# Byron address with Shelley namespace # Byron address with Shelley namespace
CardanoAddressParametersType( CardanoAddressParametersType(
address_type=CardanoAddressType.BYRON, address_type=CardanoAddressType.BYRON,
address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0], address_n=[1852 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0],
) ),
] ]
for address_parameters in test_vectors: for address_parameters in test_vectors:
@ -546,5 +814,5 @@ class TestCardanoAddress(unittest.TestCase):
validate_address_parameters(address_parameters) validate_address_parameters(address_parameters)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -2,19 +2,31 @@ from common import *
from apps.cardano.helpers import bech32 from apps.cardano.helpers import bech32
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin") @unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestCardanoBech32(unittest.TestCase): class TestCardanoBech32(unittest.TestCase):
def test_decode_and_encode(self): def test_decode_and_encode(self):
expected_bechs = [ expected_bechs = [
# human readable part, bech32 # human readable part, bech32
("a", "a12uel5l"), ("a", "a12uel5l"),
("an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio", (
"an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio1tt5tgs"), "an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio",
"an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio1tt5tgs",
),
("abcdef", "abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw"), ("abcdef", "abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw"),
("1", "11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j"), (
"1",
"11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j",
),
("split", "split1checkupstagehandshakeupstreamerranterredcaperred2y9e3w"), ("split", "split1checkupstagehandshakeupstreamerranterredcaperred2y9e3w"),
("addr", "addr1qzq0nckg3ekgzuqg7w5p9mvgnd9ym28qh5grlph8xd2z92sj922xhxkn6twlq2wn4q50q352annk3903tj00h45mgfmsw8ezsk"), (
("addr_test", "addr_test1qzq0nckg3ekgzuqg7w5p9mvgnd9ym28qh5grlph8xd2z92sj922xhxkn6twlq2wn4q50q352annk3903tj00h45mgfmsu8d9w5") "addr",
"addr1qzq0nckg3ekgzuqg7w5p9mvgnd9ym28qh5grlph8xd2z92sj922xhxkn6twlq2wn4q50q352annk3903tj00h45mgfmsw8ezsk",
),
(
"addr_test",
"addr_test1qzq0nckg3ekgzuqg7w5p9mvgnd9ym28qh5grlph8xd2z92sj922xhxkn6twlq2wn4q50q352annk3903tj00h45mgfmsu8d9w5",
),
] ]
for expected_human_readable_part, expected_bech in expected_bechs: for expected_human_readable_part, expected_bech in expected_bechs:

View File

@ -23,7 +23,6 @@ class TestCardanoGetPublicKey(unittest.TestCase):
[0x80000000 | 44, 0x80000000 | 1815], [0x80000000 | 44, 0x80000000 | 1815],
[0x80000000 | 44, 0x80000000 | 1815, 0, 0, 0], [0x80000000 | 44, 0x80000000 | 1815, 0, 0, 0],
[0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, 0], [0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, 0],
[0x80000000 | 1852, 0x80000000 | 1815, 0x80000000, 0, 0x80000000], [0x80000000 | 1852, 0x80000000 | 1815, 0x80000000, 0, 0x80000000],
[0x80000000 | 1852, 0x80000000 | 1815], [0x80000000 | 1852, 0x80000000 | 1815],
[0x80000000 | 1852, 0x80000000 | 1815, 0, 0, 0], [0x80000000 | 1852, 0x80000000 | 1815, 0, 0, 0],
@ -31,39 +30,36 @@ class TestCardanoGetPublicKey(unittest.TestCase):
] ]
public_keys = [ public_keys = [
b'a938c8554ae04616cfaae7cd0eb557475082c4e910242ce774967e0bd7492408', b"a938c8554ae04616cfaae7cd0eb557475082c4e910242ce774967e0bd7492408",
b'8c47ebce34234d04fd3dfbac33feaba6133e4e3d77c4b5ab18120ec6878ad4ce', b"8c47ebce34234d04fd3dfbac33feaba6133e4e3d77c4b5ab18120ec6878ad4ce",
b'17cc0bf978756d0d5c76f931629036a810c61801b78beecb44555773d13e3791', b"17cc0bf978756d0d5c76f931629036a810c61801b78beecb44555773d13e3791",
b'b90fb812a2268e9569ff1172e8daed1da3dc7e72c7bded7c5bcb7282039f90d5', b"b90fb812a2268e9569ff1172e8daed1da3dc7e72c7bded7c5bcb7282039f90d5",
b"f698a764b23aa6667b1157fc4247c6a1b58c21a3865ac6a47a3590167a9e0211",
b'f698a764b23aa6667b1157fc4247c6a1b58c21a3865ac6a47a3590167a9e0211', b"e9c46841be76e3be0289694fd5c7503c04f40e5b036abac200b98a9006cf6647",
b'e9c46841be76e3be0289694fd5c7503c04f40e5b036abac200b98a9006cf6647', b"6d225f078ca611f00d86cbfd8ba6c6ac7826721434eae6525686efb878b72370",
b'6d225f078ca611f00d86cbfd8ba6c6ac7826721434eae6525686efb878b72370', b"5d010cf16fdeff40955633d6c565f3844a288a24967cf6b76acbeb271b4f13c1",
b'5d010cf16fdeff40955633d6c565f3844a288a24967cf6b76acbeb271b4f13c1',
] ]
chain_codes = [ chain_codes = [
b'cbf6ab47c8eb1a0477fc40b25dbb6c4a99454edb97d6fe5acedd3e238ef46fe0', b"cbf6ab47c8eb1a0477fc40b25dbb6c4a99454edb97d6fe5acedd3e238ef46fe0",
b'02ac67c59a8b0264724a635774ca2c242afa10d7ab70e2bf0a8f7d4bb10f1f7a', b"02ac67c59a8b0264724a635774ca2c242afa10d7ab70e2bf0a8f7d4bb10f1f7a",
b'646ac4a6295326bae6831be05921edfbcb362de48dfd37b12e74c227dfad768d', b"646ac4a6295326bae6831be05921edfbcb362de48dfd37b12e74c227dfad768d",
b'fd8e71c1543de2cdc7f7623130c5f2cceb53549055fa1f5bc88199989e08cce7', b"fd8e71c1543de2cdc7f7623130c5f2cceb53549055fa1f5bc88199989e08cce7",
b"13cfb6de37a568aae56cadac907e6469b121464fe1b70a10c213eaea2cbb6636",
b'13cfb6de37a568aae56cadac907e6469b121464fe1b70a10c213eaea2cbb6636', b"58f3f46f4a93e7a4431e75b10af7497b747c3053cb7466ed53f4277e78a63c52",
b'58f3f46f4a93e7a4431e75b10af7497b747c3053cb7466ed53f4277e78a63c52', b"f72b3c361381db2d88289440268c94c5e7467c9414375e6b63d03026750f3c66",
b'f72b3c361381db2d88289440268c94c5e7467c9414375e6b63d03026750f3c66', b"f123474e140a2c360b01f0fa66f2f22e2e965a5b07a80358cf75f77abbd66088",
b'f123474e140a2c360b01f0fa66f2f22e2e965a5b07a80358cf75f77abbd66088',
] ]
xpub_keys = [ xpub_keys = [
'a938c8554ae04616cfaae7cd0eb557475082c4e910242ce774967e0bd7492408cbf6ab47c8eb1a0477fc40b25dbb6c4a99454edb97d6fe5acedd3e238ef46fe0', "a938c8554ae04616cfaae7cd0eb557475082c4e910242ce774967e0bd7492408cbf6ab47c8eb1a0477fc40b25dbb6c4a99454edb97d6fe5acedd3e238ef46fe0",
'8c47ebce34234d04fd3dfbac33feaba6133e4e3d77c4b5ab18120ec6878ad4ce02ac67c59a8b0264724a635774ca2c242afa10d7ab70e2bf0a8f7d4bb10f1f7a', "8c47ebce34234d04fd3dfbac33feaba6133e4e3d77c4b5ab18120ec6878ad4ce02ac67c59a8b0264724a635774ca2c242afa10d7ab70e2bf0a8f7d4bb10f1f7a",
'17cc0bf978756d0d5c76f931629036a810c61801b78beecb44555773d13e3791646ac4a6295326bae6831be05921edfbcb362de48dfd37b12e74c227dfad768d', "17cc0bf978756d0d5c76f931629036a810c61801b78beecb44555773d13e3791646ac4a6295326bae6831be05921edfbcb362de48dfd37b12e74c227dfad768d",
'b90fb812a2268e9569ff1172e8daed1da3dc7e72c7bded7c5bcb7282039f90d5fd8e71c1543de2cdc7f7623130c5f2cceb53549055fa1f5bc88199989e08cce7', "b90fb812a2268e9569ff1172e8daed1da3dc7e72c7bded7c5bcb7282039f90d5fd8e71c1543de2cdc7f7623130c5f2cceb53549055fa1f5bc88199989e08cce7",
"f698a764b23aa6667b1157fc4247c6a1b58c21a3865ac6a47a3590167a9e021113cfb6de37a568aae56cadac907e6469b121464fe1b70a10c213eaea2cbb6636",
'f698a764b23aa6667b1157fc4247c6a1b58c21a3865ac6a47a3590167a9e021113cfb6de37a568aae56cadac907e6469b121464fe1b70a10c213eaea2cbb6636', "e9c46841be76e3be0289694fd5c7503c04f40e5b036abac200b98a9006cf664758f3f46f4a93e7a4431e75b10af7497b747c3053cb7466ed53f4277e78a63c52",
'e9c46841be76e3be0289694fd5c7503c04f40e5b036abac200b98a9006cf664758f3f46f4a93e7a4431e75b10af7497b747c3053cb7466ed53f4277e78a63c52', "6d225f078ca611f00d86cbfd8ba6c6ac7826721434eae6525686efb878b72370f72b3c361381db2d88289440268c94c5e7467c9414375e6b63d03026750f3c66",
'6d225f078ca611f00d86cbfd8ba6c6ac7826721434eae6525686efb878b72370f72b3c361381db2d88289440268c94c5e7467c9414375e6b63d03026750f3c66', "5d010cf16fdeff40955633d6c565f3844a288a24967cf6b76acbeb271b4f13c1f123474e140a2c360b01f0fa66f2f22e2e965a5b07a80358cf75f77abbd66088",
'5d010cf16fdeff40955633d6c565f3844a288a24967cf6b76acbeb271b4f13c1f123474e140a2c360b01f0fa66f2f22e2e965a5b07a80358cf75f77abbd66088',
] ]
for index, derivation_path in enumerate(derivation_paths): for index, derivation_path in enumerate(derivation_paths):
@ -84,18 +80,18 @@ class TestCardanoGetPublicKey(unittest.TestCase):
] ]
public_keys = [ public_keys = [
b'82f12f1916c0c35a412291e72204f17f033b0b7edf148dfd7d75acd3975c9ac0', b"82f12f1916c0c35a412291e72204f17f033b0b7edf148dfd7d75acd3975c9ac0",
b'd92d0590e76bbf0300112a9f283fba2f7f8af5cf1054d634b610d1e4f541df90', b"d92d0590e76bbf0300112a9f283fba2f7f8af5cf1054d634b610d1e4f541df90",
] ]
chain_codes = [ chain_codes = [
b'974f9cd4336e23b976f934752026a2d4c32d2e23f0532f4f87152b45fa5ca81f', b"974f9cd4336e23b976f934752026a2d4c32d2e23f0532f4f87152b45fa5ca81f",
b'352499ed19b47f2bc8c164b47df0d55f428cc8c12f96b7e65d7563114ddfd75b', b"352499ed19b47f2bc8c164b47df0d55f428cc8c12f96b7e65d7563114ddfd75b",
] ]
xpub_keys = [ xpub_keys = [
'82f12f1916c0c35a412291e72204f17f033b0b7edf148dfd7d75acd3975c9ac0974f9cd4336e23b976f934752026a2d4c32d2e23f0532f4f87152b45fa5ca81f', "82f12f1916c0c35a412291e72204f17f033b0b7edf148dfd7d75acd3975c9ac0974f9cd4336e23b976f934752026a2d4c32d2e23f0532f4f87152b45fa5ca81f",
'd92d0590e76bbf0300112a9f283fba2f7f8af5cf1054d634b610d1e4f541df90352499ed19b47f2bc8c164b47df0d55f428cc8c12f96b7e65d7563114ddfd75b', "d92d0590e76bbf0300112a9f283fba2f7f8af5cf1054d634b610d1e4f541df90352499ed19b47f2bc8c164b47df0d55f428cc8c12f96b7e65d7563114ddfd75b",
] ]
for index, derivation_path in enumerate(derivation_paths): for index, derivation_path in enumerate(derivation_paths):
@ -105,7 +101,6 @@ class TestCardanoGetPublicKey(unittest.TestCase):
self.assertEqual(hexlify(key.node.chain_code), chain_codes[index]) self.assertEqual(hexlify(key.node.chain_code), chain_codes[index])
self.assertEqual(key.xpub, xpub_keys[index]) self.assertEqual(key.xpub, xpub_keys[index])
def test_get_public_key_scheme_24_words(self): def test_get_public_key_scheme_24_words(self):
mnemonic = "balance exotic ranch knife glory slow tape favorite yard gym awake ill exist useless parent aim pig stay effort into square gasp credit butter" mnemonic = "balance exotic ranch knife glory slow tape favorite yard gym awake ill exist useless parent aim pig stay effort into square gasp credit butter"
passphrase = "" passphrase = ""
@ -117,18 +112,18 @@ class TestCardanoGetPublicKey(unittest.TestCase):
] ]
public_keys = [ public_keys = [
b'9d45d1e979bd0b942adb1896019c85d08fbc562f012775a1f72fc7be8fe9e4b6', b"9d45d1e979bd0b942adb1896019c85d08fbc562f012775a1f72fc7be8fe9e4b6",
b'a85a339897354931d584f828f6d79d4227ed16f3468990687ab42f13a87c9ea8', b"a85a339897354931d584f828f6d79d4227ed16f3468990687ab42f13a87c9ea8",
] ]
chain_codes = [ chain_codes = [
b'aad67fd6d620f7af88ad816a229de09cfacff3e28008a528759b2e2cf28d859a', b"aad67fd6d620f7af88ad816a229de09cfacff3e28008a528759b2e2cf28d859a",
b'e6f844931e7e2ec724e6e62efde662ae2669355322dc3eb9b307bc1c8e75e219', b"e6f844931e7e2ec724e6e62efde662ae2669355322dc3eb9b307bc1c8e75e219",
] ]
xpub_keys = [ xpub_keys = [
'9d45d1e979bd0b942adb1896019c85d08fbc562f012775a1f72fc7be8fe9e4b6aad67fd6d620f7af88ad816a229de09cfacff3e28008a528759b2e2cf28d859a', "9d45d1e979bd0b942adb1896019c85d08fbc562f012775a1f72fc7be8fe9e4b6aad67fd6d620f7af88ad816a229de09cfacff3e28008a528759b2e2cf28d859a",
'a85a339897354931d584f828f6d79d4227ed16f3468990687ab42f13a87c9ea8e6f844931e7e2ec724e6e62efde662ae2669355322dc3eb9b307bc1c8e75e219', "a85a339897354931d584f828f6d79d4227ed16f3468990687ab42f13a87c9ea8e6f844931e7e2ec724e6e62efde662ae2669355322dc3eb9b307bc1c8e75e219",
] ]
for index, derivation_path in enumerate(derivation_paths): for index, derivation_path in enumerate(derivation_paths):
@ -138,7 +133,6 @@ class TestCardanoGetPublicKey(unittest.TestCase):
self.assertEqual(hexlify(key.node.chain_code), chain_codes[index]) self.assertEqual(hexlify(key.node.chain_code), chain_codes[index])
self.assertEqual(key.xpub, xpub_keys[index]) self.assertEqual(key.xpub, xpub_keys[index])
def test_slip39_128(self): def test_slip39_128(self):
mnemonics = [ mnemonics = [
"extra extend academic bishop cricket bundle tofu goat apart victim " "extra extend academic bishop cricket bundle tofu goat apart victim "
@ -146,7 +140,7 @@ class TestCardanoGetPublicKey(unittest.TestCase):
"extra extend academic acne away best indicate impact square oasis " "extra extend academic acne away best indicate impact square oasis "
"prospect painting voting guest either argue username racism enemy eclipse", "prospect painting voting guest either argue username racism enemy eclipse",
"extra extend academic arcade born dive legal hush gross briefing " "extra extend academic arcade born dive legal hush gross briefing "
"talent drug much home firefly toxic analysis idea umbrella slice" "talent drug much home firefly toxic analysis idea umbrella slice",
] ]
passphrase = b"TREZOR" passphrase = b"TREZOR"
identifier, exponent, ems = slip39.recover_ems(mnemonics) identifier, exponent, ems = slip39.recover_ems(mnemonics)
@ -160,25 +154,25 @@ class TestCardanoGetPublicKey(unittest.TestCase):
derivation_paths = [ derivation_paths = [
[0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, 0], [0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, 0],
[0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, 1], [0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, 1],
[0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, 2] [0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, 2],
] ]
public_keys = [ public_keys = [
b'bc043d84b8b891d49890edb6aced6f2d78395f255c5b6aea8878b913f83e8579', b"bc043d84b8b891d49890edb6aced6f2d78395f255c5b6aea8878b913f83e8579",
b'24c4fe188a39103db88818bc191fd8571eae7b284ebcbdf2462bde97b058a95c', b"24c4fe188a39103db88818bc191fd8571eae7b284ebcbdf2462bde97b058a95c",
b'831a63d381a8dab1e6e1ee991a4300fc70687aae5f97f4fcf92ed1b6c2bd99de' b"831a63d381a8dab1e6e1ee991a4300fc70687aae5f97f4fcf92ed1b6c2bd99de",
] ]
chain_codes = [ chain_codes = [
b"dc3f0d2b5cccb822335ef6213fd133f4ca934151ec44a6000aee43b8a101078c", b"dc3f0d2b5cccb822335ef6213fd133f4ca934151ec44a6000aee43b8a101078c",
b"6f7a744035f4b3ddb8f861c18446169643cc3ae85e271b4b4f0eda05cf84c65b", b"6f7a744035f4b3ddb8f861c18446169643cc3ae85e271b4b4f0eda05cf84c65b",
b"672d6af4707aba201b7940231e83dd357f92f8851b3dfdc224ef311e1b64cdeb" b"672d6af4707aba201b7940231e83dd357f92f8851b3dfdc224ef311e1b64cdeb",
] ]
xpub_keys = [ xpub_keys = [
"bc043d84b8b891d49890edb6aced6f2d78395f255c5b6aea8878b913f83e8579dc3f0d2b5cccb822335ef6213fd133f4ca934151ec44a6000aee43b8a101078c", "bc043d84b8b891d49890edb6aced6f2d78395f255c5b6aea8878b913f83e8579dc3f0d2b5cccb822335ef6213fd133f4ca934151ec44a6000aee43b8a101078c",
"24c4fe188a39103db88818bc191fd8571eae7b284ebcbdf2462bde97b058a95c6f7a744035f4b3ddb8f861c18446169643cc3ae85e271b4b4f0eda05cf84c65b", "24c4fe188a39103db88818bc191fd8571eae7b284ebcbdf2462bde97b058a95c6f7a744035f4b3ddb8f861c18446169643cc3ae85e271b4b4f0eda05cf84c65b",
"831a63d381a8dab1e6e1ee991a4300fc70687aae5f97f4fcf92ed1b6c2bd99de672d6af4707aba201b7940231e83dd357f92f8851b3dfdc224ef311e1b64cdeb" "831a63d381a8dab1e6e1ee991a4300fc70687aae5f97f4fcf92ed1b6c2bd99de672d6af4707aba201b7940231e83dd357f92f8851b3dfdc224ef311e1b64cdeb",
] ]
for index, derivation_path in enumerate(derivation_paths): for index, derivation_path in enumerate(derivation_paths):
@ -195,7 +189,7 @@ class TestCardanoGetPublicKey(unittest.TestCase):
"ladle lying voter typical security quantity hawk legs idle leaves gasoline", "ladle lying voter typical security quantity hawk legs idle leaves gasoline",
"hobo romp academic agency ancestor industry argue sister scene midst graduate " "hobo romp academic agency ancestor industry argue sister scene midst graduate "
"profile numb paid headset airport daisy flame express scene usual welcome " "profile numb paid headset airport daisy flame express scene usual welcome "
"quick silent downtown oral critical step remove says rhythm venture aunt" "quick silent downtown oral critical step remove says rhythm venture aunt",
] ]
passphrase = b"TREZOR" passphrase = b"TREZOR"
identifier, exponent, ems = slip39.recover_ems(mnemonics) identifier, exponent, ems = slip39.recover_ems(mnemonics)
@ -209,7 +203,7 @@ class TestCardanoGetPublicKey(unittest.TestCase):
derivation_paths = [ derivation_paths = [
[0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, 0], [0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, 0],
[0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, 1], [0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, 1],
[0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, 2] [0x80000000 | 44, 0x80000000 | 1815, 0x80000000, 0, 2],
] ]
public_keys = [ public_keys = [
@ -237,5 +231,6 @@ class TestCardanoGetPublicKey(unittest.TestCase):
self.assertEqual(hexlify(key.node.chain_code), chain_codes[index]) self.assertEqual(hexlify(key.node.chain_code), chain_codes[index])
self.assertEqual(key.xpub, xpub_keys[index]) self.assertEqual(key.xpub, xpub_keys[index])
if __name__ == '__main__':
if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -6,7 +6,10 @@ from trezor.messages import CardanoNativeScript
if not utils.BITCOIN_ONLY: if not utils.BITCOIN_ONLY:
from apps.cardano.seed import Keychain from apps.cardano.seed import Keychain
from apps.cardano.native_script import get_native_script_hash, validate_native_script from apps.cardano.native_script import (
get_native_script_hash,
validate_native_script,
)
VALID_NATIVE_SCRIPTS = [ VALID_NATIVE_SCRIPTS = [
# PUB_KEY # PUB_KEY
@ -68,7 +71,7 @@ VALID_NATIVE_SCRIPTS = [
# ALL scripts are empty # ALL scripts are empty
[ [
CardanoNativeScript(type=CardanoNativeScriptType.ALL, scripts=[]), CardanoNativeScript(type=CardanoNativeScriptType.ALL, scripts=[]),
b"d441227553a0f1a965fee7d60a0f724b368dd1bddbc208730fccebcf" b"d441227553a0f1a965fee7d60a0f724b368dd1bddbc208730fccebcf",
], ],
# ANY # ANY
[ [
@ -92,7 +95,7 @@ VALID_NATIVE_SCRIPTS = [
# ANY scripts are empty # ANY scripts are empty
[ [
CardanoNativeScript(type=CardanoNativeScriptType.ANY, scripts=[]), CardanoNativeScript(type=CardanoNativeScriptType.ANY, scripts=[]),
b"52dc3d43b6d2465e96109ce75ab61abe5e9c1d8a3c9ce6ff8a3af528" b"52dc3d43b6d2465e96109ce75ab61abe5e9c1d8a3c9ce6ff8a3af528",
], ],
# N OF K # N OF K
[ [
@ -122,8 +125,10 @@ VALID_NATIVE_SCRIPTS = [
], ],
# N_OF_K scripts are empty # N_OF_K scripts are empty
[ [
CardanoNativeScript(type=CardanoNativeScriptType.N_OF_K, required_signatures_count=0, scripts=[]), CardanoNativeScript(
b"3530cc9ae7f2895111a99b7a02184dd7c0cea7424f1632d73951b1d7" type=CardanoNativeScriptType.N_OF_K, required_signatures_count=0, scripts=[]
),
b"3530cc9ae7f2895111a99b7a02184dd7c0cea7424f1632d73951b1d7",
], ],
# INVALID BEFORE # INVALID BEFORE
[ [
@ -182,7 +187,13 @@ VALID_NATIVE_SCRIPTS = [
scripts=[ scripts=[
CardanoNativeScript( CardanoNativeScript(
type=CardanoNativeScriptType.PUB_KEY, type=CardanoNativeScriptType.PUB_KEY,
key_path=[1854 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0], key_path=[
1854 | HARDENED,
1815 | HARDENED,
0 | HARDENED,
0,
0,
],
), ),
CardanoNativeScript( CardanoNativeScript(
type=CardanoNativeScriptType.PUB_KEY, type=CardanoNativeScriptType.PUB_KEY,
@ -198,7 +209,13 @@ VALID_NATIVE_SCRIPTS = [
scripts=[ scripts=[
CardanoNativeScript( CardanoNativeScript(
type=CardanoNativeScriptType.PUB_KEY, type=CardanoNativeScriptType.PUB_KEY,
key_path=[1854 | HARDENED, 1815 | HARDENED, 0 | HARDENED, 0, 0], key_path=[
1854 | HARDENED,
1815 | HARDENED,
0 | HARDENED,
0,
0,
],
), ),
CardanoNativeScript( CardanoNativeScript(
type=CardanoNativeScriptType.PUB_KEY, type=CardanoNativeScriptType.PUB_KEY,

View File

@ -1,7 +1,10 @@
from common import * from common import *
if not utils.BITCOIN_ONLY: if not utils.BITCOIN_ONLY:
from apps.cardano.helpers.utils import variable_length_encode, format_asset_fingerprint from apps.cardano.helpers.utils import (
variable_length_encode,
format_asset_fingerprint,
)
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin") @unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
@ -23,7 +26,6 @@ class TestCardanoUtils(unittest.TestCase):
actual = variable_length_encode(number) actual = variable_length_encode(number)
self.assertEqual(actual, expected) self.assertEqual(actual, expected)
def test_variable_length_encode_negative_number(self): def test_variable_length_encode_negative_number(self):
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
variable_length_encode(-1) variable_length_encode(-1)
@ -31,15 +33,32 @@ class TestCardanoUtils(unittest.TestCase):
def test_format_asset_fingerprint(self): def test_format_asset_fingerprint(self):
# source: https://github.com/cardano-foundation/CIPs/pull/64 # source: https://github.com/cardano-foundation/CIPs/pull/64
test_vectors = [ test_vectors = [
(("7eae28af2208be856f7a119668ae52a49b73725e326dc16579dcc373", ""), "asset1rjklcrnsdzqp65wjgrg55sy9723kw09mlgvlc3"), (
(("7eae28af2208be856f7a119668ae52a49b73725e326dc16579dcc373", "504154415445"), "asset13n25uv0yaf5kus35fm2k86cqy60z58d9xmde92"), ("7eae28af2208be856f7a119668ae52a49b73725e326dc16579dcc373", ""),
(("1e349c9bdea19fd6c147626a5260bc44b71635f398b67c59881df209", "7eae28af2208be856f7a119668ae52a49b73725e326dc16579dcc373"), "asset1aqrdypg669jgazruv5ah07nuyqe0wxjhe2el6f"), "asset1rjklcrnsdzqp65wjgrg55sy9723kw09mlgvlc3",
),
(
(
"7eae28af2208be856f7a119668ae52a49b73725e326dc16579dcc373",
"504154415445",
),
"asset13n25uv0yaf5kus35fm2k86cqy60z58d9xmde92",
),
(
(
"1e349c9bdea19fd6c147626a5260bc44b71635f398b67c59881df209",
"7eae28af2208be856f7a119668ae52a49b73725e326dc16579dcc373",
),
"asset1aqrdypg669jgazruv5ah07nuyqe0wxjhe2el6f",
),
] ]
for params, expected in test_vectors: for params, expected in test_vectors:
actual = format_asset_fingerprint(policy_id=unhexlify(params[0]), asset_name_bytes=unhexlify(params[1])) actual = format_asset_fingerprint(
policy_id=unhexlify(params[0]), asset_name_bytes=unhexlify(params[1])
)
self.assertEqual(actual, expected) self.assertEqual(actual, expected)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -16,113 +16,112 @@ from apps.common.cbor import (
class TestCardanoCbor(unittest.TestCase): class TestCardanoCbor(unittest.TestCase):
def test_create_array_header(self): def test_create_array_header(self):
test_vectors = [ test_vectors = [
(0, '80'), (0, "80"),
(23, '97'), (23, "97"),
((2 ** 8) - 1, '98ff'), ((2**8) - 1, "98ff"),
((2 ** 16) - 1, '99ffff'), ((2**16) - 1, "99ffff"),
((2 ** 32) - 1, '9affffffff'), ((2**32) - 1, "9affffffff"),
((2 ** 64) - 1, '9bffffffffffffffff'), ((2**64) - 1, "9bffffffffffffffff"),
] ]
for val, header_hex in test_vectors: for val, header_hex in test_vectors:
header = unhexlify(header_hex) header = unhexlify(header_hex)
self.assertEqual(create_array_header(val), header) self.assertEqual(create_array_header(val), header)
with self.assertRaises(NotImplementedError): with self.assertRaises(NotImplementedError):
create_array_header(2 ** 64) create_array_header(2**64)
def test_create_map_header(self): def test_create_map_header(self):
test_vectors = [ test_vectors = [
(0, 'a0'), (0, "a0"),
(23, 'b7'), (23, "b7"),
((2 ** 8) - 1, 'b8ff'), ((2**8) - 1, "b8ff"),
((2 ** 16) - 1, 'b9ffff'), ((2**16) - 1, "b9ffff"),
((2 ** 32) - 1, 'baffffffff'), ((2**32) - 1, "baffffffff"),
((2 ** 64) - 1, 'bbffffffffffffffff'), ((2**64) - 1, "bbffffffffffffffff"),
] ]
for val, header_hex in test_vectors: for val, header_hex in test_vectors:
header = unhexlify(header_hex) header = unhexlify(header_hex)
self.assertEqual(create_map_header(val), header) self.assertEqual(create_map_header(val), header)
with self.assertRaises(NotImplementedError): with self.assertRaises(NotImplementedError):
create_map_header(2 ** 64) create_map_header(2**64)
def test_create_embedded_cbor_bytes_header(self): def test_create_embedded_cbor_bytes_header(self):
test_vectors = [ test_vectors = [
(0, 'd81840'), (0, "d81840"),
(23, 'd81857'), (23, "d81857"),
((2 ** 8) - 1, 'd81858ff'), ((2**8) - 1, "d81858ff"),
((2 ** 16) - 1, 'd81859ffff'), ((2**16) - 1, "d81859ffff"),
((2 ** 32) - 1, 'd8185affffffff'), ((2**32) - 1, "d8185affffffff"),
((2 ** 64) - 1, 'd8185bffffffffffffffff'), ((2**64) - 1, "d8185bffffffffffffffff"),
] ]
for val, header_hex in test_vectors: for val, header_hex in test_vectors:
header = unhexlify(header_hex) header = unhexlify(header_hex)
self.assertEqual(create_embedded_cbor_bytes_header(val), header) self.assertEqual(create_embedded_cbor_bytes_header(val), header)
with self.assertRaises(NotImplementedError): with self.assertRaises(NotImplementedError):
create_embedded_cbor_bytes_header(2 ** 64) create_embedded_cbor_bytes_header(2**64)
def test_cbor_encoding(self): def test_cbor_encoding(self):
test_vectors = [ test_vectors = [
# unsigned integers # unsigned integers
(0, '00'), (0, "00"),
(1, '01'), (1, "01"),
(10, '0a'), (10, "0a"),
(23, '17'), (23, "17"),
(24, '1818'), (24, "1818"),
(25, '1819'), (25, "1819"),
(100, '1864'), (100, "1864"),
(1000, '1903e8'), (1000, "1903e8"),
(1000000, '1a000f4240'), (1000000, "1a000f4240"),
(1000000000000, '1b000000e8d4a51000'), (1000000000000, "1b000000e8d4a51000"),
# negative integers # negative integers
(-1, '20'), (-1, "20"),
(-10, '29'), (-10, "29"),
(-24, '37'), (-24, "37"),
(-25, '3818'), (-25, "3818"),
(-26, '3819'), (-26, "3819"),
(-100, '3863'), (-100, "3863"),
(-1000, '3903E7'), (-1000, "3903E7"),
(-1000000, '3A000F423F'), (-1000000, "3A000F423F"),
(-1000000000000, '3B000000E8D4A50FFF'), (-1000000000000, "3B000000E8D4A50FFF"),
# binary strings # binary strings
(b'', '40'), (b"", "40"),
(unhexlify('01020304'), '4401020304'), (unhexlify("01020304"), "4401020304"),
# text strings # text strings
('', '60'), ("", "60"),
('Fun', '6346756e'), ("Fun", "6346756e"),
(u'P\u0159\xed\u0161ern\u011b \u017elu\u0165ou\u010dk\xfd k\u016f\u0148 \xfap\u011bl \u010f\xe1belsk\xe9 \xf3dy z\xe1ke\u0159n\xfd u\u010de\u0148 b\u011b\u017e\xed pod\xe9l z\xf3ny \xfal\u016f', '786550c599c3adc5a165726ec49b20c5be6c75c5a56f75c48d6bc3bd206bc5afc58820c3ba70c49b6c20c48fc3a162656c736bc3a920c3b36479207ac3a16b65c5996ec3bd2075c48d65c5882062c49bc5bec3ad20706f64c3a96c207ac3b36e7920c3ba6cc5af'), (
"P\u0159\xed\u0161ern\u011b \u017elu\u0165ou\u010dk\xfd k\u016f\u0148 \xfap\u011bl \u010f\xe1belsk\xe9 \xf3dy z\xe1ke\u0159n\xfd u\u010de\u0148 b\u011b\u017e\xed pod\xe9l z\xf3ny \xfal\u016f",
"786550c599c3adc5a165726ec49b20c5be6c75c5a56f75c48d6bc3bd206bc5afc58820c3ba70c49b6c20c48fc3a162656c736bc3a920c3b36479207ac3a16b65c5996ec3bd2075c48d65c5882062c49bc5bec3ad20706f64c3a96c207ac3b36e7920c3ba6cc5af",
),
# tags # tags
(Tagged(1, 1363896240), 'c11a514b67b0'), (Tagged(1, 1363896240), "c11a514b67b0"),
(Tagged(23, unhexlify('01020304')), 'd74401020304'), (Tagged(23, unhexlify("01020304")), "d74401020304"),
# arrays # arrays
([], '80'), ([], "80"),
([1, 2, 3], '83010203'), ([1, 2, 3], "83010203"),
([1, [2, 3], [4, 5]], '8301820203820405'), ([1, [2, 3], [4, 5]], "8301820203820405"),
(list(range(1, 26)), '98190102030405060708090a0b0c0d0e0f101112131415161718181819'), (
list(range(1, 26)),
"98190102030405060708090a0b0c0d0e0f101112131415161718181819",
),
# maps # maps
({}, 'a0'), ({}, "a0"),
({1: 2, 3: 4}, 'a201020304'), ({1: 2, 3: 4}, "a201020304"),
({3: 4, 1: 2}, 'a201020304'), ({3: 4, 1: 2}, "a201020304"),
# indefinite # indefinite
(IndefiniteLengthArray([]), '9fff'), (IndefiniteLengthArray([]), "9fff"),
(IndefiniteLengthArray([1, [2, 3], [4, 5]]), '9f01820203820405ff'), (IndefiniteLengthArray([1, [2, 3], [4, 5]]), "9f01820203820405ff"),
(IndefiniteLengthArray([1, [2, 3], IndefiniteLengthArray([4, 5])]), (
'9f018202039f0405ffff'), IndefiniteLengthArray([1, [2, 3], IndefiniteLengthArray([4, 5])]),
"9f018202039f0405ffff",
),
# boolean # boolean
(True, 'f5'), (True, "f5"),
(False, 'f4'), (False, "f4"),
# null # null
(None, 'f6'), (None, "f6"),
] ]
for val, encoded_hex in test_vectors: for val, encoded_hex in test_vectors:
encoded = unhexlify(encoded_hex) encoded = unhexlify(encoded_hex)
@ -134,10 +133,13 @@ class TestCardanoCbor(unittest.TestCase):
Tuples should be encoded as arrays and decoded back as lists. Tuples should be encoded as arrays and decoded back as lists.
""" """
test_vectors = [ test_vectors = [
([], '80'), ([], "80"),
([1, 2, 3], '83010203'), ([1, 2, 3], "83010203"),
([1, [2, 3], [4, 5]], '8301820203820405'), ([1, [2, 3], [4, 5]], "8301820203820405"),
(list(range(1, 26)), '98190102030405060708090a0b0c0d0e0f101112131415161718181819'), (
list(range(1, 26)),
"98190102030405060708090a0b0c0d0e0f101112131415161718181819",
),
] ]
for val, encoded_hex in test_vectors: for val, encoded_hex in test_vectors:
value_tuple = tuple(val) value_tuple = tuple(val)
@ -150,9 +152,9 @@ class TestCardanoCbor(unittest.TestCase):
OrderedMaps should be encoded as maps without any ordering and decoded back as dicts. OrderedMaps should be encoded as maps without any ordering and decoded back as dicts.
""" """
test_vectors = [ test_vectors = [
({}, 'a0'), ({}, "a0"),
([[1, 2], [3, 4]], 'a201020304'), ([[1, 2], [3, 4]], "a201020304"),
([[3, 4], [1, 2]], 'a203040102'), ([[3, 4], [1, 2]], "a203040102"),
] ]
for val, encoded_hex in test_vectors: for val, encoded_hex in test_vectors:
@ -168,12 +170,10 @@ class TestCardanoCbor(unittest.TestCase):
large_dict = {i: i for i in range(100)} large_dict = {i: i for i in range(100)}
encoded = encode(large_dict) encoded = encode(large_dict)
encoded_streamed = [ encoded_streamed = [bytes(item) for item in encode_streamed(large_dict)]
bytes(item) for item in encode_streamed(large_dict)
]
self.assertEqual(b''.join(encoded_streamed), encoded) self.assertEqual(b"".join(encoded_streamed), encoded)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -4,12 +4,11 @@ from apps.common import coins
class TestCoins(unittest.TestCase): class TestCoins(unittest.TestCase):
def test_bitcoin(self): def test_bitcoin(self):
ref = [ ref = [
('BTC', 'Bitcoin', 0), ("BTC", "Bitcoin", 0),
('TEST', 'Testnet', 111), ("TEST", "Testnet", 111),
('REGTEST', 'Regtest', 111), ("REGTEST", "Regtest", 111),
] ]
for s, n, a in ref: for s, n, a in ref:
c = coins.by_name(n) c = coins.by_name(n)
@ -19,11 +18,11 @@ class TestCoins(unittest.TestCase):
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin") @unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
def test_altcoins(self): def test_altcoins(self):
ref = [ ref = [
('NMC', 'Namecoin', 52), ("NMC", "Namecoin", 52),
('LTC', 'Litecoin', 48), ("LTC", "Litecoin", 48),
('DASH', 'Dash', 76), ("DASH", "Dash", 76),
('ZEC', 'Zcash', 7352), ("ZEC", "Zcash", 7352),
('TAZ', 'Zcash Testnet', 7461), ("TAZ", "Zcash Testnet", 7461),
] ]
for s, n, a in ref: for s, n, a in ref:
c = coins.by_name(n) c = coins.by_name(n)
@ -32,8 +31,8 @@ class TestCoins(unittest.TestCase):
def test_failure(self): def test_failure(self):
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
coins.by_name('XXXXX') coins.by_name("XXXXX")
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -51,7 +51,7 @@ class TestPathSchemas(unittest.TestCase):
ensure( ensure(
all(is_equal(a, b) for a, b in zip(schema_a.schema, schema_b.schema)) all(is_equal(a, b) for a, b in zip(schema_a.schema, schema_b.schema))
and is_equal(schema_a.trailing_components, schema_b.trailing_components), and is_equal(schema_a.trailing_components, schema_b.trailing_components),
f"Schemas differ:\nA = {repr(schema_a)}\nB = {repr(schema_b)}" f"Schemas differ:\nA = {repr(schema_a)}\nB = {repr(schema_b)}",
) )
def test_always_never_matching(self): def test_always_never_matching(self):

View File

@ -5,34 +5,49 @@ from apps.common.seed import Slip21Node
from trezor import wire from trezor import wire
from trezor.crypto import bip39 from trezor.crypto import bip39
class TestSeed(unittest.TestCase): class TestSeed(unittest.TestCase):
def test_slip21(self): def test_slip21(self):
seed = bip39.seed(' '.join(['all'] * 12), '') seed = bip39.seed(" ".join(["all"] * 12), "")
node1 = Slip21Node(seed) node1 = Slip21Node(seed)
node2 = node1.clone() node2 = node1.clone()
keychain = Keychain(seed, "", [], slip21_namespaces=[[b"SLIP-0021"]]) keychain = Keychain(seed, "", [], slip21_namespaces=[[b"SLIP-0021"]])
# Key(m) # Key(m)
KEY_M = unhexlify(b"dbf12b44133eaab506a740f6565cc117228cbf1dd70635cfa8ddfdc9af734756") KEY_M = unhexlify(
b"dbf12b44133eaab506a740f6565cc117228cbf1dd70635cfa8ddfdc9af734756"
)
self.assertEqual(node1.key(), KEY_M) self.assertEqual(node1.key(), KEY_M)
# Key(m/"SLIP-0021") # Key(m/"SLIP-0021")
KEY_M_SLIP0021 = unhexlify(b"1d065e3ac1bbe5c7fad32cf2305f7d709dc070d672044a19e610c77cdf33de0d") KEY_M_SLIP0021 = unhexlify(
b"1d065e3ac1bbe5c7fad32cf2305f7d709dc070d672044a19e610c77cdf33de0d"
)
node1.derive_path([b"SLIP-0021"]) node1.derive_path([b"SLIP-0021"])
self.assertEqual(node1.key(), KEY_M_SLIP0021) self.assertEqual(node1.key(), KEY_M_SLIP0021)
self.assertEqual(keychain.derive_slip21([b"SLIP-0021"]).key(), KEY_M_SLIP0021) self.assertEqual(keychain.derive_slip21([b"SLIP-0021"]).key(), KEY_M_SLIP0021)
# Key(m/"SLIP-0021"/"Master encryption key") # Key(m/"SLIP-0021"/"Master encryption key")
KEY_M_SLIP0021_MEK = unhexlify(b"ea163130e35bbafdf5ddee97a17b39cef2be4b4f390180d65b54cf05c6a82fde") KEY_M_SLIP0021_MEK = unhexlify(
b"ea163130e35bbafdf5ddee97a17b39cef2be4b4f390180d65b54cf05c6a82fde"
)
node1.derive_path([b"Master encryption key"]) node1.derive_path([b"Master encryption key"])
self.assertEqual(node1.key(), KEY_M_SLIP0021_MEK) self.assertEqual(node1.key(), KEY_M_SLIP0021_MEK)
self.assertEqual(keychain.derive_slip21([b"SLIP-0021", b"Master encryption key"]).key(), KEY_M_SLIP0021_MEK) self.assertEqual(
keychain.derive_slip21([b"SLIP-0021", b"Master encryption key"]).key(),
KEY_M_SLIP0021_MEK,
)
# Key(m/"SLIP-0021"/"Authentication key") # Key(m/"SLIP-0021"/"Authentication key")
KEY_M_SLIP0021_AK = unhexlify(b"47194e938ab24cc82bfa25f6486ed54bebe79c40ae2a5a32ea6db294d81861a6") KEY_M_SLIP0021_AK = unhexlify(
b"47194e938ab24cc82bfa25f6486ed54bebe79c40ae2a5a32ea6db294d81861a6"
)
node2.derive_path([b"SLIP-0021", b"Authentication key"]) node2.derive_path([b"SLIP-0021", b"Authentication key"])
self.assertEqual(node2.key(), KEY_M_SLIP0021_AK) self.assertEqual(node2.key(), KEY_M_SLIP0021_AK)
self.assertEqual(keychain.derive_slip21([b"SLIP-0021", b"Authentication key"]).key(), KEY_M_SLIP0021_AK) self.assertEqual(
keychain.derive_slip21([b"SLIP-0021", b"Authentication key"]).key(),
KEY_M_SLIP0021_AK,
)
# Forbidden paths. # Forbidden paths.
with self.assertRaises(wire.DataError): with self.assertRaises(wire.DataError):
@ -41,5 +56,5 @@ class TestSeed(unittest.TestCase):
keychain.derive_slip21([b"SLIP-9999", b"Authentication key"]) keychain.derive_slip21([b"SLIP-9999", b"Authentication key"])
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -26,7 +26,7 @@ class TestSeed(unittest.TestCase):
def test_write_uint64_le(self): def test_write_uint64_le(self):
buf = bytearray() buf = bytearray()
writers.write_uint64_le(buf, 0x1234567890abcdef) writers.write_uint64_le(buf, 0x1234567890ABCDEF)
self.assertEqual(buf, b"\xef\xcd\xab\x90\x78\x56\x34\x12") self.assertEqual(buf, b"\xef\xcd\xab\x90\x78\x56\x34\x12")
def test_write_uint32_be(self): def test_write_uint32_be(self):
@ -36,7 +36,7 @@ class TestSeed(unittest.TestCase):
def test_write_uint64_be(self): def test_write_uint64_be(self):
buf = bytearray() buf = bytearray()
writers.write_uint64_be(buf, 0x1234567890abcdef) writers.write_uint64_be(buf, 0x1234567890ABCDEF)
self.assertEqual(buf, b"\x12\x34\x56\x78\x90\xab\xcd\xef") self.assertEqual(buf, b"\x12\x34\x56\x78\x90\xab\xcd\xef")

View File

@ -9,44 +9,246 @@ if not utils.BITCOIN_ONLY:
class TestEosActions(unittest.TestCase): class TestEosActions(unittest.TestCase):
def test_check_action(self): def test_check_action(self):
# return True # return True
self.assertEqual(_check_action(EosTxActionAck(common=object(), buy_ram=object()), 'buyram', 'eosio'), True) self.assertEqual(
self.assertEqual(_check_action(EosTxActionAck(common=object(), buy_ram_bytes=object()), 'buyrambytes', 'eosio'), True) _check_action(
self.assertEqual(_check_action(EosTxActionAck(common=object(), sell_ram=object()), 'sellram', 'eosio'), True) EosTxActionAck(common=object(), buy_ram=object()), "buyram", "eosio"
self.assertEqual(_check_action(EosTxActionAck(common=object(), delegate=object()), 'delegatebw', 'eosio'), True) ),
self.assertEqual(_check_action(EosTxActionAck(common=object(), undelegate=object()), 'undelegatebw', 'eosio'), True) True,
self.assertEqual(_check_action(EosTxActionAck(common=object(), refund=object()), 'refund', 'eosio'), True) )
self.assertEqual(_check_action(EosTxActionAck(common=object(), vote_producer=object()), 'voteproducer', 'eosio'), True) self.assertEqual(
self.assertEqual(_check_action(EosTxActionAck(common=object(), update_auth=object()), 'updateauth', 'eosio'), True) _check_action(
self.assertEqual(_check_action(EosTxActionAck(common=object(), delete_auth=object()), 'deleteauth', 'eosio'), True) EosTxActionAck(common=object(), buy_ram_bytes=object()),
self.assertEqual(_check_action(EosTxActionAck(common=object(), link_auth=object()), 'linkauth', 'eosio'), True) "buyrambytes",
self.assertEqual(_check_action(EosTxActionAck(common=object(), unlink_auth=object()), 'unlinkauth', 'eosio'), True) "eosio",
self.assertEqual(_check_action(EosTxActionAck(common=object(), new_account=object()), 'newaccount', 'eosio'), True) ),
self.assertEqual(_check_action(EosTxActionAck(common=object(), transfer=object()), 'transfer', 'not_eosio'), True) True,
self.assertEqual(_check_action(EosTxActionAck(common=object(), unknown=[]), 'unknown', 'not_eosio'), True) )
self.assertEqual(_check_action(EosTxActionAck(common=object(), unknown=[]), 'buyram', 'buygoods'), True) self.assertEqual(
_check_action(
EosTxActionAck(common=object(), sell_ram=object()), "sellram", "eosio"
),
True,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), delegate=object()),
"delegatebw",
"eosio",
),
True,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), undelegate=object()),
"undelegatebw",
"eosio",
),
True,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), refund=object()), "refund", "eosio"
),
True,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), vote_producer=object()),
"voteproducer",
"eosio",
),
True,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), update_auth=object()),
"updateauth",
"eosio",
),
True,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), delete_auth=object()),
"deleteauth",
"eosio",
),
True,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), link_auth=object()), "linkauth", "eosio"
),
True,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), unlink_auth=object()),
"unlinkauth",
"eosio",
),
True,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), new_account=object()),
"newaccount",
"eosio",
),
True,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), transfer=object()),
"transfer",
"not_eosio",
),
True,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), unknown=[]), "unknown", "not_eosio"
),
True,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), unknown=[]), "buyram", "buygoods"
),
True,
)
# returns False # returns False
self.assertEqual(_check_action(EosTxActionAck(common=object(), buy_ram=object()), 'buyram', 'not_eosio'), False) self.assertEqual(
self.assertEqual(_check_action(EosTxActionAck(common=object()), 'buyram', 'eosio'), False) _check_action(
self.assertEqual(_check_action(EosTxActionAck(common=object(), buy_ram_bytes=object()), 'buyrambytes', 'not_eosio'), False) EosTxActionAck(common=object(), buy_ram=object()), "buyram", "not_eosio"
self.assertEqual(_check_action(EosTxActionAck(common=object(), sell_ram=object()), 'sellram', 'not_eosio'), False) ),
self.assertEqual(_check_action(EosTxActionAck(common=object(), delegate=object()), 'delegatebw', 'not_eosio'), False) False,
self.assertEqual(_check_action(EosTxActionAck(common=object(), undelegate=object()), 'undelegatebw', 'not_eosio'), False) )
self.assertEqual(_check_action(EosTxActionAck(common=object(), refund=object()), 'refund', 'not_eosio'), False) self.assertEqual(
self.assertEqual(_check_action(EosTxActionAck(common=object()), 'refund', 'eosio'), False) _check_action(EosTxActionAck(common=object()), "buyram", "eosio"), False
self.assertEqual(_check_action(EosTxActionAck(common=object(), vote_producer=object()), 'voteproducer', 'not_eosio'), False) )
self.assertEqual(_check_action(EosTxActionAck(common=object(), update_auth=object()), 'updateauth', 'not_eosio'), False) self.assertEqual(
self.assertEqual(_check_action(EosTxActionAck(common=object(), delete_auth=object()), 'deleteauth', 'not_eosio'), False) _check_action(
self.assertEqual(_check_action(EosTxActionAck(common=object(), link_auth=object()), 'linkauth', 'not_eosio'), False) EosTxActionAck(common=object(), buy_ram_bytes=object()),
self.assertEqual(_check_action(EosTxActionAck(common=object(), unlink_auth=object()), 'unlinkauth', 'not_eosio'), False) "buyrambytes",
self.assertEqual(_check_action(EosTxActionAck(common=object()), 'unlinkauth', 'eosio'), False) "not_eosio",
self.assertEqual(_check_action(EosTxActionAck(common=object(), new_account=object()), 'newaccount', 'not_eosio'), False) ),
self.assertEqual(_check_action(EosTxActionAck(common=object(), transfer=object()), 'transfer', 'eosio'), False) False,
self.assertEqual(_check_action(EosTxActionAck(common=object()), 'unknown', 'not_eosio'), False) )
self.assertEqual(_check_action(EosTxActionAck(common=object(), buy_ram=object()), 'test', 'eosio'), False) self.assertEqual(
self.assertEqual(_check_action(EosTxActionAck(common=object(), unknown=[]), 'buyram', 'eosio'), False) _check_action(
self.assertEqual(_check_action(EosTxActionAck(common=object(), unknown=[]), 'transfer', 'loveme'), False) EosTxActionAck(common=object(), sell_ram=object()),
"sellram",
"not_eosio",
),
False,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), delegate=object()),
"delegatebw",
"not_eosio",
),
False,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), undelegate=object()),
"undelegatebw",
"not_eosio",
),
False,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), refund=object()), "refund", "not_eosio"
),
False,
)
self.assertEqual(
_check_action(EosTxActionAck(common=object()), "refund", "eosio"), False
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), vote_producer=object()),
"voteproducer",
"not_eosio",
),
False,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), update_auth=object()),
"updateauth",
"not_eosio",
),
False,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), delete_auth=object()),
"deleteauth",
"not_eosio",
),
False,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), link_auth=object()),
"linkauth",
"not_eosio",
),
False,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), unlink_auth=object()),
"unlinkauth",
"not_eosio",
),
False,
)
self.assertEqual(
_check_action(EosTxActionAck(common=object()), "unlinkauth", "eosio"), False
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), new_account=object()),
"newaccount",
"not_eosio",
),
False,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), transfer=object()), "transfer", "eosio"
),
False,
)
self.assertEqual(
_check_action(EosTxActionAck(common=object()), "unknown", "not_eosio"),
False,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), buy_ram=object()), "test", "eosio"
),
False,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), unknown=[]), "buyram", "eosio"
),
False,
)
self.assertEqual(
_check_action(
EosTxActionAck(common=object(), unknown=[]), "transfer", "loveme"
),
False,
)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -17,12 +17,12 @@ class TestEosConversions(unittest.TestCase):
595056260442243600, 595056260442243600,
] ]
names_out = [ names_out = [
'miniminimini', "miniminimini",
'12345abcdefg', "12345abcdefg",
'123451234512', "123451234512",
'hijklmnopqrs', "hijklmnopqrs",
'tuvwxyz12345', "tuvwxyz12345",
'111111111111', "111111111111",
] ]
for i, o in zip(names_in, names_out): for i, o in zip(names_in, names_out):
self.assertEqual(helpers.eos_name_to_string(i), o) self.assertEqual(helpers.eos_name_to_string(i), o)
@ -55,15 +55,16 @@ class TestEosConversions(unittest.TestCase):
), ),
] ]
asset_out = [ asset_out = [
'1.0000 EOS', "1.0000 EOS",
'20.0000 EOS', "20.0000 EOS",
'25.5000 EOS', "25.5000 EOS",
'999.999 EOS', "999.999 EOS",
'0.0001 EOS', "0.0001 EOS",
'0.999 EOS', "0.999 EOS",
] ]
for i, o in zip(asset_in, asset_out): for i, o in zip(asset_in, asset_out):
self.assertEqual(helpers.eos_asset_to_string(i), o) self.assertEqual(helpers.eos_asset_to_string(i), o)
if __name__ == '__main__':
if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -19,7 +19,7 @@ def _get_public_key(node: bip32.HDNode) -> tuple[str, bytes]:
class TestEosGetPublicKey(unittest.TestCase): class TestEosGetPublicKey(unittest.TestCase):
def test_get_public_key_scheme(self): def test_get_public_key_scheme(self):
mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
seed = bip39.seed(mnemonic, '') seed = bip39.seed(mnemonic, "")
derivation_paths = [ derivation_paths = [
[0x80000000 | 44, 0x80000000 | 194, 0x80000000, 0, 0], [0x80000000 | 44, 0x80000000 | 194, 0x80000000, 0, 0],
@ -29,21 +29,21 @@ class TestEosGetPublicKey(unittest.TestCase):
] ]
public_keys = [ public_keys = [
b'0315c358024ce46767102578947584c4342a6982b922d454f63588effa34597197', b"0315c358024ce46767102578947584c4342a6982b922d454f63588effa34597197",
b'029622eff7248c4d298fe28f2df19ee0d5f7674f678844e05c31d1a5632412869e', b"029622eff7248c4d298fe28f2df19ee0d5f7674f678844e05c31d1a5632412869e",
b'02625f33c10399703e95e41bd5054beef3ab893dcc7df2bb9bdcee48359b29069d', b"02625f33c10399703e95e41bd5054beef3ab893dcc7df2bb9bdcee48359b29069d",
b'037c9b7d24d42589941cca3f4debc75b37c0e7b881e6eb00d2e674958debe3bbc3', b"037c9b7d24d42589941cca3f4debc75b37c0e7b881e6eb00d2e674958debe3bbc3",
] ]
wif_keys = [ wif_keys = [
'EOS6zpSNY1YoLxNt2VsvJjoDfBueU6xC1M1ERJw1UoekL1NHn8KNA', "EOS6zpSNY1YoLxNt2VsvJjoDfBueU6xC1M1ERJw1UoekL1NHn8KNA",
'EOS62cPUiWnLqbUjiBMxbEU4pm4Hp5X3RGk4KMTadvZNygjX72yHW', "EOS62cPUiWnLqbUjiBMxbEU4pm4Hp5X3RGk4KMTadvZNygjX72yHW",
'EOS5dp8aCFoFwrKo6KuUfos1hwMfZGkiZUbaF2CyuD4chyBEN2wQK', "EOS5dp8aCFoFwrKo6KuUfos1hwMfZGkiZUbaF2CyuD4chyBEN2wQK",
'EOS7n7TXwR4Y3DtPt2ji6akhQi5uw4SruuPArvoNJso84vhwPQt1G', "EOS7n7TXwR4Y3DtPt2ji6akhQi5uw4SruuPArvoNJso84vhwPQt1G",
] ]
for index, path in enumerate(derivation_paths): for index, path in enumerate(derivation_paths):
node = bip32.from_seed(seed, 'secp256k1') node = bip32.from_seed(seed, "secp256k1")
node.derive_path(path) node.derive_path(path)
wif, public_key = _get_public_key(node) wif, public_key = _get_public_key(node)
@ -52,5 +52,5 @@ class TestEosGetPublicKey(unittest.TestCase):
self.assertEqual(public_key_to_wif(public_key), wif_keys[index]) self.assertEqual(public_key_to_wif(public_key), wif_keys[index])
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -8,16 +8,19 @@ if not utils.BITCOIN_ONLY:
class TestEthereumTokens(unittest.TestCase): class TestEthereumTokens(unittest.TestCase):
def test_token_by_chain_address(self): def test_token_by_chain_address(self):
token = tokens.token_by_chain_address(1, b"\x7f\xc6\x65\x00\xc8\x4a\x76\xad\x7e\x9c\x93\x43\x7b\xfc\x5a\xc3\x3e\x2d\xda\xe9") token = tokens.token_by_chain_address(
self.assertEqual(token.symbol, 'AAVE') 1,
b"\x7f\xc6\x65\x00\xc8\x4a\x76\xad\x7e\x9c\x93\x43\x7b\xfc\x5a\xc3\x3e\x2d\xda\xe9",
)
self.assertEqual(token.symbol, "AAVE")
# invalid adress, invalid chain # invalid adress, invalid chain
token = tokens.token_by_chain_address(999, b'\x00\xFF') token = tokens.token_by_chain_address(999, b"\x00\xFF")
self.assertIs(token, None) self.assertIs(token, None)
self.assertEqual(tokens.UNKNOWN_TOKEN.symbol, 'Wei UNKN') self.assertEqual(tokens.UNKNOWN_TOKEN.symbol, "Wei UNKN")
self.assertEqual(tokens.UNKNOWN_TOKEN.decimals, 0) self.assertEqual(tokens.UNKNOWN_TOKEN.decimals, 0)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -5,7 +5,12 @@ import storage
import storage.recovery import storage.recovery
from apps.management.recovery_device.recover import process_slip39 from apps.management.recovery_device.recover import process_slip39
from trezor.enums import BackupType from trezor.enums import BackupType
from apps.management.recovery_device.word_validity import check, IdentifierMismatch, AlreadyAdded, ThresholdReached from apps.management.recovery_device.word_validity import (
check,
IdentifierMismatch,
AlreadyAdded,
ThresholdReached,
)
MNEMONIC_SLIP39_BASIC_20_3of6 = [ MNEMONIC_SLIP39_BASIC_20_3of6 = [
"extra extend academic bishop cricket bundle tofu goat apart victim enlarge program behavior permit course armed jerky faint language modern", "extra extend academic bishop cricket bundle tofu goat apart victim enlarge program behavior permit course armed jerky faint language modern",
@ -27,7 +32,6 @@ MNEMONIC_SLIP39_ADVANCED_33 = [
class TestSlip39(unittest.TestCase): class TestSlip39(unittest.TestCase):
@mock_storage @mock_storage
def test_process_slip39_basic(self): def test_process_slip39_basic(self):
storage.recovery.set_in_progress(True) storage.recovery.set_in_progress(True)
@ -37,26 +41,39 @@ class TestSlip39(unittest.TestCase):
secret, share = process_slip39(first) secret, share = process_slip39(first)
self.assertIsNone(secret) self.assertIsNone(secret)
self.assertEqual(share.group_count, storage.recovery.get_slip39_group_count()) self.assertEqual(share.group_count, storage.recovery.get_slip39_group_count())
self.assertEqual(share.iteration_exponent, storage.recovery.get_slip39_iteration_exponent()) self.assertEqual(
share.iteration_exponent, storage.recovery.get_slip39_iteration_exponent()
)
self.assertEqual(share.identifier, storage.recovery.get_slip39_identifier()) self.assertEqual(share.identifier, storage.recovery.get_slip39_identifier())
self.assertEqual(storage.recovery.get_slip39_remaining_shares(0), 2) self.assertEqual(storage.recovery.get_slip39_remaining_shares(0), 2)
self.assertEqual(storage.recovery_shares.get(share.index, share.group_index), first) self.assertEqual(
storage.recovery_shares.get(share.index, share.group_index), first
)
# second share (member index 0) # second share (member index 0)
second = MNEMONIC_SLIP39_BASIC_20_3of6[1] second = MNEMONIC_SLIP39_BASIC_20_3of6[1]
secret, share = process_slip39(second) secret, share = process_slip39(second)
self.assertIsNone(secret) self.assertIsNone(secret)
self.assertEqual(storage.recovery.get_slip39_remaining_shares(0), 1) self.assertEqual(storage.recovery.get_slip39_remaining_shares(0), 1)
self.assertEqual(storage.recovery_shares.get(share.index, share.group_index), second) self.assertEqual(
self.assertEqual(storage.recovery_shares.fetch_group(share.group_index), [second, first]) # ordered by index storage.recovery_shares.get(share.index, share.group_index), second
)
self.assertEqual(
storage.recovery_shares.fetch_group(share.group_index), [second, first]
) # ordered by index
# third share (member index 3) # third share (member index 3)
third = MNEMONIC_SLIP39_BASIC_20_3of6[2] third = MNEMONIC_SLIP39_BASIC_20_3of6[2]
secret, share = process_slip39(third) secret, share = process_slip39(third)
self.assertEqual(secret, b'I\x1by[\x80\xfc!\xcc\xdfFl\x0f\xbc\x98\xc8\xfc') self.assertEqual(secret, b"I\x1by[\x80\xfc!\xcc\xdfFl\x0f\xbc\x98\xc8\xfc")
self.assertEqual(storage.recovery.get_slip39_remaining_shares(0), 0) self.assertEqual(storage.recovery.get_slip39_remaining_shares(0), 0)
self.assertEqual(storage.recovery_shares.get(share.index, share.group_index), third) self.assertEqual(
self.assertEqual(storage.recovery_shares.fetch_group(share.group_index), [second, third, first]) # ordered by index storage.recovery_shares.get(share.index, share.group_index), third
)
self.assertEqual(
storage.recovery_shares.fetch_group(share.group_index),
[second, third, first],
) # ordered by index
@mock_storage @mock_storage
def test_process_slip39_advanced(self): def test_process_slip39_advanced(self):
@ -67,47 +84,89 @@ class TestSlip39(unittest.TestCase):
secret, share = process_slip39(words) secret, share = process_slip39(words)
self.assertIsNone(secret) self.assertIsNone(secret)
self.assertEqual(share.group_count, storage.recovery.get_slip39_group_count()) self.assertEqual(share.group_count, storage.recovery.get_slip39_group_count())
self.assertEqual(share.iteration_exponent, storage.recovery.get_slip39_iteration_exponent()) self.assertEqual(
share.iteration_exponent, storage.recovery.get_slip39_iteration_exponent()
)
self.assertEqual(share.identifier, storage.recovery.get_slip39_identifier()) self.assertEqual(share.identifier, storage.recovery.get_slip39_identifier())
self.assertEqual(storage.recovery.fetch_slip39_remaining_shares(), [16, 0, 16, 16]) self.assertEqual(
self.assertEqual(storage.recovery_shares.get(share.index, share.group_index), words) storage.recovery.fetch_slip39_remaining_shares(), [16, 0, 16, 16]
)
self.assertEqual(
storage.recovery_shares.get(share.index, share.group_index), words
)
# member index 4 from group 2 (3of5) # member index 4 from group 2 (3of5)
words = MNEMONIC_SLIP39_ADVANCED_20[1] words = MNEMONIC_SLIP39_ADVANCED_20[1]
secret, share = process_slip39(words) secret, share = process_slip39(words)
self.assertIsNone(secret) self.assertIsNone(secret)
self.assertEqual(share.group_count, storage.recovery.get_slip39_group_count()) self.assertEqual(share.group_count, storage.recovery.get_slip39_group_count())
self.assertEqual(share.iteration_exponent, storage.recovery.get_slip39_iteration_exponent()) self.assertEqual(
share.iteration_exponent, storage.recovery.get_slip39_iteration_exponent()
)
self.assertEqual(share.identifier, storage.recovery.get_slip39_identifier()) self.assertEqual(share.identifier, storage.recovery.get_slip39_identifier())
self.assertEqual(storage.recovery_shares.get(share.index, share.group_index), words) self.assertEqual(
self.assertEqual(storage.recovery_shares.fetch_group(1), [MNEMONIC_SLIP39_ADVANCED_20[0]]) storage.recovery_shares.get(share.index, share.group_index), words
self.assertEqual(storage.recovery_shares.fetch_group(2), [MNEMONIC_SLIP39_ADVANCED_20[1]]) )
self.assertEqual(storage.recovery.fetch_slip39_remaining_shares(), [16, 0, 2, 16]) self.assertEqual(
storage.recovery_shares.fetch_group(1), [MNEMONIC_SLIP39_ADVANCED_20[0]]
)
self.assertEqual(
storage.recovery_shares.fetch_group(2), [MNEMONIC_SLIP39_ADVANCED_20[1]]
)
self.assertEqual(
storage.recovery.fetch_slip39_remaining_shares(), [16, 0, 2, 16]
)
# member index 2 from group 2 # member index 2 from group 2
words = MNEMONIC_SLIP39_ADVANCED_20[2] words = MNEMONIC_SLIP39_ADVANCED_20[2]
secret, share = process_slip39(words) secret, share = process_slip39(words)
self.assertIsNone(secret) self.assertIsNone(secret)
self.assertEqual(share.group_count, storage.recovery.get_slip39_group_count()) self.assertEqual(share.group_count, storage.recovery.get_slip39_group_count())
self.assertEqual(share.iteration_exponent, storage.recovery.get_slip39_iteration_exponent()) self.assertEqual(
share.iteration_exponent, storage.recovery.get_slip39_iteration_exponent()
)
self.assertEqual(share.identifier, storage.recovery.get_slip39_identifier()) self.assertEqual(share.identifier, storage.recovery.get_slip39_identifier())
self.assertEqual(storage.recovery_shares.get(share.index, share.group_index), words) self.assertEqual(
self.assertEqual(storage.recovery_shares.fetch_group(1), [MNEMONIC_SLIP39_ADVANCED_20[0]]) storage.recovery_shares.get(share.index, share.group_index), words
self.assertEqual(storage.recovery_shares.fetch_group(2), [MNEMONIC_SLIP39_ADVANCED_20[2], MNEMONIC_SLIP39_ADVANCED_20[1]]) )
self.assertEqual(storage.recovery.fetch_slip39_remaining_shares(), [16, 0, 1, 16]) self.assertEqual(
storage.recovery_shares.fetch_group(1), [MNEMONIC_SLIP39_ADVANCED_20[0]]
)
self.assertEqual(
storage.recovery_shares.fetch_group(2),
[MNEMONIC_SLIP39_ADVANCED_20[2], MNEMONIC_SLIP39_ADVANCED_20[1]],
)
self.assertEqual(
storage.recovery.fetch_slip39_remaining_shares(), [16, 0, 1, 16]
)
# last member index 0 from group 2 # last member index 0 from group 2
# now group 2 is complete => the whole Shamir recovery is completed # now group 2 is complete => the whole Shamir recovery is completed
words = MNEMONIC_SLIP39_ADVANCED_20[3] words = MNEMONIC_SLIP39_ADVANCED_20[3]
secret, share = process_slip39(words) secret, share = process_slip39(words)
self.assertEqual(secret, b'\xc2\xd2\xe2j\xd0`#\xc6\x01E\xf1P\xab\xe2\xdd+') self.assertEqual(secret, b"\xc2\xd2\xe2j\xd0`#\xc6\x01E\xf1P\xab\xe2\xdd+")
self.assertEqual(share.group_count, storage.recovery.get_slip39_group_count()) self.assertEqual(share.group_count, storage.recovery.get_slip39_group_count())
self.assertEqual(share.iteration_exponent, storage.recovery.get_slip39_iteration_exponent()) self.assertEqual(
share.iteration_exponent, storage.recovery.get_slip39_iteration_exponent()
)
self.assertEqual(share.identifier, storage.recovery.get_slip39_identifier()) self.assertEqual(share.identifier, storage.recovery.get_slip39_identifier())
self.assertEqual(storage.recovery_shares.get(share.index, share.group_index), words) self.assertEqual(
self.assertEqual(storage.recovery_shares.fetch_group(1), [MNEMONIC_SLIP39_ADVANCED_20[0]]) storage.recovery_shares.get(share.index, share.group_index), words
self.assertEqual(storage.recovery_shares.fetch_group(2), [MNEMONIC_SLIP39_ADVANCED_20[3], MNEMONIC_SLIP39_ADVANCED_20[2], MNEMONIC_SLIP39_ADVANCED_20[1]]) )
self.assertEqual(storage.recovery.fetch_slip39_remaining_shares(), [16, 0, 0, 16]) self.assertEqual(
storage.recovery_shares.fetch_group(1), [MNEMONIC_SLIP39_ADVANCED_20[0]]
)
self.assertEqual(
storage.recovery_shares.fetch_group(2),
[
MNEMONIC_SLIP39_ADVANCED_20[3],
MNEMONIC_SLIP39_ADVANCED_20[2],
MNEMONIC_SLIP39_ADVANCED_20[1],
],
)
self.assertEqual(
storage.recovery.fetch_slip39_remaining_shares(), [16, 0, 0, 16]
)
@mock_storage @mock_storage
def test_exceptions(self): def test_exceptions(self):
@ -157,9 +216,13 @@ class TestSlip39(unittest.TestCase):
check(BackupType.Bip39, ["ocean"]) check(BackupType.Bip39, ["ocean"])
# let's store two shares in the storage # let's store two shares in the storage
secret, share = process_slip39("trash smug adjust ambition criminal prisoner security math cover pecan response pharmacy center criminal salary elbow bracelet lunar briefing dragon") secret, share = process_slip39(
"trash smug adjust ambition criminal prisoner security math cover pecan response pharmacy center criminal salary elbow bracelet lunar briefing dragon"
)
self.assertIsNone(secret) self.assertIsNone(secret)
secret, share = process_slip39("trash smug adjust aide benefit temple round clogs devote prevent type cards clogs plastic aspect paper behavior lunar custody intimate") secret, share = process_slip39(
"trash smug adjust aide benefit temple round clogs devote prevent type cards clogs plastic aspect paper behavior lunar custody intimate"
)
self.assertIsNone(secret) self.assertIsNone(secret)
# different identifier # different identifier
@ -179,9 +242,13 @@ class TestSlip39(unittest.TestCase):
check(BackupType.Slip39_Advanced, ["trash", "smug", "adjust", "ambition"]) check(BackupType.Slip39_Advanced, ["trash", "smug", "adjust", "ambition"])
# Let's store two more. The group is 4/6 so this group is now complete. # Let's store two more. The group is 4/6 so this group is now complete.
secret, share = process_slip39("trash smug adjust arena beard quick language program true hush amount round geology should training practice language diet order ruin") secret, share = process_slip39(
"trash smug adjust arena beard quick language program true hush amount round geology should training practice language diet order ruin"
)
self.assertIsNone(secret) self.assertIsNone(secret)
secret, share = process_slip39("trash smug adjust beam brave sack magazine radar toxic emission domestic cradle vocal petition mule toxic acid hobo welcome downtown") secret, share = process_slip39(
"trash smug adjust beam brave sack magazine radar toxic emission domestic cradle vocal petition mule toxic acid hobo welcome downtown"
)
self.assertIsNone(secret) self.assertIsNone(secret)
# If trying to add another one from this group we get a warning. # If trying to add another one from this group we get a warning.

View File

@ -7,7 +7,6 @@ if not utils.BITCOIN_ONLY:
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin") @unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestMoneroBulletproof(unittest.TestCase): class TestMoneroBulletproof(unittest.TestCase):
def test_square_multiply(self): def test_square_multiply(self):
for x in [2, 3, 16, 17, 31, 32]: for x in [2, 3, 16, 17, 31, 32]:
ss = crypto.random_scalar() ss = crypto.random_scalar()
@ -17,10 +16,14 @@ class TestMoneroBulletproof(unittest.TestCase):
crypto.sc_mul_into(s1, s1, ss) crypto.sc_mul_into(s1, s1, ss)
bp._sc_square_mult(s2, ss, x) bp._sc_square_mult(s2, ss, x)
self.assertEqual(crypto.encodeint_into(None, s1), crypto.encodeint_into(None, s2)) self.assertEqual(
crypto.encodeint_into(None, s1), crypto.encodeint_into(None, s2)
)
def test_dvct_skips(self): def test_dvct_skips(self):
z_sq = unhexlify(b'e0408b528e9d35ccb8386b87f39b85c724740644f4db412483a8852cdb3ceb00') z_sq = unhexlify(
b"e0408b528e9d35ccb8386b87f39b85c724740644f4db412483a8852cdb3ceb00"
)
d_vct0 = bp.VctD(64, 8, z_sq, raw=True) d_vct0 = bp.VctD(64, 8, z_sq, raw=True)
d_vct1 = bp.VctD(64, 8, z_sq, raw=True) d_vct1 = bp.VctD(64, 8, z_sq, raw=True)
tmp = crypto.Scalar() tmp = crypto.Scalar()
@ -28,75 +31,123 @@ class TestMoneroBulletproof(unittest.TestCase):
# Linear scan vs jump # Linear scan vs jump
for i in range(65): for i in range(65):
tmp = d_vct0[i] tmp = d_vct0[i]
self.assertEqual(crypto.encodeint_into(None, tmp), crypto.encodeint_into(None, d_vct1[64])) self.assertEqual(
crypto.encodeint_into(None, tmp), crypto.encodeint_into(None, d_vct1[64])
)
# Jumping around # Jumping around
_ = d_vct0[128] _ = d_vct0[128]
self.assertEqual(crypto.encodeint_into(None, d_vct0[64]), crypto.encodeint_into(None, d_vct1[64])) self.assertEqual(
crypto.encodeint_into(None, d_vct0[64]),
crypto.encodeint_into(None, d_vct1[64]),
)
# Sync on the same jump # Sync on the same jump
self.assertEqual(crypto.encodeint_into(None, d_vct0[65]), crypto.encodeint_into(None, d_vct1[65])) self.assertEqual(
self.assertEqual(crypto.encodeint_into(None, d_vct0[65]), crypto.encodeint_into(None, d_vct1[65])) crypto.encodeint_into(None, d_vct0[65]),
crypto.encodeint_into(None, d_vct1[65]),
)
self.assertEqual(
crypto.encodeint_into(None, d_vct0[65]),
crypto.encodeint_into(None, d_vct1[65]),
)
# Jump vs linear again, move_one vs move_more # Jump vs linear again, move_one vs move_more
for i in range(1, 10): for i in range(1, 10):
tmp = d_vct0[65 + i] tmp = d_vct0[65 + i]
self.assertEqual(crypto.encodeint_into(None, tmp), crypto.encodeint_into(None, d_vct1[74])) self.assertEqual(
crypto.encodeint_into(None, tmp), crypto.encodeint_into(None, d_vct1[74])
)
_ = d_vct0[85] _ = d_vct0[85]
_ = d_vct1[89] # different jump sizes, internal state management test _ = d_vct1[89] # different jump sizes, internal state management test
self.assertEqual(crypto.encodeint_into(None, d_vct0[95]), crypto.encodeint_into(None, d_vct1[95])) self.assertEqual(
crypto.encodeint_into(None, d_vct0[95]),
crypto.encodeint_into(None, d_vct1[95]),
)
_ = d_vct0[319] # move_one mults by z_sq then; enforce z component updates _ = d_vct0[319] # move_one mults by z_sq then; enforce z component updates
self.assertEqual(crypto.encodeint_into(None, d_vct0[320]), crypto.encodeint_into(None, d_vct1[320])) self.assertEqual(
crypto.encodeint_into(None, d_vct0[320]),
crypto.encodeint_into(None, d_vct1[320]),
)
tmp = crypto.sc_copy(None, d_vct0[64]) # another jump back and forth tmp = crypto.sc_copy(None, d_vct0[64]) # another jump back and forth
_ = d_vct0[127] _ = d_vct0[127]
self.assertEqual(crypto.encodeint_into(None, d_vct0[64]), crypto.encodeint_into(None, tmp)) self.assertEqual(
crypto.encodeint_into(None, d_vct0[64]), crypto.encodeint_into(None, tmp)
)
_ = d_vct0[0] _ = d_vct0[0]
_ = d_vct1[0] _ = d_vct1[0]
_ = d_vct0[64] _ = d_vct0[64]
self.assertEqual(crypto.encodeint_into(None, d_vct0[5]), crypto.encodeint_into(None, d_vct1[5])) self.assertEqual(
crypto.encodeint_into(None, d_vct0[5]),
crypto.encodeint_into(None, d_vct1[5]),
)
def test_pow_back_skips(self): def test_pow_back_skips(self):
MN = 128 MN = 128
y = unhexlify('60421950bee0aab949e63336db1eb9532dba6b4599c5cd9fb1dbde909114100e') y = unhexlify(
"60421950bee0aab949e63336db1eb9532dba6b4599c5cd9fb1dbde909114100e"
)
y_sc = crypto.decodeint_into(None, y) y_sc = crypto.decodeint_into(None, y)
yinv = bp._invert(None, y) yinv = bp._invert(None, y)
y_to_MN_1 = bp._sc_square_mult(None, y_sc, MN - 1) y_to_MN_1 = bp._sc_square_mult(None, y_sc, MN - 1)
ymax = crypto.sc_mul_into(None, y_to_MN_1, y_sc) ## y**MN ymax = crypto.sc_mul_into(None, y_to_MN_1, y_sc) ## y**MN
ymax2 = bp._sc_square_mult(None, y_sc, MN) ymax2 = bp._sc_square_mult(None, y_sc, MN)
self.assertEqual(crypto.encodeint_into(None, ymax), crypto.encodeint_into(None, ymax2)) self.assertEqual(
crypto.encodeint_into(None, ymax), crypto.encodeint_into(None, ymax2)
)
size = MN + 1 size = MN + 1
ypow_back = bp.KeyVPowersBackwards(size, y, x_inv=yinv, x_max=ymax, raw=True) ypow_back = bp.KeyVPowersBackwards(size, y, x_inv=yinv, x_max=ymax, raw=True)
self.assertEqual(crypto.encodeint_into(None, ymax), crypto.encodeint_into(None, ypow_back[MN])) self.assertEqual(
crypto.encodeint_into(None, ymax),
crypto.encodeint_into(None, ypow_back[MN]),
)
for i in range(10): for i in range(10):
_ = ypow_back[MN - i] _ = ypow_back[MN - i]
self.assertEqual(crypto.encodeint_into(None, ypow_back[MN - 9]), self.assertEqual(
crypto.encodeint_into(None, bp._sc_square_mult(None, y_sc, MN - 9))) crypto.encodeint_into(None, ypow_back[MN - 9]),
self.assertEqual(crypto.encodeint_into(None, ypow_back[MN - 19]), crypto.encodeint_into(None, bp._sc_square_mult(None, y_sc, MN - 9)),
crypto.encodeint_into(None, bp._sc_square_mult(None, y_sc, MN - 19))) )
self.assertEqual(crypto.encodeint_into(None, ypow_back[MN - 65]), self.assertEqual(
crypto.encodeint_into(None, bp._sc_square_mult(None, y_sc, MN - 65))) crypto.encodeint_into(None, ypow_back[MN - 19]),
self.assertEqual(crypto.encodeint_into(None, ypow_back[MN - 14]), crypto.encodeint_into(None, bp._sc_square_mult(None, y_sc, MN - 19)),
crypto.encodeint_into(None, bp._sc_square_mult(None, y_sc, MN - 14))) )
self.assertEqual(
crypto.encodeint_into(None, ypow_back[MN - 65]),
crypto.encodeint_into(None, bp._sc_square_mult(None, y_sc, MN - 65)),
)
self.assertEqual(
crypto.encodeint_into(None, ypow_back[MN - 14]),
crypto.encodeint_into(None, bp._sc_square_mult(None, y_sc, MN - 14)),
)
tmp = crypto.sc_copy(None, ypow_back[MN - 64]) # another jump back and forth tmp = crypto.sc_copy(None, ypow_back[MN - 64]) # another jump back and forth
_ = ypow_back[MN - 127] _ = ypow_back[MN - 127]
self.assertEqual(crypto.encodeint_into(None, ypow_back[MN - 64]), crypto.encodeint_into(None, tmp)) self.assertEqual(
self.assertEqual(crypto.encodeint_into(None, ypow_back[MN - 64]), crypto.encodeint_into(None, ypow_back[MN - 64]),
crypto.encodeint_into(None, bp._sc_square_mult(None, y_sc, MN - 64))) crypto.encodeint_into(None, tmp),
)
self.assertEqual(
crypto.encodeint_into(None, ypow_back[MN - 64]),
crypto.encodeint_into(None, bp._sc_square_mult(None, y_sc, MN - 64)),
)
def test_bpp_bprime(self): def test_bpp_bprime(self):
N, M = 64, 4 N, M = 64, 4
MN = N*M MN = N * M
y = unhexlify(b'60421950bee0aab949e63336db1eb9532dba6b4599c5cd9fb1dbde909114100e') y = unhexlify(
z = unhexlify(b'e0408b528e9d35ccb8386b87f39b85c724740644f4db412483a8852cdb3ceb00') b"60421950bee0aab949e63336db1eb9532dba6b4599c5cd9fb1dbde909114100e"
)
z = unhexlify(
b"e0408b528e9d35ccb8386b87f39b85c724740644f4db412483a8852cdb3ceb00"
)
zc = crypto.decodeint_into(None, z) zc = crypto.decodeint_into(None, z)
z_sq = bp._sc_mul(None, z, z) z_sq = bp._sc_mul(None, z, z)
sv = [1234, 8789, 4455, 6697] sv = [1234, 8789, 4455, 6697]
@ -231,8 +282,8 @@ class TestMoneroBulletproof(unittest.TestCase):
def test_prove_plus_16(self): def test_prove_plus_16(self):
bpi = bp.BulletProofPlusBuilder() bpi = bp.BulletProofPlusBuilder()
sv = [crypto.Scalar(i*123 + 45) for i in range(16)] sv = [crypto.Scalar(i * 123 + 45) for i in range(16)]
gamma = [crypto.Scalar(i*456 * 17) for i in range(16)] gamma = [crypto.Scalar(i * 456 * 17) for i in range(16)]
proof = bpi.prove_batch(sv, gamma) proof = bpi.prove_batch(sv, gamma)
bpi.verify_batch([proof]) bpi.verify_batch([proof])
@ -240,18 +291,38 @@ class TestMoneroBulletproof(unittest.TestCase):
scalars = [0, 1, 2, 3, 4, 99] scalars = [0, 1, 2, 3, 4, 99]
point_base = [0, 2, 4, 7, 12, 18] point_base = [0, 2, 4, 7, 12, 18]
scalar_sc = [crypto.Scalar(x) for x in scalars] scalar_sc = [crypto.Scalar(x) for x in scalars]
points = [crypto.scalarmult_base_into(None, crypto.Scalar(x)) for x in point_base] points = [
crypto.scalarmult_base_into(None, crypto.Scalar(x)) for x in point_base
]
muex = bp.MultiExp(scalars=[crypto.encodeint(x) for x in scalar_sc], muex = bp.MultiExp(
point_fnc=lambda i, d: crypto.encodepoint(points[i])) scalars=[crypto.encodeint(x) for x in scalar_sc],
point_fnc=lambda i, d: crypto.encodepoint(points[i]),
)
self.assertEqual(len(muex), len(scalars)) self.assertEqual(len(muex), len(scalars))
res = bp.multiexp(None, muex) res = bp.multiexp(None, muex)
res2 = bp.vector_exponent_custom( res2 = bp.vector_exponent_custom(
A=bp.KeyVEval(3, lambda i, d: crypto.encodepoint_into(crypto.scalarmult_base_into(None, crypto.Scalar(point_base[i])), d)), A=bp.KeyVEval(
B=bp.KeyVEval(3, lambda i, d: crypto.encodepoint_into(crypto.scalarmult_base_into(None, crypto.Scalar(point_base[3+i])), d)), 3,
a=bp.KeyVEval(3, lambda i, d: crypto.encodeint_into(crypto.Scalar(scalars[i]), d),), lambda i, d: crypto.encodepoint_into(
b=bp.KeyVEval(3, lambda i, d: crypto.encodeint_into(crypto.Scalar(scalars[i+3]), d)), crypto.scalarmult_base_into(None, crypto.Scalar(point_base[i])), d
),
),
B=bp.KeyVEval(
3,
lambda i, d: crypto.encodepoint_into(
crypto.scalarmult_base_into(None, crypto.Scalar(point_base[3 + i])),
d,
),
),
a=bp.KeyVEval(
3,
lambda i, d: crypto.encodeint_into(crypto.Scalar(scalars[i]), d),
),
b=bp.KeyVEval(
3, lambda i, d: crypto.encodeint_into(crypto.Scalar(scalars[i + 3]), d)
),
) )
self.assertEqual(res, res2) self.assertEqual(res, res2)

View File

@ -117,7 +117,9 @@ class TestMoneroClsag(unittest.TestCase):
ring.append(tk) ring.append(tk)
index = index if index is not None else random.uniform(len(ring)) index = index if index is not None else random.uniform(len(ring))
ring.insert(index, TmpKey(crypto_helpers.encodepoint(P), crypto_helpers.encodepoint(C))) ring.insert(
index, TmpKey(crypto_helpers.encodepoint(P), crypto_helpers.encodepoint(C))
)
ring2 = list(ring) ring2 = list(ring)
mg_buffer = [] mg_buffer = []
@ -137,7 +139,13 @@ class TestMoneroClsag(unittest.TestCase):
) )
clsag.generate_clsag_simple( clsag.generate_clsag_simple(
msg, ring, CtKey(priv, msk), alpha, Cp, index, mg_buffer, msg,
ring,
CtKey(priv, msk),
alpha,
Cp,
index,
mg_buffer,
) )
sD = crypto_helpers.decodepoint(mg_buffer[-1]) sD = crypto_helpers.decodepoint(mg_buffer[-1])
@ -156,7 +164,9 @@ class TestMoneroClsag(unittest.TestCase):
sD = crypto_helpers.decodepoint(ubinascii.unhexlify(clsag["sD"])) sD = crypto_helpers.decodepoint(ubinascii.unhexlify(clsag["sD"]))
sc1 = crypto_helpers.decodeint(ubinascii.unhexlify(clsag["sc1"])) sc1 = crypto_helpers.decodeint(ubinascii.unhexlify(clsag["sc1"]))
Cout = crypto_helpers.decodepoint(ubinascii.unhexlify(clsag["cout"])) Cout = crypto_helpers.decodepoint(ubinascii.unhexlify(clsag["cout"]))
scalars = [crypto_helpers.decodeint(ubinascii.unhexlify(x)) for x in clsag["ss"]] scalars = [
crypto_helpers.decodeint(ubinascii.unhexlify(x)) for x in clsag["ss"]
]
ring = [] ring = []
for e in clsag["ring"]: for e in clsag["ring"]:
ring.append(TmpKey(ubinascii.unhexlify(e[0]), ubinascii.unhexlify(e[1]))) ring.append(TmpKey(ubinascii.unhexlify(e[0]), ubinascii.unhexlify(e[1])))

View File

@ -15,11 +15,15 @@ class TestMoneroCrypto(unittest.TestCase):
point = unhexlify( point = unhexlify(
b"2486224797d05cae3cba4be043be2db0df381f3f19cfa113f86ab38e3d8d2bd0" b"2486224797d05cae3cba4be043be2db0df381f3f19cfa113f86ab38e3d8d2bd0"
) )
self.assertEqual(point, crypto_helpers.encodepoint(crypto_helpers.decodepoint(point))) self.assertEqual(
point, crypto_helpers.encodepoint(crypto_helpers.decodepoint(point))
)
self.assertTrue( self.assertTrue(
crypto.point_eq( crypto.point_eq(
crypto_helpers.decodepoint(point), crypto_helpers.decodepoint(point),
crypto_helpers.decodepoint(crypto_helpers.encodepoint(crypto_helpers.decodepoint(point))), crypto_helpers.decodepoint(
crypto_helpers.encodepoint(crypto_helpers.decodepoint(point))
),
) )
) )
@ -61,7 +65,9 @@ class TestMoneroCrypto(unittest.TestCase):
b"adcd1f5881f46f254900a03c654e71950a88a0236fa0a3a946c9b8daed6ef43d" b"adcd1f5881f46f254900a03c654e71950a88a0236fa0a3a946c9b8daed6ef43d"
) )
res = crypto.scalarmult_into(None, crypto_helpers.decodepoint(pub), crypto_helpers.decodeint(priv)) res = crypto.scalarmult_into(
None, crypto_helpers.decodepoint(pub), crypto_helpers.decodeint(priv)
)
self.assertEqual(exp, crypto_helpers.encodepoint(res)) self.assertEqual(exp, crypto_helpers.encodepoint(res))
self.assertTrue(crypto.point_eq(crypto_helpers.decodepoint(exp), res)) self.assertTrue(crypto.point_eq(crypto_helpers.decodepoint(exp), res))
@ -111,7 +117,9 @@ class TestMoneroCrypto(unittest.TestCase):
b"25d08763414c379aa9cf989cdcb3cadd36bd5193b500107d6bf5f921f18e470e" b"25d08763414c379aa9cf989cdcb3cadd36bd5193b500107d6bf5f921f18e470e"
) )
sc_int = crypto_helpers.derivation_to_scalar(crypto_helpers.decodepoint(derivation), 0) sc_int = crypto_helpers.derivation_to_scalar(
crypto_helpers.decodepoint(derivation), 0
)
self.assertEqual(scalar, crypto_helpers.encodeint(sc_int)) self.assertEqual(scalar, crypto_helpers.encodeint(sc_int))
def test_generate_key_derivation(self): def test_generate_key_derivation(self):
@ -131,7 +139,9 @@ class TestMoneroCrypto(unittest.TestCase):
self.assertEqual( self.assertEqual(
deriv_exp, deriv_exp,
crypto_helpers.encodepoint(crypto_helpers.generate_key_derivation(key_pub, key_priv)), crypto_helpers.encodepoint(
crypto_helpers.generate_key_derivation(key_pub, key_priv)
),
) )
def test_h(self): def test_h(self):
@ -158,13 +168,20 @@ class TestMoneroCrypto(unittest.TestCase):
addr_exp = "4LL9oSLmtpccfufTMvppY6JwXNouMBzSkbLYfpAV5Usx3skxNgYeYTRj5UzqtReoS44qo9mtmXCqY45DJ852K5Jv2bYXZKKQePHES9khPK" addr_exp = "4LL9oSLmtpccfufTMvppY6JwXNouMBzSkbLYfpAV5Usx3skxNgYeYTRj5UzqtReoS44qo9mtmXCqY45DJ852K5Jv2bYXZKKQePHES9khPK"
addr = tcry.xmr_base58_addr_encode_check( addr = tcry.xmr_base58_addr_encode_check(
19, 19,
unhexlify(b"eda9fe8dfcdd25d5430ea64229d04f6b41b2e5a1587c29cd499a63eb79d117113076a02b73d130fb904c9e91075fcd16f735c6850dfadb125eb826d96a113f098a125052fe6f3877")) unhexlify(
b"eda9fe8dfcdd25d5430ea64229d04f6b41b2e5a1587c29cd499a63eb79d117113076a02b73d130fb904c9e91075fcd16f735c6850dfadb125eb826d96a113f098a125052fe6f3877"
),
)
addr2 = encode_addr( addr2 = encode_addr(
bytes([19]), bytes([19]),
unhexlify(b"eda9fe8dfcdd25d5430ea64229d04f6b41b2e5a1587c29cd499a63eb79d11711"), unhexlify(
unhexlify(b"3076a02b73d130fb904c9e91075fcd16f735c6850dfadb125eb826d96a113f09"), b"eda9fe8dfcdd25d5430ea64229d04f6b41b2e5a1587c29cd499a63eb79d11711"
unhexlify(b"8a125052fe6f3877") ),
unhexlify(
b"3076a02b73d130fb904c9e91075fcd16f735c6850dfadb125eb826d96a113f09"
),
unhexlify(b"8a125052fe6f3877"),
) )
self.assertEqual(addr, addr_exp) self.assertEqual(addr, addr_exp)
@ -215,7 +232,9 @@ class TestMoneroCrypto(unittest.TestCase):
b"259ef2aba8feb473cf39058a0fe30b9ff6d245b42b6826687ebd6b63128aff64" b"259ef2aba8feb473cf39058a0fe30b9ff6d245b42b6826687ebd6b63128aff64"
) )
) )
res = crypto_helpers.encodepoint(monero.derive_subaddress_public_key(out_key, deriv, 5)) res = crypto_helpers.encodepoint(
monero.derive_subaddress_public_key(out_key, deriv, 5)
)
self.assertEqual( self.assertEqual(
res, res,
unhexlify( unhexlify(
@ -257,13 +276,27 @@ class TestMoneroCrypto(unittest.TestCase):
from apps.monero.signing.step_06_set_output import _derive_view_tags from apps.monero.signing.step_06_set_output import _derive_view_tags
test_vectors = [ test_vectors = [
(b'0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97', 0, b'\x76'), (
(b'fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0', 15, b'\xeb'), b"0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97",
(b'ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d', 13, b'\x42'), 0,
b"\x76",
),
(
b"fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0",
15,
b"\xeb",
),
(
b"ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d",
13,
b"\x42",
),
] ]
for key, idx, exp in test_vectors: for key, idx, exp in test_vectors:
self.assertEqual(_derive_view_tags(crypto_helpers.decodepoint(unhexlify(key)), idx), exp) self.assertEqual(
_derive_view_tags(crypto_helpers.decodepoint(unhexlify(key)), idx), exp
)
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -3,52 +3,111 @@ from apps.common.paths import HARDENED
if not utils.BITCOIN_ONLY: if not utils.BITCOIN_ONLY:
from trezor.crypto import nem from trezor.crypto import nem
from apps.nem.helpers import check_path, NEM_NETWORK_MAINNET, NEM_NETWORK_TESTNET, NEM_NETWORK_MIJIN from apps.nem.helpers import (
check_path,
NEM_NETWORK_MAINNET,
NEM_NETWORK_TESTNET,
NEM_NETWORK_MIJIN,
)
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin") @unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestNemAddress(unittest.TestCase): class TestNemAddress(unittest.TestCase):
def test_addresses(self): def test_addresses(self):
pubkey = unhexlify('c5f54ba980fcbb657dbaaa42700539b207873e134d2375efeab5f1ab52f87844') pubkey = unhexlify(
"c5f54ba980fcbb657dbaaa42700539b207873e134d2375efeab5f1ab52f87844"
)
address = nem.compute_address(pubkey, NEM_NETWORK_MAINNET) address = nem.compute_address(pubkey, NEM_NETWORK_MAINNET)
self.assertEqual(address, 'NDD2CT6LQLIYQ56KIXI3ENTM6EK3D44P5JFXJ4R4') self.assertEqual(address, "NDD2CT6LQLIYQ56KIXI3ENTM6EK3D44P5JFXJ4R4")
pubkey = unhexlify('114171230ad6f8522a000cdc73fbc5c733b30bb71f2b146ccbdf34499f79a810') pubkey = unhexlify(
"114171230ad6f8522a000cdc73fbc5c733b30bb71f2b146ccbdf34499f79a810"
)
address = nem.compute_address(pubkey, NEM_NETWORK_MAINNET) address = nem.compute_address(pubkey, NEM_NETWORK_MAINNET)
self.assertEqual(address, 'NCUKWDY3J3THKQHAKOK5ALF6ANJQABZHCH7VN6DP') self.assertEqual(address, "NCUKWDY3J3THKQHAKOK5ALF6ANJQABZHCH7VN6DP")
def test_validate_address(self): def test_validate_address(self):
validity = nem.validate_address('NDD2CT6LQLIYQ56KIXI3ENTM6EK3D44P5JFXJ4R4', NEM_NETWORK_MAINNET) validity = nem.validate_address(
"NDD2CT6LQLIYQ56KIXI3ENTM6EK3D44P5JFXJ4R4", NEM_NETWORK_MAINNET
)
self.assertTrue(validity) self.assertTrue(validity)
validity = nem.validate_address('NCUKWDY3J3THKQHAKOK5ALF6ANJQABZHCH7VN6DP', NEM_NETWORK_MAINNET) validity = nem.validate_address(
"NCUKWDY3J3THKQHAKOK5ALF6ANJQABZHCH7VN6DP", NEM_NETWORK_MAINNET
)
self.assertTrue(validity) self.assertTrue(validity)
validity = nem.validate_address('TAU5HO3DRQZNELFEMZZTUKQEZGQ7IUAHKPO7OOLK', NEM_NETWORK_TESTNET) validity = nem.validate_address(
"TAU5HO3DRQZNELFEMZZTUKQEZGQ7IUAHKPO7OOLK", NEM_NETWORK_TESTNET
)
self.assertTrue(validity) self.assertTrue(validity)
validity = nem.validate_address('nope', NEM_NETWORK_TESTNET) validity = nem.validate_address("nope", NEM_NETWORK_TESTNET)
self.assertFalse(validity) self.assertFalse(validity)
# not valid on testnet # not valid on testnet
validity = nem.validate_address('NCUKWDY3J3THKQHAKOK5ALF6ANJQABZHCH7VN6DP', NEM_NETWORK_TESTNET) validity = nem.validate_address(
"NCUKWDY3J3THKQHAKOK5ALF6ANJQABZHCH7VN6DP", NEM_NETWORK_TESTNET
)
self.assertFalse(validity) self.assertFalse(validity)
def test_check_path(self): def test_check_path(self):
# mainnet path: # mainnet path:
self.assertTrue(check_path([44 | HARDENED, 43 | HARDENED, 0 | HARDENED, 0 | HARDENED, 0 | HARDENED], NEM_NETWORK_MAINNET)) self.assertTrue(
check_path(
[
44 | HARDENED,
43 | HARDENED,
0 | HARDENED,
0 | HARDENED,
0 | HARDENED,
],
NEM_NETWORK_MAINNET,
)
)
# should be valid on mijin as well: # should be valid on mijin as well:
self.assertTrue(check_path([44 | HARDENED, 43 | HARDENED, 0 | HARDENED, 0 | HARDENED, 0 | HARDENED], NEM_NETWORK_MIJIN)) self.assertTrue(
check_path(
[
44 | HARDENED,
43 | HARDENED,
0 | HARDENED,
0 | HARDENED,
0 | HARDENED,
],
NEM_NETWORK_MIJIN,
)
)
# testnet path: # testnet path:
self.assertTrue(check_path([44 | HARDENED, 1 | HARDENED, 0 | HARDENED, 0 | HARDENED, 0 | HARDENED], NEM_NETWORK_TESTNET)) self.assertTrue(
check_path(
[44 | HARDENED, 1 | HARDENED, 0 | HARDENED, 0 | HARDENED, 0 | HARDENED],
NEM_NETWORK_TESTNET,
)
)
# short path (check_path does not validate pattern match): # short path (check_path does not validate pattern match):
self.assertTrue(check_path([44 | HARDENED, 43 | HARDENED], NEM_NETWORK_MAINNET)) self.assertTrue(check_path([44 | HARDENED, 43 | HARDENED], NEM_NETWORK_MAINNET))
# testnet path on mainnet: # testnet path on mainnet:
self.assertFalse(check_path([44 | HARDENED, 1 | HARDENED, 0 | HARDENED, 0 | HARDENED, 0 | HARDENED], NEM_NETWORK_MAINNET)) self.assertFalse(
check_path(
[44 | HARDENED, 1 | HARDENED, 0 | HARDENED, 0 | HARDENED, 0 | HARDENED],
NEM_NETWORK_MAINNET,
)
)
# mainnet path on testnet: # mainnet path on testnet:
self.assertFalse(check_path([44 | HARDENED, 43 | HARDENED, 0 | HARDENED, 0 | HARDENED, 0 | HARDENED], NEM_NETWORK_TESTNET)) self.assertFalse(
check_path(
[
44 | HARDENED,
43 | HARDENED,
0 | HARDENED,
0 | HARDENED,
0 | HARDENED,
],
NEM_NETWORK_TESTNET,
)
)
# path too short to extract SLIP44: # path too short to extract SLIP44:
self.assertFalse(check_path([44 | HARDENED], NEM_NETWORK_TESTNET)) self.assertFalse(check_path([44 | HARDENED], NEM_NETWORK_TESTNET))
# unknown SLIP44: # unknown SLIP44:
@ -57,5 +116,5 @@ class TestNemAddress(unittest.TestCase):
self.assertFalse(check_path([44 | HARDENED, 43, 0], NEM_NETWORK_MAINNET)) self.assertFalse(check_path([44 | HARDENED, 43, 0], NEM_NETWORK_MAINNET))
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -8,71 +8,110 @@ if not utils.BITCOIN_ONLY:
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin") @unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestNemHDNode(unittest.TestCase): class TestNemHDNode(unittest.TestCase):
def test_addresses(self): def test_addresses(self):
# test vectors from https://raw.githubusercontent.com/NemProject/nem-test-vectors/master/1.test-keys.dat # test vectors from https://raw.githubusercontent.com/NemProject/nem-test-vectors/master/1.test-keys.dat
# private key, public key, address # private key, public key, address
test_cases = [ test_cases = [
('575dbb3062267eff57c970a336ebbc8fbcfe12c5bd3ed7bc11eb0481d7704ced', (
'c5f54ba980fcbb657dbaaa42700539b207873e134d2375efeab5f1ab52f87844', "575dbb3062267eff57c970a336ebbc8fbcfe12c5bd3ed7bc11eb0481d7704ced",
'NDD2CT6LQLIYQ56KIXI3ENTM6EK3D44P5JFXJ4R4'), "c5f54ba980fcbb657dbaaa42700539b207873e134d2375efeab5f1ab52f87844",
('5b0e3fa5d3b49a79022d7c1e121ba1cbbf4db5821f47ab8c708ef88defc29bfe', "NDD2CT6LQLIYQ56KIXI3ENTM6EK3D44P5JFXJ4R4",
'96eb2a145211b1b7ab5f0d4b14f8abc8d695c7aee31a3cfc2d4881313c68eea3', ),
'NABHFGE5ORQD3LE4O6B7JUFN47ECOFBFASC3SCAC'), (
('738ba9bb9110aea8f15caa353aca5653b4bdfca1db9f34d0efed2ce1325aeeda', "5b0e3fa5d3b49a79022d7c1e121ba1cbbf4db5821f47ab8c708ef88defc29bfe",
'2d8425e4ca2d8926346c7a7ca39826acd881a8639e81bd68820409c6e30d142a', "96eb2a145211b1b7ab5f0d4b14f8abc8d695c7aee31a3cfc2d4881313c68eea3",
'NAVOZX4HDVOAR4W6K4WJHWPD3MOFU27DFHC7KZOZ'), "NABHFGE5ORQD3LE4O6B7JUFN47ECOFBFASC3SCAC",
('e8bf9bc0f35c12d8c8bf94dd3a8b5b4034f1063948e3cc5304e55e31aa4b95a6', ),
'4feed486777ed38e44c489c7c4e93a830e4c4a907fa19a174e630ef0f6ed0409', (
'NBZ6JK5YOCU6UPSSZ5D3G27UHAPHTY5HDQMGE6TT'), "738ba9bb9110aea8f15caa353aca5653b4bdfca1db9f34d0efed2ce1325aeeda",
('c325ea529674396db5675939e7988883d59a5fc17a28ca977e3ba85370232a83', "2d8425e4ca2d8926346c7a7ca39826acd881a8639e81bd68820409c6e30d142a",
'83ee32e4e145024d29bca54f71fa335a98b3e68283f1a3099c4d4ae113b53e54', "NAVOZX4HDVOAR4W6K4WJHWPD3MOFU27DFHC7KZOZ",
'NCQW2P5DNZ5BBXQVGS367DQ4AHC3RXOEVGRCLY6V'), ),
('a811cb7a80a7227ae61f6da536534ee3c2744e3c7e4b85f3e0df3c6a9c5613df', (
'6d34c04f3a0e42f0c3c6f50e475ae018cfa2f56df58c481ad4300424a6270cbb', "e8bf9bc0f35c12d8c8bf94dd3a8b5b4034f1063948e3cc5304e55e31aa4b95a6",
'NA5IG3XFXZHIPJ5QLKX2FBJPEZYPMBPPK2ZRC3EH'), "4feed486777ed38e44c489c7c4e93a830e4c4a907fa19a174e630ef0f6ed0409",
('9c66de1ec77f4dfaaebdf9c8bc599ca7e8e6f0bc71390ffee2c9dd3f3619242a', "NBZ6JK5YOCU6UPSSZ5D3G27UHAPHTY5HDQMGE6TT",
'a8fefd72a3b833dc7c7ed7d57ed86906dac22f88f1f4331873eb2da3152a3e77', ),
'NAABHVFJDBM74XMJJ52R7QN2MTTG2ZUXPQS62QZ7'), (
('c56bc16ecf727878c15e24f4ae68569600ac7b251218a44ef50ce54175776edc', "c325ea529674396db5675939e7988883d59a5fc17a28ca977e3ba85370232a83",
'c92f761e6d83d20068fd46fe4bd5b97f4c6ba05d23180679b718d1f3e4fb066e', "83ee32e4e145024d29bca54f71fa335a98b3e68283f1a3099c4d4ae113b53e54",
'NCLK3OLMHR3F2E3KSBUIZ4K5PNWUDN37MLSJBJZP'), "NCQW2P5DNZ5BBXQVGS367DQ4AHC3RXOEVGRCLY6V",
('9dd73599283882fa1561ddfc9be5830b5dd453c90465d3fe5eeb646a3606374e', ),
'eaf16a4833e59370a04ccd5c63395058de34877b48c17174c71db5ed37b537ed', (
'ND3AHW4VTI5R5QE5V44KIGPRU5FBJ5AFUCJXOY5H'), "a811cb7a80a7227ae61f6da536534ee3c2744e3c7e4b85f3e0df3c6a9c5613df",
('d9639dc6f49dad02a42fd8c217f1b1b4f8ce31ccd770388b645e639c72ff24fa', "6d34c04f3a0e42f0c3c6f50e475ae018cfa2f56df58c481ad4300424a6270cbb",
'0f74a2f537cd9c986df018994dde75bdeee05e35eb9fe27adf506ca8475064f7', "NA5IG3XFXZHIPJ5QLKX2FBJPEZYPMBPPK2ZRC3EH",
'NCTZ4YAP43ONK3UYTASQVNDMBO24ZHJE65F3QPYE'), ),
('efc1992cd50b70ca55ac12c07aa5d026a8b78ffe28a7dbffc9228b26e02c38c1', (
'2ebff201255f6cf948c78f528658b99a7c13ac791942fa22d59af610558111f5', "9c66de1ec77f4dfaaebdf9c8bc599ca7e8e6f0bc71390ffee2c9dd3f3619242a",
'NDQ2TMCMXBSFPZQPE2YKH6XLC24HD6LUMN6Z4GIC'), "a8fefd72a3b833dc7c7ed7d57ed86906dac22f88f1f4331873eb2da3152a3e77",
('143a815e92e43f3ed1a921ee48cd143931b88b7c3d8e1e981f743c2a5be3c5ba', "NAABHVFJDBM74XMJJ52R7QN2MTTG2ZUXPQS62QZ7",
'419ed11d48730e4ae2c93f0ea4df853b8d578713a36dab227517cf965861af4e', ),
'NA32IDDW2C53BDSBJNFL3Z6UU3J5CJZJMCZDXCF4'), (
('bc1a082f5ac6fdd3a83ade211e5986ac0551bad6c7da96727ec744e5df963e2a', "c56bc16ecf727878c15e24f4ae68569600ac7b251218a44ef50ce54175776edc",
'a160e6f9112233a7ce94202ed7a4443e1dac444b5095f9fecbb965fba3f92cac', "c92f761e6d83d20068fd46fe4bd5b97f4c6ba05d23180679b718d1f3e4fb066e",
'NADUCEQLC3FTGB25GTA5HOUTB53CBVQNVOIP7NTJ'), "NCLK3OLMHR3F2E3KSBUIZ4K5PNWUDN37MLSJBJZP",
('4e47b4c6f4c7886e49ec109c61f4af5cfbb1637283218941d55a7f9fe1053f72', ),
'fbb91b16df828e21a9802980a44fc757c588bc1382a4cea429d6fa2ae0333f56', (
'NBAF3BFLLPWH33MYE6VUPP5T6DQBZBKIDEQKZQOE'), "9dd73599283882fa1561ddfc9be5830b5dd453c90465d3fe5eeb646a3606374e",
('efc4389da48ce49f85365cfa578c746530e9eac42db1b64ec346119b1becd347', "eaf16a4833e59370a04ccd5c63395058de34877b48c17174c71db5ed37b537ed",
'2232f24dda0f2ded3ecd831210d4e8521a096b50cadd5a34f3f7083374e1ec12', "ND3AHW4VTI5R5QE5V44KIGPRU5FBJ5AFUCJXOY5H",
'NBOGTK2I2ATOGGD7ZFJHROG5MWL7XCKAUKSWIVSA'), ),
('bdba57c78ca7da16a3360efd13f06276284db8c40351de7fcd38ba0c35ac754d', (
'c334c6c0dad5aaa2a0d0fb4c6032cb6a0edd96bf61125b5ea9062d5a00ee0eee', "d9639dc6f49dad02a42fd8c217f1b1b4f8ce31ccd770388b645e639c72ff24fa",
'NCLERTEFYXKLK7RA4MVACEFMXMK3P7QMWTM7FBW2'), "0f74a2f537cd9c986df018994dde75bdeee05e35eb9fe27adf506ca8475064f7",
('20694c1ec3c4a311bcdb29ed2edc428f6d4f9a4c429ad6a5bf3222084e35695f', "NCTZ4YAP43ONK3UYTASQVNDMBO24ZHJE65F3QPYE",
'518c4de412efa93de06a55947d11f697639443916ec8fcf04ebc3e6d17d0bd93', ),
'NB5V4BPIJHXVONO7UGMJDPFARMFA73BOBNOOYCOV'), (
('e0d4f3760ac107b33c22c2cac24ab2f520b282684f5f66a4212ff95d926323ce', "efc1992cd50b70ca55ac12c07aa5d026a8b78ffe28a7dbffc9228b26e02c38c1",
'b3d16f4ead9de67c290144da535a0ed2504b03c05e5f1ceb8c7863762f786857', "2ebff201255f6cf948c78f528658b99a7c13ac791942fa22d59af610558111f5",
'NC4PBAO5TPCAVQKBVOC4F6DMZP3CFSQBU46PSKBD'), "NDQ2TMCMXBSFPZQPE2YKH6XLC24HD6LUMN6Z4GIC",
('efa9afc617412093c9c7a7c211a5332dd556f941e1a88c494ec860608610eea2', ),
'7e7716e4cebceb731d6f1fd28676f34888e9a0000fcfa1471db1c616c2ddf559', (
'NCFW2LPXIWLBWAQN2QVIWEOD7IVDO3HQBD2OU56K'), "143a815e92e43f3ed1a921ee48cd143931b88b7c3d8e1e981f743c2a5be3c5ba",
('d98499b3db61944684ce06a91735af4e14105338473fcf6ebe2b0bcada3dfd21', "419ed11d48730e4ae2c93f0ea4df853b8d578713a36dab227517cf965861af4e",
'114171230ad6f8522a000cdc73fbc5c733b30bb71f2b146ccbdf34499f79a810', "NA32IDDW2C53BDSBJNFL3Z6UU3J5CJZJMCZDXCF4",
'NCUKWDY3J3THKQHAKOK5ALF6ANJQABZHCH7VN6DP') ),
(
"bc1a082f5ac6fdd3a83ade211e5986ac0551bad6c7da96727ec744e5df963e2a",
"a160e6f9112233a7ce94202ed7a4443e1dac444b5095f9fecbb965fba3f92cac",
"NADUCEQLC3FTGB25GTA5HOUTB53CBVQNVOIP7NTJ",
),
(
"4e47b4c6f4c7886e49ec109c61f4af5cfbb1637283218941d55a7f9fe1053f72",
"fbb91b16df828e21a9802980a44fc757c588bc1382a4cea429d6fa2ae0333f56",
"NBAF3BFLLPWH33MYE6VUPP5T6DQBZBKIDEQKZQOE",
),
(
"efc4389da48ce49f85365cfa578c746530e9eac42db1b64ec346119b1becd347",
"2232f24dda0f2ded3ecd831210d4e8521a096b50cadd5a34f3f7083374e1ec12",
"NBOGTK2I2ATOGGD7ZFJHROG5MWL7XCKAUKSWIVSA",
),
(
"bdba57c78ca7da16a3360efd13f06276284db8c40351de7fcd38ba0c35ac754d",
"c334c6c0dad5aaa2a0d0fb4c6032cb6a0edd96bf61125b5ea9062d5a00ee0eee",
"NCLERTEFYXKLK7RA4MVACEFMXMK3P7QMWTM7FBW2",
),
(
"20694c1ec3c4a311bcdb29ed2edc428f6d4f9a4c429ad6a5bf3222084e35695f",
"518c4de412efa93de06a55947d11f697639443916ec8fcf04ebc3e6d17d0bd93",
"NB5V4BPIJHXVONO7UGMJDPFARMFA73BOBNOOYCOV",
),
(
"e0d4f3760ac107b33c22c2cac24ab2f520b282684f5f66a4212ff95d926323ce",
"b3d16f4ead9de67c290144da535a0ed2504b03c05e5f1ceb8c7863762f786857",
"NC4PBAO5TPCAVQKBVOC4F6DMZP3CFSQBU46PSKBD",
),
(
"efa9afc617412093c9c7a7c211a5332dd556f941e1a88c494ec860608610eea2",
"7e7716e4cebceb731d6f1fd28676f34888e9a0000fcfa1471db1c616c2ddf559",
"NCFW2LPXIWLBWAQN2QVIWEOD7IVDO3HQBD2OU56K",
),
(
"d98499b3db61944684ce06a91735af4e14105338473fcf6ebe2b0bcada3dfd21",
"114171230ad6f8522a000cdc73fbc5c733b30bb71f2b146ccbdf34499f79a810",
"NCUKWDY3J3THKQHAKOK5ALF6ANJQABZHCH7VN6DP",
),
] ]
for test in test_cases: for test in test_cases:
@ -84,7 +123,7 @@ class TestNemHDNode(unittest.TestCase):
child_num=0, child_num=0,
chain_code=bytearray(32), chain_code=bytearray(32),
private_key=private_key, private_key=private_key,
curve_name=CURVE curve_name=CURVE,
) )
self.assertEqual(node.nem_address(NEM_NETWORK_MAINNET), test[2]) self.assertEqual(node.nem_address(NEM_NETWORK_MAINNET), test[2])
@ -95,146 +134,188 @@ class TestNemHDNode(unittest.TestCase):
# test vectors from https://raw.githubusercontent.com/NemProject/nem-test-vectors/master/4.test-cipher.dat # test vectors from https://raw.githubusercontent.com/NemProject/nem-test-vectors/master/4.test-cipher.dat
# private key, transfer public key, salt, iv, plain text, cipher text # private key, transfer public key, salt, iv, plain text, cipher text
test_cases = [ test_cases = [
{'private': '3140f94c79f249787d1ec75a97a885980eb8f0a7d9b7aa03e7200296e422b2b6', {
'public': '57a70eb553a7b3fd621f0dba6abf51312ea2e2a2a1e19d0305516730f4bcbd21', "private": "3140f94c79f249787d1ec75a97a885980eb8f0a7d9b7aa03e7200296e422b2b6",
'salt': '83616c67f076d356fd1288a6e0fd7a60488ba312a3adf0088b1b33c7655c3e6a', "public": "57a70eb553a7b3fd621f0dba6abf51312ea2e2a2a1e19d0305516730f4bcbd21",
'iv': 'a73ff5c32f8fd055b09775817a6a3f95', "salt": "83616c67f076d356fd1288a6e0fd7a60488ba312a3adf0088b1b33c7655c3e6a",
'input': '86ddb9e713a8ebf67a51830eff03b837e147c20d75e67b2a54aa29e98c', "iv": "a73ff5c32f8fd055b09775817a6a3f95",
'output': '70815da779b1b954d7a7f00c16940e9917a0412a06a444b539bf147603eef87f'}, "input": "86ddb9e713a8ebf67a51830eff03b837e147c20d75e67b2a54aa29e98c",
{'private': '3140f94c79f249787d1ec75a97a885980eb8f0a7d9b7aa03e7200296e422b2b6', "output": "70815da779b1b954d7a7f00c16940e9917a0412a06a444b539bf147603eef87f",
'public': '57a70eb553a7b3fd621f0dba6abf51312ea2e2a2a1e19d0305516730f4bcbd21', },
'salt': '703ce0b1d276b10eef35672df03234385a903460db18ba9d4e05b3ad31abb284', {
'iv': '91246c2d5493867c4fa3e78f85963677', "private": "3140f94c79f249787d1ec75a97a885980eb8f0a7d9b7aa03e7200296e422b2b6",
'input': '86ddb9e713a8ebf67a51830eff03b837e147c20d75e67b2a54aa29e98c', "public": "57a70eb553a7b3fd621f0dba6abf51312ea2e2a2a1e19d0305516730f4bcbd21",
'output': '564b2f40d42c0efc1bd6f057115a5abd1564cae36d7ccacf5d825d38401aa894'}, "salt": "703ce0b1d276b10eef35672df03234385a903460db18ba9d4e05b3ad31abb284",
{'private': '3140f94c79f249787d1ec75a97a885980eb8f0a7d9b7aa03e7200296e422b2b6', "iv": "91246c2d5493867c4fa3e78f85963677",
'public': '57a70eb553a7b3fd621f0dba6abf51312ea2e2a2a1e19d0305516730f4bcbd21', "input": "86ddb9e713a8ebf67a51830eff03b837e147c20d75e67b2a54aa29e98c",
'salt': 'b22e8e8e7373ac31ca7f0f6eb8b93130aba5266772a658593f3a11792e7e8d92', "output": "564b2f40d42c0efc1bd6f057115a5abd1564cae36d7ccacf5d825d38401aa894",
'iv': '9f8e33d82374dad6aac0e3dbe7aea704', },
'input': '86ddb9e713a8ebf67a51830eff03b837e147c20d75e67b2a54aa29e98c', {
'output': '7cab88d00a3fc656002eccbbd966e1d5d14a3090d92cf502cdbf843515625dcf'}, "private": "3140f94c79f249787d1ec75a97a885980eb8f0a7d9b7aa03e7200296e422b2b6",
{'private': '3140f94c79f249787d1ec75a97a885980eb8f0a7d9b7aa03e7200296e422b2b6', "public": "57a70eb553a7b3fd621f0dba6abf51312ea2e2a2a1e19d0305516730f4bcbd21",
'public': '57a70eb553a7b3fd621f0dba6abf51312ea2e2a2a1e19d0305516730f4bcbd21', "salt": "b22e8e8e7373ac31ca7f0f6eb8b93130aba5266772a658593f3a11792e7e8d92",
'salt': 'af646c54cd153dffe453b60efbceeb85c1e95a414ea0036c4da94afb3366f5d9', "iv": "9f8e33d82374dad6aac0e3dbe7aea704",
'iv': '6acdf8e01acc8074ddc807281b6af888', "input": "86ddb9e713a8ebf67a51830eff03b837e147c20d75e67b2a54aa29e98c",
'input': '86ddb9e713a8ebf67a51830eff03b837e147c20d75e67b2a54aa29e98c', "output": "7cab88d00a3fc656002eccbbd966e1d5d14a3090d92cf502cdbf843515625dcf",
'output': 'aa70543a485b63a4dd141bb7fd78019092ac6fad731e914280a287c7467bae1a'}, },
{'private': '3140f94c79f249787d1ec75a97a885980eb8f0a7d9b7aa03e7200296e422b2b6', {
'public': '57a70eb553a7b3fd621f0dba6abf51312ea2e2a2a1e19d0305516730f4bcbd21', "private": "3140f94c79f249787d1ec75a97a885980eb8f0a7d9b7aa03e7200296e422b2b6",
'salt': 'd9c0d386636c8a024935c024589f9cd39e820a16485b14951e690a967830e269', "public": "57a70eb553a7b3fd621f0dba6abf51312ea2e2a2a1e19d0305516730f4bcbd21",
'iv': 'f2e9f18aeb374965f54d2f4e31189a8f', "salt": "af646c54cd153dffe453b60efbceeb85c1e95a414ea0036c4da94afb3366f5d9",
'input': '86ddb9e713a8ebf67a51830eff03b837e147c20d75e67b2a54aa29e98c', "iv": "6acdf8e01acc8074ddc807281b6af888",
'output': '33d97c216ea6498dfddabf94c2e2403d73efc495e9b284d9d90aaff840217d25'}, "input": "86ddb9e713a8ebf67a51830eff03b837e147c20d75e67b2a54aa29e98c",
{'private': 'd5c0762ecea2cd6b5c56751b58debcb32713aab348f4a59c493e38beb3244f3a', "output": "aa70543a485b63a4dd141bb7fd78019092ac6fad731e914280a287c7467bae1a",
'public': '66a35941d615b5644d19c2a602c363ada8b1a8a0dac3682623852dcab4afac04', },
'salt': '06c227baac1ae3b0b1dc583f4850f13f9ba5d53be4a98fa5c3ea16217847530d', {
'iv': '3735123e78c44895df6ea33fa57e9a72', "private": "3140f94c79f249787d1ec75a97a885980eb8f0a7d9b7aa03e7200296e422b2b6",
'input': '86ddb9e713a8ebf67a51830eff03b837e147c20d75e67b2a54aa29e98c', "public": "57a70eb553a7b3fd621f0dba6abf51312ea2e2a2a1e19d0305516730f4bcbd21",
'output': 'd5b5d66ba8cee0eb7ecf95b143fa77a46d6de13749e12eff40f5a7e649167ccb'}, "salt": "d9c0d386636c8a024935c024589f9cd39e820a16485b14951e690a967830e269",
{'private': 'd5c0762ecea2cd6b5c56751b58debcb32713aab348f4a59c493e38beb3244f3a', "iv": "f2e9f18aeb374965f54d2f4e31189a8f",
'public': '66a35941d615b5644d19c2a602c363ada8b1a8a0dac3682623852dcab4afac04', "input": "86ddb9e713a8ebf67a51830eff03b837e147c20d75e67b2a54aa29e98c",
'salt': '92f55ba5bc6fc2f23e3eedc299357c71518e36ba2447a4da7a9dfe9dfeb107b5', "output": "33d97c216ea6498dfddabf94c2e2403d73efc495e9b284d9d90aaff840217d25",
'iv': '1cbc4982e53e370052af97ab088fa942', },
'input': '86ddb9e713a8ebf67a51830eff03b837e147c20d75e67b2a54aa29e98c', {
'output': 'd48ef1ef526d805656cfc932aff259eadb17aa3391dde1877a722cba31d935b2'}, "private": "d5c0762ecea2cd6b5c56751b58debcb32713aab348f4a59c493e38beb3244f3a",
{'private': 'd5c0762ecea2cd6b5c56751b58debcb32713aab348f4a59c493e38beb3244f3a', "public": "66a35941d615b5644d19c2a602c363ada8b1a8a0dac3682623852dcab4afac04",
'public': '66a35941d615b5644d19c2a602c363ada8b1a8a0dac3682623852dcab4afac04', "salt": "06c227baac1ae3b0b1dc583f4850f13f9ba5d53be4a98fa5c3ea16217847530d",
'salt': '10f15a39ba49866292a43b7781bc71ca8bbd4889f1616461caf056bcb91b0158', "iv": "3735123e78c44895df6ea33fa57e9a72",
'iv': 'c40d531d92bfee969dce91417346c892', "input": "86ddb9e713a8ebf67a51830eff03b837e147c20d75e67b2a54aa29e98c",
'input': '49de3cd5890e0cd0559f143807ff688ff62789b7236a332b7d7255ec0b4e73e6b3a4', "output": "d5b5d66ba8cee0eb7ecf95b143fa77a46d6de13749e12eff40f5a7e649167ccb",
'output': 'e6d75afdb542785669b42198577c5b358d95397d71ec6f5835dca46d332cc08dbf73ea790b7bcb169a65719c0d55054c'}, },
{'private': 'd5c0762ecea2cd6b5c56751b58debcb32713aab348f4a59c493e38beb3244f3a', {
'public': '66a35941d615b5644d19c2a602c363ada8b1a8a0dac3682623852dcab4afac04', "private": "d5c0762ecea2cd6b5c56751b58debcb32713aab348f4a59c493e38beb3244f3a",
'salt': '9c01ed42b219b3bbe1a43ae9d7af5c1dd09363baacfdba8f4d03d1046915e26e', "public": "66a35941d615b5644d19c2a602c363ada8b1a8a0dac3682623852dcab4afac04",
'iv': '059a35d5f83249e632790015ed6518b9', "salt": "92f55ba5bc6fc2f23e3eedc299357c71518e36ba2447a4da7a9dfe9dfeb107b5",
'input': '49de3cd5890e0cd0559f143807ff688ff62789b7236a332b7d7255ec0b4e73e6b3a4', "iv": "1cbc4982e53e370052af97ab088fa942",
'output': '5ef11aadff2eccee8b712dab968fa842eb770818ec0e6663ed242ea8b6bbc1c66d6285ee5b5f03d55dfee382fb4fa25d'}, "input": "86ddb9e713a8ebf67a51830eff03b837e147c20d75e67b2a54aa29e98c",
{'private': 'd5c0762ecea2cd6b5c56751b58debcb32713aab348f4a59c493e38beb3244f3a', "output": "d48ef1ef526d805656cfc932aff259eadb17aa3391dde1877a722cba31d935b2",
'public': '66a35941d615b5644d19c2a602c363ada8b1a8a0dac3682623852dcab4afac04', },
'salt': 'bc1067e2a7415ea45ff1ca9894338c591ff15f2e57ae2789ae31b9d5bea0f11e', {
'iv': '8c73f0d6613898daeefa3cf8b0686d37', "private": "d5c0762ecea2cd6b5c56751b58debcb32713aab348f4a59c493e38beb3244f3a",
'input': '49de3cd5890e0cd0559f143807ff688ff62789b7236a332b7d7255ec0b4e73e6b3a4', "public": "66a35941d615b5644d19c2a602c363ada8b1a8a0dac3682623852dcab4afac04",
'output': '6d220213b1878cd40a458f2a1e6e3b48040455fdf504dcd857f4f2ca1ad642e3a44fc401d04e339d302f66a9fad3d919'}, "salt": "10f15a39ba49866292a43b7781bc71ca8bbd4889f1616461caf056bcb91b0158",
{'private': '9ef87ba8aa2e664bdfdb978b98bc30fb61773d9298e7b8c72911683eeff41921', "iv": "c40d531d92bfee969dce91417346c892",
'public': '441e76d7e53be0a967181076a842f69c20fd8c0e3f0ce3aa421b490b059fe094', "input": "49de3cd5890e0cd0559f143807ff688ff62789b7236a332b7d7255ec0b4e73e6b3a4",
'salt': 'cf4a21cb790552165827b678ca9695fcaf77566d382325112ff79483455de667', "output": "e6d75afdb542785669b42198577c5b358d95397d71ec6f5835dca46d332cc08dbf73ea790b7bcb169a65719c0d55054c",
'iv': 'bfbf5482e06f55b88bdd9e053b7eee6e', },
'input': '49de3cd5890e0cd0559f143807ff688ff62789b7236a332b7d7255ec0b4e73e6b3a4', {
'output': '1198a78c29c215d5c450f7b8513ead253160bc9fde80d9cc8e6bee2efe9713cf5a09d6293c41033271c9e8c22036a28b'}, "private": "d5c0762ecea2cd6b5c56751b58debcb32713aab348f4a59c493e38beb3244f3a",
{'private': '9ef87ba8aa2e664bdfdb978b98bc30fb61773d9298e7b8c72911683eeff41921', "public": "66a35941d615b5644d19c2a602c363ada8b1a8a0dac3682623852dcab4afac04",
'public': '441e76d7e53be0a967181076a842f69c20fd8c0e3f0ce3aa421b490b059fe094', "salt": "9c01ed42b219b3bbe1a43ae9d7af5c1dd09363baacfdba8f4d03d1046915e26e",
'salt': 'eba5eae8aef79114082c3e70baef95bb02edf13b3897e8be7a70272962ef8838', "iv": "059a35d5f83249e632790015ed6518b9",
'iv': 'af9a56da3da18e2fbd2948a16332532b', "input": "49de3cd5890e0cd0559f143807ff688ff62789b7236a332b7d7255ec0b4e73e6b3a4",
'input': '49de3cd5890e0cd0559f143807ff688ff62789b7236a332b7d7255ec0b4e73e6b3a4', "output": "5ef11aadff2eccee8b712dab968fa842eb770818ec0e6663ed242ea8b6bbc1c66d6285ee5b5f03d55dfee382fb4fa25d",
'output': '1062ab5fbbdee9042ad35bdadfd3047c0a2127fe0f001da1be1b0582185edfc9687be8d68f85795833bb04af9cedd3bb'}, },
{'private': '9ef87ba8aa2e664bdfdb978b98bc30fb61773d9298e7b8c72911683eeff41921', {
'public': '441e76d7e53be0a967181076a842f69c20fd8c0e3f0ce3aa421b490b059fe094', "private": "d5c0762ecea2cd6b5c56751b58debcb32713aab348f4a59c493e38beb3244f3a",
'salt': '518f8dfd0c138f1ffb4ea8029db15441d70abd893c3d767dc668f23ba7770e27', "public": "66a35941d615b5644d19c2a602c363ada8b1a8a0dac3682623852dcab4afac04",
'iv': '42d28307974a1b2a2d921d270cfce03b', "salt": "bc1067e2a7415ea45ff1ca9894338c591ff15f2e57ae2789ae31b9d5bea0f11e",
'input': '49de3cd5890e0cd0559f143807ff688ff62789b7236a332b7d7255ec0b4e73e6b3a4', "iv": "8c73f0d6613898daeefa3cf8b0686d37",
'output': '005e49fb7c5da540a84b034c853fc9f78a6b901ea495aed0c2abd4f08f1a96f9ffefc6a57f1ac09e0aea95ca0f03ffd8'}, "input": "49de3cd5890e0cd0559f143807ff688ff62789b7236a332b7d7255ec0b4e73e6b3a4",
{'private': '9ef87ba8aa2e664bdfdb978b98bc30fb61773d9298e7b8c72911683eeff41921', "output": "6d220213b1878cd40a458f2a1e6e3b48040455fdf504dcd857f4f2ca1ad642e3a44fc401d04e339d302f66a9fad3d919",
'public': '441e76d7e53be0a967181076a842f69c20fd8c0e3f0ce3aa421b490b059fe094', },
'salt': '582fdf58b53715c26e10ba809e8f2ab70502e5a3d4e9a81100b7227732ab0bbc', {
'iv': '91f2aad3189bb2edc93bc891e73911ba', "private": "9ef87ba8aa2e664bdfdb978b98bc30fb61773d9298e7b8c72911683eeff41921",
'input': '49de3cd5890e0cd0559f143807ff688ff62789b7236a332b7d7255ec0b4e73e6b3a4', "public": "441e76d7e53be0a967181076a842f69c20fd8c0e3f0ce3aa421b490b059fe094",
'output': '821a69cb16c57f0cb866e590b38069e35faec3ae18f158bb067db83a11237d29ab1e6b868b3147236a0958f15c2e2167'}, "salt": "cf4a21cb790552165827b678ca9695fcaf77566d382325112ff79483455de667",
{'private': '9ef87ba8aa2e664bdfdb978b98bc30fb61773d9298e7b8c72911683eeff41921', "iv": "bfbf5482e06f55b88bdd9e053b7eee6e",
'public': '441e76d7e53be0a967181076a842f69c20fd8c0e3f0ce3aa421b490b059fe094', "input": "49de3cd5890e0cd0559f143807ff688ff62789b7236a332b7d7255ec0b4e73e6b3a4",
'salt': 'a415b4c006118fb72fc37b2746ef288e23ac45c8ff7ade5f368a31557b6ac93a', "output": "1198a78c29c215d5c450f7b8513ead253160bc9fde80d9cc8e6bee2efe9713cf5a09d6293c41033271c9e8c22036a28b",
'iv': '2b7c5f75606c0b8106c6489ea5657a9e', },
'input': '24512b714aefd5cbc4bcc4ef44ce6c67ffc447c65460a6c6e4a92e85', {
'output': '2781d5ee8ef1cb1596f8902b33dfae5045f84a987ca58173af5830dbce386062'}, "private": "9ef87ba8aa2e664bdfdb978b98bc30fb61773d9298e7b8c72911683eeff41921",
{'private': 'ed93c5a101ab53382ceee4f7e6b5aa112621d3bb9d18891509b1834ede235bcc', "public": "441e76d7e53be0a967181076a842f69c20fd8c0e3f0ce3aa421b490b059fe094",
'public': '5a5e14c633d7d269302849d739d80344ff14db51d7bcda86045723f05c4e4541', "salt": "eba5eae8aef79114082c3e70baef95bb02edf13b3897e8be7a70272962ef8838",
'salt': '47e73ec362ea82d3a7c5d55532ad51d2cdf5316b981b2b2bd542b0efa027e8ea', "iv": "af9a56da3da18e2fbd2948a16332532b",
'iv': 'b2193f59030c8d05a7d3577b7f64dd33', "input": "49de3cd5890e0cd0559f143807ff688ff62789b7236a332b7d7255ec0b4e73e6b3a4",
'input': '24512b714aefd5cbc4bcc4ef44ce6c67ffc447c65460a6c6e4a92e85', "output": "1062ab5fbbdee9042ad35bdadfd3047c0a2127fe0f001da1be1b0582185edfc9687be8d68f85795833bb04af9cedd3bb",
'output': '3f43912db8dd6672b9996e5272e18c4b88fec9d7e8372db9c5f4709a4af1d86f'}, },
{'private': 'ed93c5a101ab53382ceee4f7e6b5aa112621d3bb9d18891509b1834ede235bcc', {
'public': '5a5e14c633d7d269302849d739d80344ff14db51d7bcda86045723f05c4e4541', "private": "9ef87ba8aa2e664bdfdb978b98bc30fb61773d9298e7b8c72911683eeff41921",
'salt': 'aaa006c57b6d1e402650577fe9787d8d285f4bacd7c01f998be49c766f8860c7', "public": "441e76d7e53be0a967181076a842f69c20fd8c0e3f0ce3aa421b490b059fe094",
'iv': '130304ddb9adc8870cf56bcae9487b7f', "salt": "518f8dfd0c138f1ffb4ea8029db15441d70abd893c3d767dc668f23ba7770e27",
'input': '24512b714aefd5cbc4bcc4ef44ce6c67ffc447c65460a6c6e4a92e85', "iv": "42d28307974a1b2a2d921d270cfce03b",
'output': '878cc7d8c0ef8dac0182a78eedc8080a402f59d8062a6b4ca8f4a74f3c3b3de7'}, "input": "49de3cd5890e0cd0559f143807ff688ff62789b7236a332b7d7255ec0b4e73e6b3a4",
{'private': 'ed93c5a101ab53382ceee4f7e6b5aa112621d3bb9d18891509b1834ede235bcc', "output": "005e49fb7c5da540a84b034c853fc9f78a6b901ea495aed0c2abd4f08f1a96f9ffefc6a57f1ac09e0aea95ca0f03ffd8",
'public': '5a5e14c633d7d269302849d739d80344ff14db51d7bcda86045723f05c4e4541', },
'salt': '28dc7ccd6c2a939eef64b8be7b9ae248295e7fcd8471c22fa2f98733fea97611', {
'iv': 'cb13890d3a11bc0a7433738263006710', "private": "9ef87ba8aa2e664bdfdb978b98bc30fb61773d9298e7b8c72911683eeff41921",
'input': '24512b714aefd5cbc4bcc4ef44ce6c67ffc447c65460a6c6e4a92e85', "public": "441e76d7e53be0a967181076a842f69c20fd8c0e3f0ce3aa421b490b059fe094",
'output': 'e74ded846bebfa912fa1720e4c1415e6e5df7e7a1a7fedb5665d68f1763209a4'}, "salt": "582fdf58b53715c26e10ba809e8f2ab70502e5a3d4e9a81100b7227732ab0bbc",
{'private': 'ed93c5a101ab53382ceee4f7e6b5aa112621d3bb9d18891509b1834ede235bcc', "iv": "91f2aad3189bb2edc93bc891e73911ba",
'public': '5a5e14c633d7d269302849d739d80344ff14db51d7bcda86045723f05c4e4541', "input": "49de3cd5890e0cd0559f143807ff688ff62789b7236a332b7d7255ec0b4e73e6b3a4",
'salt': '79974fa2cad95154d0873902c153ccc3e7d54b17f2eeb3f29b6344cad9365a9a', "output": "821a69cb16c57f0cb866e590b38069e35faec3ae18f158bb067db83a11237d29ab1e6b868b3147236a0958f15c2e2167",
'iv': '22123357979d20f44cc8eb0263d84e0e', },
'input': '24512b714aefd5cbc4bcc4ef44ce6c67ffc447c65460a6c6e4a92e85', {
'output': 'eb14dec7b8b64d81a2ee4db07b0adf144d4f79a519bbf332b823583fa2d45405'}, "private": "9ef87ba8aa2e664bdfdb978b98bc30fb61773d9298e7b8c72911683eeff41921",
{'private': 'ed93c5a101ab53382ceee4f7e6b5aa112621d3bb9d18891509b1834ede235bcc', "public": "441e76d7e53be0a967181076a842f69c20fd8c0e3f0ce3aa421b490b059fe094",
'public': '5a5e14c633d7d269302849d739d80344ff14db51d7bcda86045723f05c4e4541', "salt": "a415b4c006118fb72fc37b2746ef288e23ac45c8ff7ade5f368a31557b6ac93a",
'salt': '3409a6f8c4dcd9bd04144eb67e55a98696b674735b01bf1196191f29871ef966', "iv": "2b7c5f75606c0b8106c6489ea5657a9e",
'iv': 'a823a0965969380ea1f8659ea5fd8fdd', "input": "24512b714aefd5cbc4bcc4ef44ce6c67ffc447c65460a6c6e4a92e85",
'input': '24512b714aefd5cbc4bcc4ef44ce6c67ffc447c65460a6c6e4a92e85', "output": "2781d5ee8ef1cb1596f8902b33dfae5045f84a987ca58173af5830dbce386062",
'output': '00a7eb708eae745847173f8217efb05be13059710aee632e3f471ac3c6202b51'}, },
{
"private": "ed93c5a101ab53382ceee4f7e6b5aa112621d3bb9d18891509b1834ede235bcc",
"public": "5a5e14c633d7d269302849d739d80344ff14db51d7bcda86045723f05c4e4541",
"salt": "47e73ec362ea82d3a7c5d55532ad51d2cdf5316b981b2b2bd542b0efa027e8ea",
"iv": "b2193f59030c8d05a7d3577b7f64dd33",
"input": "24512b714aefd5cbc4bcc4ef44ce6c67ffc447c65460a6c6e4a92e85",
"output": "3f43912db8dd6672b9996e5272e18c4b88fec9d7e8372db9c5f4709a4af1d86f",
},
{
"private": "ed93c5a101ab53382ceee4f7e6b5aa112621d3bb9d18891509b1834ede235bcc",
"public": "5a5e14c633d7d269302849d739d80344ff14db51d7bcda86045723f05c4e4541",
"salt": "aaa006c57b6d1e402650577fe9787d8d285f4bacd7c01f998be49c766f8860c7",
"iv": "130304ddb9adc8870cf56bcae9487b7f",
"input": "24512b714aefd5cbc4bcc4ef44ce6c67ffc447c65460a6c6e4a92e85",
"output": "878cc7d8c0ef8dac0182a78eedc8080a402f59d8062a6b4ca8f4a74f3c3b3de7",
},
{
"private": "ed93c5a101ab53382ceee4f7e6b5aa112621d3bb9d18891509b1834ede235bcc",
"public": "5a5e14c633d7d269302849d739d80344ff14db51d7bcda86045723f05c4e4541",
"salt": "28dc7ccd6c2a939eef64b8be7b9ae248295e7fcd8471c22fa2f98733fea97611",
"iv": "cb13890d3a11bc0a7433738263006710",
"input": "24512b714aefd5cbc4bcc4ef44ce6c67ffc447c65460a6c6e4a92e85",
"output": "e74ded846bebfa912fa1720e4c1415e6e5df7e7a1a7fedb5665d68f1763209a4",
},
{
"private": "ed93c5a101ab53382ceee4f7e6b5aa112621d3bb9d18891509b1834ede235bcc",
"public": "5a5e14c633d7d269302849d739d80344ff14db51d7bcda86045723f05c4e4541",
"salt": "79974fa2cad95154d0873902c153ccc3e7d54b17f2eeb3f29b6344cad9365a9a",
"iv": "22123357979d20f44cc8eb0263d84e0e",
"input": "24512b714aefd5cbc4bcc4ef44ce6c67ffc447c65460a6c6e4a92e85",
"output": "eb14dec7b8b64d81a2ee4db07b0adf144d4f79a519bbf332b823583fa2d45405",
},
{
"private": "ed93c5a101ab53382ceee4f7e6b5aa112621d3bb9d18891509b1834ede235bcc",
"public": "5a5e14c633d7d269302849d739d80344ff14db51d7bcda86045723f05c4e4541",
"salt": "3409a6f8c4dcd9bd04144eb67e55a98696b674735b01bf1196191f29871ef966",
"iv": "a823a0965969380ea1f8659ea5fd8fdd",
"input": "24512b714aefd5cbc4bcc4ef44ce6c67ffc447c65460a6c6e4a92e85",
"output": "00a7eb708eae745847173f8217efb05be13059710aee632e3f471ac3c6202b51",
},
] ]
for test in test_cases: for test in test_cases:
private_key = bytearray(reversed(unhexlify(test['private']))) private_key = bytearray(reversed(unhexlify(test["private"])))
node = bip32.HDNode( node = bip32.HDNode(
depth=0, depth=0,
fingerprint=0, fingerprint=0,
child_num=0, child_num=0,
chain_code=bytearray(32), chain_code=bytearray(32),
private_key=private_key, private_key=private_key,
curve_name=CURVE curve_name=CURVE,
) )
encrypted = node.nem_encrypt(unhexlify(test['public']), encrypted = node.nem_encrypt(
unhexlify(test['iv']), unhexlify(test["public"]),
unhexlify(test['salt']), unhexlify(test["iv"]),
unhexlify(test['input'])) unhexlify(test["salt"]),
unhexlify(test["input"]),
)
self.assertEqual(encrypted, unhexlify(test['output'])) self.assertEqual(encrypted, unhexlify(test["output"]))
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -23,7 +23,6 @@ def sort_mosaics(mosaics: list[NEMMosaic]) -> list[NEMMosaic]:
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin") @unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestNemMosaic(unittest.TestCase): class TestNemMosaic(unittest.TestCase):
def test_get_mosaic_definition(self): def test_get_mosaic_definition(self):
m = get_mosaic_definition("nem", "xem", 104) m = get_mosaic_definition("nem", "xem", 104)
self.assertEqual(m.name, "NEM") self.assertEqual(m.name, "NEM")

View File

@ -3,7 +3,12 @@ from common import *
from trezor.crypto import hashlib from trezor.crypto import hashlib
if not utils.BITCOIN_ONLY: if not utils.BITCOIN_ONLY:
from trezor.messages import NEMSignTx, NEMMosaicCreation, NEMMosaicDefinition, NEMTransactionCommon from trezor.messages import (
NEMSignTx,
NEMMosaicCreation,
NEMMosaicDefinition,
NEMTransactionCommon,
)
from apps.nem.helpers import * from apps.nem.helpers import *
from apps.nem.mosaic import * from apps.nem.mosaic import *
from apps.nem.mosaic.serialize import * from apps.nem.mosaic.serialize import *
@ -11,37 +16,55 @@ if not utils.BITCOIN_ONLY:
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin") @unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestNemMosaicCreation(unittest.TestCase): class TestNemMosaicCreation(unittest.TestCase):
def test_nem_transaction_mosaic_creation(self): def test_nem_transaction_mosaic_creation(self):
# http://bob.nem.ninja:8765/#/mosaic/68364353c29105e6d361ad1a42abbccbf419cfc7adb8b74c8f35d8f8bdaca3fa/0 # http://bob.nem.ninja:8765/#/mosaic/68364353c29105e6d361ad1a42abbccbf419cfc7adb8b74c8f35d8f8bdaca3fa/0
m = _create_msg(NEM_NETWORK_TESTNET, m = _create_msg(
NEM_NETWORK_TESTNET,
14070896, 14070896,
108000000, 108000000,
14074496, 14074496,
'gimre.games.pong', "gimre.games.pong",
'paddles', "paddles",
'Paddles for the bong game.\n', "Paddles for the bong game.\n",
0, 0,
10000, 10000,
True, True,
True, True,
0, 0,
0, 0,
'', "",
'', "",
'', "",
'TBMOSAICOD4F54EE5CDMR23CCBGOAM2XSJBR5OLC', "TBMOSAICOD4F54EE5CDMR23CCBGOAM2XSJBR5OLC",
50000000000) 50000000000,
)
t = serialize_mosaic_creation(m.transaction, m.mosaic_creation, unhexlify('994793ba1c789fa9bdea918afc9b06e2d0309beb1081ac5b6952991e4defd324')) t = serialize_mosaic_creation(
m.transaction,
m.mosaic_creation,
unhexlify(
"994793ba1c789fa9bdea918afc9b06e2d0309beb1081ac5b6952991e4defd324"
),
)
self.assertEqual(t, unhexlify('014000000100009870b4d60020000000994793ba1c789fa9bdea918afc9b06e2d0309beb1081ac5b6952991e4defd32400f36f060000000080c2d600de00000020000000994793ba1c789fa9bdea918afc9b06e2d0309beb1081ac5b6952991e4defd3241f0000001000000067696d72652e67616d65732e706f6e6707000000706164646c65731b000000506164646c657320666f722074686520626f6e672067616d652e0a04000000150000000c00000064697669736962696c69747901000000301a0000000d000000696e697469616c537570706c79050000003130303030190000000d000000737570706c794d757461626c650400000074727565180000000c0000007472616e7366657261626c650400000074727565000000002800000054424d4f534149434f443446353445453543444d523233434342474f414d3258534a4252354f4c4300743ba40b000000')) self.assertEqual(
self.assertEqual(hashlib.sha3_256(t, keccak=True).digest(), unhexlify('68364353c29105e6d361ad1a42abbccbf419cfc7adb8b74c8f35d8f8bdaca3fa')) t,
unhexlify(
"014000000100009870b4d60020000000994793ba1c789fa9bdea918afc9b06e2d0309beb1081ac5b6952991e4defd32400f36f060000000080c2d600de00000020000000994793ba1c789fa9bdea918afc9b06e2d0309beb1081ac5b6952991e4defd3241f0000001000000067696d72652e67616d65732e706f6e6707000000706164646c65731b000000506164646c657320666f722074686520626f6e672067616d652e0a04000000150000000c00000064697669736962696c69747901000000301a0000000d000000696e697469616c537570706c79050000003130303030190000000d000000737570706c794d757461626c650400000074727565180000000c0000007472616e7366657261626c650400000074727565000000002800000054424d4f534149434f443446353445453543444d523233434342474f414d3258534a4252354f4c4300743ba40b000000"
),
)
self.assertEqual(
hashlib.sha3_256(t, keccak=True).digest(),
unhexlify(
"68364353c29105e6d361ad1a42abbccbf419cfc7adb8b74c8f35d8f8bdaca3fa"
),
)
def test_nem_transaction_mosaic_creation_with_levy(self): def test_nem_transaction_mosaic_creation_with_levy(self):
# http://bob.nem.ninja:8765/#/mosaic/b2f4a98113ff1f3a8f1e9d7197aa982545297fe0aa3fa6094af8031569953a55/0 # http://bob.nem.ninja:8765/#/mosaic/b2f4a98113ff1f3a8f1e9d7197aa982545297fe0aa3fa6094af8031569953a55/0
m = _create_msg(NEM_NETWORK_TESTNET, m = _create_msg(
NEM_NETWORK_TESTNET,
21497248, 21497248,
108000000, 108000000,
21500848, 21500848,
@ -58,14 +81,27 @@ class TestNemMosaicCreation(unittest.TestCase):
"nem", "nem",
"xem", "xem",
"TBMOSAICOD4F54EE5CDMR23CCBGOAM2XSJBR5OLC", "TBMOSAICOD4F54EE5CDMR23CCBGOAM2XSJBR5OLC",
50000000000) 50000000000,
)
t = serialize_mosaic_creation(m.transaction, m.mosaic_creation, unhexlify("244fa194e2509ac0d2fbc18779c2618d8c2ebb61c16a3bcbebcf448c661ba8dc"),) t = serialize_mosaic_creation(
m.transaction,
m.mosaic_creation,
unhexlify(
"244fa194e2509ac0d2fbc18779c2618d8c2ebb61c16a3bcbebcf448c661ba8dc"
),
)
self.assertEqual(hashlib.sha3_256(t, keccak=True).digest(), unhexlify('b2f4a98113ff1f3a8f1e9d7197aa982545297fe0aa3fa6094af8031569953a55')) self.assertEqual(
hashlib.sha3_256(t, keccak=True).digest(),
unhexlify(
"b2f4a98113ff1f3a8f1e9d7197aa982545297fe0aa3fa6094af8031569953a55"
),
)
# http://chain.nem.ninja/#/mosaic/e8dc14821dbea4831d9051f86158ef348001447968fc22c01644fdaf2bda75c6/0 # http://chain.nem.ninja/#/mosaic/e8dc14821dbea4831d9051f86158ef348001447968fc22c01644fdaf2bda75c6/0
m = _create_msg(NEM_NETWORK_MAINNET, m = _create_msg(
NEM_NETWORK_MAINNET,
69251020, 69251020,
20000000, 20000000,
69337420, 69337420,
@ -82,15 +118,33 @@ class TestNemMosaicCreation(unittest.TestCase):
"dim", "dim",
"coin", "coin",
"NBMOSAICOD4F54EE5CDMR23CCBGOAM2XSIUX6TRS", "NBMOSAICOD4F54EE5CDMR23CCBGOAM2XSIUX6TRS",
500000000) 500000000,
)
t = serialize_mosaic_creation(m.transaction, m.mosaic_creation, unhexlify("a1df5306355766bd2f9a64efdc089eb294be265987b3359093ae474c051d7d5a")) t = serialize_mosaic_creation(
self.assertEqual(t, unhexlify('0140000001000068ccaf200420000000a1df5306355766bd2f9a64efdc089eb294be265987b3359093ae474c051d7d5a002d3101000000004c0122040c01000020000000a1df5306355766bd2f9a64efdc089eb294be265987b3359093ae474c051d7d5a0f0000000300000064696d04000000636f696e0800000044494d20434f494e04000000150000000c00000064697669736962696c69747901000000361f0000000d000000696e697469616c537570706c790a000000393030303030303030301a0000000d000000737570706c794d757461626c650500000066616c7365180000000c0000007472616e7366657261626c6504000000747275654b00000002000000280000004e4347474c564f32473343554143564935474e58324b52424a5351434e3452444c325a574a3444500f0000000300000064696d04000000636f696e0a00000000000000280000004e424d4f534149434f443446353445453543444d523233434342474f414d325853495558365452530065cd1d00000000')) m.transaction,
self.assertEqual(hashlib.sha3_256(t, keccak=True).digest(), unhexlify('e8dc14821dbea4831d9051f86158ef348001447968fc22c01644fdaf2bda75c6')) m.mosaic_creation,
unhexlify(
"a1df5306355766bd2f9a64efdc089eb294be265987b3359093ae474c051d7d5a"
),
)
self.assertEqual(
t,
unhexlify(
"0140000001000068ccaf200420000000a1df5306355766bd2f9a64efdc089eb294be265987b3359093ae474c051d7d5a002d3101000000004c0122040c01000020000000a1df5306355766bd2f9a64efdc089eb294be265987b3359093ae474c051d7d5a0f0000000300000064696d04000000636f696e0800000044494d20434f494e04000000150000000c00000064697669736962696c69747901000000361f0000000d000000696e697469616c537570706c790a000000393030303030303030301a0000000d000000737570706c794d757461626c650500000066616c7365180000000c0000007472616e7366657261626c6504000000747275654b00000002000000280000004e4347474c564f32473343554143564935474e58324b52424a5351434e3452444c325a574a3444500f0000000300000064696d04000000636f696e0a00000000000000280000004e424d4f534149434f443446353445453543444d523233434342474f414d325853495558365452530065cd1d00000000"
),
)
self.assertEqual(
hashlib.sha3_256(t, keccak=True).digest(),
unhexlify(
"e8dc14821dbea4831d9051f86158ef348001447968fc22c01644fdaf2bda75c6"
),
)
def test_nem_transaction_mosaic_creation_with_description(self): def test_nem_transaction_mosaic_creation_with_description(self):
# http://chain.nem.ninja/#/mosaic/269c6fda657aba3053a0e5b138c075808cc20e244e1182d9b730798b60a1f77b/0 # http://chain.nem.ninja/#/mosaic/269c6fda657aba3053a0e5b138c075808cc20e244e1182d9b730798b60a1f77b/0
m = _create_msg(NEM_NETWORK_MAINNET, m = _create_msg(
NEM_NETWORK_MAINNET,
26729938, 26729938,
108000000, 108000000,
26733538, 26733538,
@ -111,18 +165,50 @@ class TestNemMosaicCreation(unittest.TestCase):
"", "",
"", "",
"NBMOSAICOD4F54EE5CDMR23CCBGOAM2XSIUX6TRS", "NBMOSAICOD4F54EE5CDMR23CCBGOAM2XSIUX6TRS",
50000000000) 50000000000,
t = serialize_mosaic_creation(m.transaction, m.mosaic_creation, unhexlify("58956ac77951622dc5f1c938affbf017c458e30e6b21ddb5783d38b302531f23")) )
t = serialize_mosaic_creation(
m.transaction,
m.mosaic_creation,
unhexlify(
"58956ac77951622dc5f1c938affbf017c458e30e6b21ddb5783d38b302531f23"
),
)
self.assertEqual(t, unhexlify('0140000001000068d2dd97012000000058956ac77951622dc5f1c938affbf017c458e30e6b21ddb5783d38b302531f2300f36f0600000000e2eb9701c80100002000000058956ac77951622dc5f1c938affbf017c458e30e6b21ddb5783d38b302531f2317000000060000006a61626f3338090000007265645f746f6b656e0c0100005468697320746f6b656e20697320746f2063656c656272617465207468652072656c65617365206f66204e616d6573706163657320616e64204d6f7361696373206f6e20746865204e454d2073797374656d2e205468697320746f6b656e207761732074686520666973742065766572206d6f736169632063726561746564206f74686572207468616e206e656d2e78656d2e20546865726520617265206f6e6c792031302c3030302052656420546f6b656e7320746861742077696c6c206576657220626520637265617465642e20497420686173206e6f206c65767920616e642063616e2062652074726164656420667265656c7920616d6f6e6720746869726420706172746965732e04000000150000000c00000064697669736962696c69747901000000321a0000000d000000696e697469616c537570706c790500000031303030301a0000000d000000737570706c794d757461626c650500000066616c7365180000000c0000007472616e7366657261626c65040000007472756500000000280000004e424d4f534149434f443446353445453543444d523233434342474f414d3258534955583654525300743ba40b000000')) self.assertEqual(
self.assertEqual(hashlib.sha3_256(t, keccak=True).digest(), unhexlify('269c6fda657aba3053a0e5b138c075808cc20e244e1182d9b730798b60a1f77b')) t,
unhexlify(
"0140000001000068d2dd97012000000058956ac77951622dc5f1c938affbf017c458e30e6b21ddb5783d38b302531f2300f36f0600000000e2eb9701c80100002000000058956ac77951622dc5f1c938affbf017c458e30e6b21ddb5783d38b302531f2317000000060000006a61626f3338090000007265645f746f6b656e0c0100005468697320746f6b656e20697320746f2063656c656272617465207468652072656c65617365206f66204e616d6573706163657320616e64204d6f7361696373206f6e20746865204e454d2073797374656d2e205468697320746f6b656e207761732074686520666973742065766572206d6f736169632063726561746564206f74686572207468616e206e656d2e78656d2e20546865726520617265206f6e6c792031302c3030302052656420546f6b656e7320746861742077696c6c206576657220626520637265617465642e20497420686173206e6f206c65767920616e642063616e2062652074726164656420667265656c7920616d6f6e6720746869726420706172746965732e04000000150000000c00000064697669736962696c69747901000000321a0000000d000000696e697469616c537570706c790500000031303030301a0000000d000000737570706c794d757461626c650500000066616c7365180000000c0000007472616e7366657261626c65040000007472756500000000280000004e424d4f534149434f443446353445453543444d523233434342474f414d3258534955583654525300743ba40b000000"
),
)
self.assertEqual(
hashlib.sha3_256(t, keccak=True).digest(),
unhexlify(
"269c6fda657aba3053a0e5b138c075808cc20e244e1182d9b730798b60a1f77b"
),
)
def _create_msg(network: int, timestamp: int, fee: int, deadline: int, def _create_msg(
namespace: str, mosaic: str, description: str, network: int,
divisibility: int, supply: int, mutable_supply: bool, transferable: bool, timestamp: int,
levy_type: int, levy_fee: int, levy_address: str, levy_namespace: str, fee: int,
levy_mosaic: str, creation_sink: str, creation_fee: int): deadline: int,
namespace: str,
mosaic: str,
description: str,
divisibility: int,
supply: int,
mutable_supply: bool,
transferable: bool,
levy_type: int,
levy_fee: int,
levy_address: str,
levy_namespace: str,
levy_mosaic: str,
creation_sink: str,
creation_fee: int,
):
transaction = NEMTransactionCommon( transaction = NEMTransactionCommon(
network=network, network=network,
timestamp=timestamp, timestamp=timestamp,
@ -146,7 +232,7 @@ def _create_msg(network: int, timestamp: int, fee: int, deadline: int,
levy_address=levy_address, levy_address=levy_address,
levy_namespace=levy_namespace, levy_namespace=levy_namespace,
levy_mosaic=levy_mosaic, levy_mosaic=levy_mosaic,
) ),
) )
return NEMSignTx( return NEMSignTx(
@ -155,5 +241,5 @@ def _create_msg(network: int, timestamp: int, fee: int, deadline: int,
) )
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -8,70 +8,119 @@ if not utils.BITCOIN_ONLY:
from apps.nem.mosaic.serialize import * from apps.nem.mosaic.serialize import *
from trezor.messages import NEMSignTx, NEMMosaicSupplyChange, NEMTransactionCommon from trezor.messages import NEMSignTx, NEMMosaicSupplyChange, NEMTransactionCommon
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin") @unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestNemMosaicSupplyChange(unittest.TestCase): class TestNemMosaicSupplyChange(unittest.TestCase):
def test_nem_transaction_create_mosaic_supply_change(self): def test_nem_transaction_create_mosaic_supply_change(self):
# http://bigalice2.nem.ninja:7890/transaction/get?hash=33a50fdd4a54913643a580b2af08b9a5b51b7cee922bde380e84c573a7969c50 # http://bigalice2.nem.ninja:7890/transaction/get?hash=33a50fdd4a54913643a580b2af08b9a5b51b7cee922bde380e84c573a7969c50
m = _create_msg(NEM_NETWORK_TESTNET, m = _create_msg(
NEM_NETWORK_TESTNET,
14071648, 14071648,
108000000, 108000000,
14075248, 14075248,
"gimre.games.pong", "gimre.games.pong",
"paddles", "paddles",
1, 1,
1234) 1234,
t = serialize_mosaic_supply_change(m.transaction, m.supply_change, unhexlify("994793ba1c789fa9bdea918afc9b06e2d0309beb1081ac5b6952991e4defd324")) )
t = serialize_mosaic_supply_change(
m.transaction,
m.supply_change,
unhexlify(
"994793ba1c789fa9bdea918afc9b06e2d0309beb1081ac5b6952991e4defd324"
),
)
self.assertEqual(hashlib.sha3_256(t, keccak=True).digest(), self.assertEqual(
unhexlify('33a50fdd4a54913643a580b2af08b9a5b51b7cee922bde380e84c573a7969c50')) hashlib.sha3_256(t, keccak=True).digest(),
unhexlify(
"33a50fdd4a54913643a580b2af08b9a5b51b7cee922bde380e84c573a7969c50"
),
)
# http://bigalice2.nem.ninja:7890/transaction/get?hash=1ce8e8894d077a66ff22294b000825d090a60742ec407efd80eb8b19657704f2 # http://bigalice2.nem.ninja:7890/transaction/get?hash=1ce8e8894d077a66ff22294b000825d090a60742ec407efd80eb8b19657704f2
m = _create_msg(NEM_NETWORK_TESTNET, m = _create_msg(
NEM_NETWORK_TESTNET,
14126909, 14126909,
108000000, 108000000,
14130509, 14130509,
"jabo38_ltd.fuzzy_kittens_cafe", "jabo38_ltd.fuzzy_kittens_cafe",
"coupons", "coupons",
2, 2,
1) 1,
t = serialize_mosaic_supply_change(m.transaction, m.supply_change, unhexlify("84afa1bbc993b7f5536344914dde86141e61f8cbecaf8c9cefc07391f3287cf5")) )
t = serialize_mosaic_supply_change(
m.transaction,
m.supply_change,
unhexlify(
"84afa1bbc993b7f5536344914dde86141e61f8cbecaf8c9cefc07391f3287cf5"
),
)
self.assertEqual(hashlib.sha3_256(t, keccak=True).digest(), self.assertEqual(
unhexlify('1ce8e8894d077a66ff22294b000825d090a60742ec407efd80eb8b19657704f2')) hashlib.sha3_256(t, keccak=True).digest(),
unhexlify(
"1ce8e8894d077a66ff22294b000825d090a60742ec407efd80eb8b19657704f2"
),
)
# http://bigalice3.nem.ninja:7890/transaction/get?hash=694e493e9576d2bcf60d85747e302ac2e1cc27783187947180d4275a713ff1ff # http://bigalice3.nem.ninja:7890/transaction/get?hash=694e493e9576d2bcf60d85747e302ac2e1cc27783187947180d4275a713ff1ff
m = _create_msg(NEM_NETWORK_MAINNET, m = _create_msg(
NEM_NETWORK_MAINNET,
53377685, 53377685,
20000000, 20000000,
53464085, 53464085,
"abvapp", "abvapp",
"abv", "abv",
1, 1,
9000000) 9000000,
t = serialize_mosaic_supply_change(m.transaction, m.supply_change, unhexlify("b7ccc27b21ba6cf5c699a8dc86ba6ba98950442597ff9fa30e0abe0f5f4dd05d")) )
t = serialize_mosaic_supply_change(
m.transaction,
m.supply_change,
unhexlify(
"b7ccc27b21ba6cf5c699a8dc86ba6ba98950442597ff9fa30e0abe0f5f4dd05d"
),
)
self.assertEqual(hashlib.sha3_256(t, keccak=True).digest(), self.assertEqual(
unhexlify('694e493e9576d2bcf60d85747e302ac2e1cc27783187947180d4275a713ff1ff')) hashlib.sha3_256(t, keccak=True).digest(),
unhexlify(
"694e493e9576d2bcf60d85747e302ac2e1cc27783187947180d4275a713ff1ff"
),
)
# http://bigalice3.nem.ninja:7890/transaction/get?hash=09836334e123970e068d5b411e4d1df54a3ead10acf1ad5935a2cdd9f9680185 # http://bigalice3.nem.ninja:7890/transaction/get?hash=09836334e123970e068d5b411e4d1df54a3ead10acf1ad5935a2cdd9f9680185
m = _create_msg(NEM_NETWORK_MAINNET, m = _create_msg(
55176304, NEM_NETWORK_MAINNET, 55176304, 20000000, 55262704, "sushi", "wasabi", 2, 20
20000000, )
55262704, t = serialize_mosaic_supply_change(
"sushi", m.transaction,
"wasabi", m.supply_change,
2, unhexlify(
20) "75f001a8641e2ce5c4386883dda561399ed346177411b492a677b73899502f13"
t = serialize_mosaic_supply_change(m.transaction, m.supply_change, unhexlify("75f001a8641e2ce5c4386883dda561399ed346177411b492a677b73899502f13")) ),
)
self.assertEqual(hashlib.sha3_256(t, keccak=True).digest(), self.assertEqual(
unhexlify('09836334e123970e068d5b411e4d1df54a3ead10acf1ad5935a2cdd9f9680185')) hashlib.sha3_256(t, keccak=True).digest(),
unhexlify(
"09836334e123970e068d5b411e4d1df54a3ead10acf1ad5935a2cdd9f9680185"
),
)
def _create_msg(network: int, timestamp: int, fee: int, deadline: int, def _create_msg(
namespace: str, mosaic: str, mod_type: int, delta: int): network: int,
timestamp: int,
fee: int,
deadline: int,
namespace: str,
mosaic: str,
mod_type: int,
delta: int,
):
transaction = NEMTransactionCommon( transaction = NEMTransactionCommon(
network=network, network=network,
timestamp=timestamp, timestamp=timestamp,
@ -92,5 +141,5 @@ def _create_msg(network: int, timestamp: int, fee: int, deadline: int,
) )
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -164,8 +164,11 @@ def _create_msg(
) )
aggregate_modification = NEMAggregateModification( aggregate_modification = NEMAggregateModification(
modifications=[NEMCosignatoryModification(type=5, public_key=b"abc") for _ in range(modifications)], modifications=[
relative_change=relative_change NEMCosignatoryModification(type=5, public_key=b"abc")
for _ in range(modifications)
],
relative_change=relative_change,
) )
return NEMSignTx( return NEMSignTx(

View File

@ -6,73 +6,141 @@ if not utils.BITCOIN_ONLY:
from apps.nem.multisig.serialize import * from apps.nem.multisig.serialize import *
from apps.nem.namespace import * from apps.nem.namespace import *
from apps.nem.namespace.serialize import * from apps.nem.namespace.serialize import *
from trezor.messages import NEMSignTx, NEMAggregateModification, NEMProvisionNamespace, NEMCosignatoryModification, NEMTransactionCommon from trezor.messages import (
NEMSignTx,
NEMAggregateModification,
NEMProvisionNamespace,
NEMCosignatoryModification,
NEMTransactionCommon,
)
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin") @unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestNemMultisig(unittest.TestCase): class TestNemMultisig(unittest.TestCase):
def test_nem_multisig(self): def test_nem_multisig(self):
# http://bob.nem.ninja:8765/#/multisig/7d3a7087023ee29005262016706818579a2b5499eb9ca76bad98c1e6f4c46642 # http://bob.nem.ninja:8765/#/multisig/7d3a7087023ee29005262016706818579a2b5499eb9ca76bad98c1e6f4c46642
m = _create_msg(NEM_NETWORK_TESTNET, m = _create_msg(NEM_NETWORK_TESTNET, 3939039, 16000000, 3960639, 1, 0)
3939039, base_tx = serialize_aggregate_modification(
16000000, m.transaction,
3960639, m.aggregate_modification,
1, unhexlify(
0) "abac2ee3d4aaa7a3bfb65261a00cc04c761521527dd3f2cf741e2815cbba83ac"
base_tx = serialize_aggregate_modification(m.transaction, m.aggregate_modification, unhexlify("abac2ee3d4aaa7a3bfb65261a00cc04c761521527dd3f2cf741e2815cbba83ac")) ),
)
write_cosignatory_modification(base_tx, 2, unhexlify("e6cff9b3725a91f31089c3acca0fac3e341c00b1c8c6e9578f66c4514509c3b3")) write_cosignatory_modification(
m = _create_common_msg(NEM_NETWORK_TESTNET, base_tx,
3939039, 2,
6000000, unhexlify(
3960639) "e6cff9b3725a91f31089c3acca0fac3e341c00b1c8c6e9578f66c4514509c3b3"
multisig = serialize_multisig(m, unhexlify("59d89076964742ef2a2089d26a5aa1d2c7a7bb052a46c1de159891e91ad3d76e"), base_tx) ),
)
m = _create_common_msg(NEM_NETWORK_TESTNET, 3939039, 6000000, 3960639)
multisig = serialize_multisig(
m,
unhexlify(
"59d89076964742ef2a2089d26a5aa1d2c7a7bb052a46c1de159891e91ad3d76e"
),
base_tx,
)
self.assertEqual(multisig, unhexlify("0410000001000098df1a3c002000000059d89076964742ef2a2089d26a5aa1d2c7a7bb052a46c1de159891e91ad3d76e808d5b00000000003f6f3c006c0000000110000001000098df1a3c0020000000abac2ee3d4aaa7a3bfb65261a00cc04c761521527dd3f2cf741e2815cbba83ac0024f400000000003f6f3c0001000000280000000200000020000000e6cff9b3725a91f31089c3acca0fac3e341c00b1c8c6e9578f66c4514509c3b3")) self.assertEqual(
multisig,
unhexlify(
"0410000001000098df1a3c002000000059d89076964742ef2a2089d26a5aa1d2c7a7bb052a46c1de159891e91ad3d76e808d5b00000000003f6f3c006c0000000110000001000098df1a3c0020000000abac2ee3d4aaa7a3bfb65261a00cc04c761521527dd3f2cf741e2815cbba83ac0024f400000000003f6f3c0001000000280000000200000020000000e6cff9b3725a91f31089c3acca0fac3e341c00b1c8c6e9578f66c4514509c3b3"
),
)
address_pubkey = unhexlify("abac2ee3d4aaa7a3bfb65261a00cc04c761521527dd3f2cf741e2815cbba83ac") address_pubkey = unhexlify(
m = _create_common_msg(NEM_NETWORK_TESTNET, "abac2ee3d4aaa7a3bfb65261a00cc04c761521527dd3f2cf741e2815cbba83ac"
3939891, )
6000000, m = _create_common_msg(NEM_NETWORK_TESTNET, 3939891, 6000000, 3961491)
3961491) multisig = serialize_multisig_signature(
multisig = serialize_multisig_signature(m, unhexlify("71cba4f2a28fd19f902ba40e9937994154d9eeaad0631d25d525ec37922567d4"), base_tx, address_pubkey) m,
unhexlify(
"71cba4f2a28fd19f902ba40e9937994154d9eeaad0631d25d525ec37922567d4"
),
base_tx,
address_pubkey,
)
self.assertEqual(multisig, unhexlify("0210000001000098331e3c002000000071cba4f2a28fd19f902ba40e9937994154d9eeaad0631d25d525ec37922567d4808d5b000000000093723c0024000000200000008ec165580bdabfd31ce6007a1748ce5bdf30eab7a214743097de3bc822ac7e002800000054435258595551494d464137414f474c354c463359574c43375641424c59554d4a35414342554e4c")) self.assertEqual(
multisig,
unhexlify(
"0210000001000098331e3c002000000071cba4f2a28fd19f902ba40e9937994154d9eeaad0631d25d525ec37922567d4808d5b000000000093723c0024000000200000008ec165580bdabfd31ce6007a1748ce5bdf30eab7a214743097de3bc822ac7e002800000054435258595551494d464137414f474c354c463359574c43375641424c59554d4a35414342554e4c"
),
)
def test_nem_multisig_2(self): def test_nem_multisig_2(self):
# http://chain.nem.ninja/#/multisig/1016cf3bdd61bd57b9b2b07b6ff2dee390279d8d899265bdc23d42360abe2e6c # http://chain.nem.ninja/#/multisig/1016cf3bdd61bd57b9b2b07b6ff2dee390279d8d899265bdc23d42360abe2e6c
m = _create_provision_msg(NEM_NETWORK_MAINNET, m = _create_provision_msg(
NEM_NETWORK_MAINNET,
59414272, 59414272,
20000000, 20000000,
59500672, 59500672,
"dim", "dim",
"", "",
"NAMESPACEWH4MKFMBCVFERDPOOP4FK7MTBXDPZZA", "NAMESPACEWH4MKFMBCVFERDPOOP4FK7MTBXDPZZA",
5000000000) 5000000000,
base_tx = serialize_provision_namespace(m.transaction, m.provision_namespace, unhexlify("a1df5306355766bd2f9a64efdc089eb294be265987b3359093ae474c051d7d5a")) )
base_tx = serialize_provision_namespace(
m.transaction,
m.provision_namespace,
unhexlify(
"a1df5306355766bd2f9a64efdc089eb294be265987b3359093ae474c051d7d5a"
),
)
m = _create_common_msg(NEM_NETWORK_MAINNET, m = _create_common_msg(NEM_NETWORK_MAINNET, 59414272, 6000000, 59500672)
59414272,
6000000,
59500672)
multisig = serialize_multisig(m, unhexlify("cfe58463f0eaebceb5d00717f8aead49171a5d7c08f6b1299bd534f11715acc9"), base_tx) multisig = serialize_multisig(
self.assertEqual(multisig, unhexlify("041000000100006800978a0320000000cfe58463f0eaebceb5d00717f8aead49171a5d7c08f6b1299bd534f11715acc9808d5b000000000080e88b037b000000012000000100006800978a0320000000a1df5306355766bd2f9a64efdc089eb294be265987b3359093ae474c051d7d5a002d31010000000080e88b03280000004e414d4553504143455748344d4b464d42435646455244504f4f5034464b374d54425844505a5a4100f2052a010000000300000064696dffffffff")) m,
unhexlify(
"cfe58463f0eaebceb5d00717f8aead49171a5d7c08f6b1299bd534f11715acc9"
),
base_tx,
)
self.assertEqual(
multisig,
unhexlify(
"041000000100006800978a0320000000cfe58463f0eaebceb5d00717f8aead49171a5d7c08f6b1299bd534f11715acc9808d5b000000000080e88b037b000000012000000100006800978a0320000000a1df5306355766bd2f9a64efdc089eb294be265987b3359093ae474c051d7d5a002d31010000000080e88b03280000004e414d4553504143455748344d4b464d42435646455244504f4f5034464b374d54425844505a5a4100f2052a010000000300000064696dffffffff"
),
)
m = _create_common_msg(NEM_NETWORK_MAINNET, m = _create_common_msg(NEM_NETWORK_MAINNET, 59414342, 6000000, 59500742)
59414342, address_pubkey = unhexlify(
6000000, "a1df5306355766bd2f9a64efdc089eb294be265987b3359093ae474c051d7d5a"
59500742) )
address_pubkey = unhexlify("a1df5306355766bd2f9a64efdc089eb294be265987b3359093ae474c051d7d5a") multisig = serialize_multisig_signature(
multisig = serialize_multisig_signature(m, unhexlify("1b49b80203007117d034e45234ffcdf402c044aeef6dbb06351f346ca892bce2"), base_tx, address_pubkey) m,
self.assertEqual(multisig, unhexlify("021000000100006846978a03200000001b49b80203007117d034e45234ffcdf402c044aeef6dbb06351f346ca892bce2808d5b0000000000c6e88b032400000020000000bfa2088f7720f89dd4664d650e321dabd02fab61b7355bc88a391a848a49786a280000004e4444524733554542354c5a5a5a4d445742453452544b5a4b37334a424850414957424843464d56")) unhexlify(
"1b49b80203007117d034e45234ffcdf402c044aeef6dbb06351f346ca892bce2"
),
base_tx,
address_pubkey,
)
self.assertEqual(
multisig,
unhexlify(
"021000000100006846978a03200000001b49b80203007117d034e45234ffcdf402c044aeef6dbb06351f346ca892bce2808d5b0000000000c6e88b032400000020000000bfa2088f7720f89dd4664d650e321dabd02fab61b7355bc88a391a848a49786a280000004e4444524733554542354c5a5a5a4d445742453452544b5a4b37334a424850414957424843464d56"
),
)
m = _create_common_msg(NEM_NETWORK_MAINNET, m = _create_common_msg(NEM_NETWORK_MAINNET, 59414381, 6000000, 59500781)
59414381, multisig = serialize_multisig_signature(
6000000, m,
59500781) unhexlify(
multisig = serialize_multisig_signature(m, unhexlify("7ba4b39209f1b9846b098fe43f74381e43cb2882ccde780f558a63355840aa87"), base_tx, address_pubkey) "7ba4b39209f1b9846b098fe43f74381e43cb2882ccde780f558a63355840aa87"
self.assertEqual(multisig, unhexlify("02100000010000686d978a03200000007ba4b39209f1b9846b098fe43f74381e43cb2882ccde780f558a63355840aa87808d5b0000000000ede88b032400000020000000bfa2088f7720f89dd4664d650e321dabd02fab61b7355bc88a391a848a49786a280000004e4444524733554542354c5a5a5a4d445742453452544b5a4b37334a424850414957424843464d56")) ),
base_tx,
address_pubkey,
)
self.assertEqual(
multisig,
unhexlify(
"02100000010000686d978a03200000007ba4b39209f1b9846b098fe43f74381e43cb2882ccde780f558a63355840aa87808d5b0000000000ede88b032400000020000000bfa2088f7720f89dd4664d650e321dabd02fab61b7355bc88a391a848a49786a280000004e4444524733554542354c5a5a5a4d445742453452544b5a4b37334a424850414957424843464d56"
),
)
def _create_common_msg(network: int, timestamp: int, fee: int, deadline: int): def _create_common_msg(network: int, timestamp: int, fee: int, deadline: int):
@ -84,11 +152,20 @@ def _create_common_msg(network: int, timestamp: int, fee: int, deadline: int):
) )
def _create_msg(network: int, timestamp: int, fee: int, deadline: int, def _create_msg(
modifications: int, relative_change: int): network: int,
timestamp: int,
fee: int,
deadline: int,
modifications: int,
relative_change: int,
):
aggregate_modification = NEMAggregateModification( aggregate_modification = NEMAggregateModification(
modifications=[NEMCosignatoryModification(type=5, public_key=b"abc") for _ in range(modifications)], modifications=[
relative_change=relative_change NEMCosignatoryModification(type=5, public_key=b"abc")
for _ in range(modifications)
],
relative_change=relative_change,
) )
return NEMSignTx( return NEMSignTx(
@ -97,8 +174,16 @@ def _create_msg(network: int, timestamp: int, fee: int, deadline: int,
) )
def _create_provision_msg(network: int, timestamp: int, fee: int, deadline: int, def _create_provision_msg(
name: str, parent: str, sink: str, rental_fee: int): network: int,
timestamp: int,
fee: int,
deadline: int,
name: str,
parent: str,
sink: str,
rental_fee: int,
):
provision_namespace = NEMProvisionNamespace( provision_namespace = NEMProvisionNamespace(
namespace=name, namespace=name,
parent=parent, parent=parent,
@ -112,6 +197,5 @@ def _create_provision_msg(network: int, timestamp: int, fee: int, deadline: int,
) )
if __name__ == "__main__":
if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -12,50 +12,96 @@ if not utils.BITCOIN_ONLY:
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin") @unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestNemNamespace(unittest.TestCase): class TestNemNamespace(unittest.TestCase):
def test_create_provision_namespace(self): def test_create_provision_namespace(self):
# http://bob.nem.ninja:8765/#/transfer/0acbf8df91e6a65dc56c56c43d65f31ff2a6a48d06fc66e78c7f3436faf3e74f # http://bob.nem.ninja:8765/#/transfer/0acbf8df91e6a65dc56c56c43d65f31ff2a6a48d06fc66e78c7f3436faf3e74f
m = _create_msg(NEM_NETWORK_TESTNET, m = _create_msg(
NEM_NETWORK_TESTNET,
56999445, 56999445,
20000000, 20000000,
57003045, 57003045,
'gimre', "gimre",
'', "",
'TAMESPACEWH4MKFMBCVFERDPOOP4FK7MTDJEYP35', "TAMESPACEWH4MKFMBCVFERDPOOP4FK7MTDJEYP35",
5000000000) 5000000000,
t = serialize_provision_namespace(m.transaction, m.provision_namespace, unhexlify('84afa1bbc993b7f5536344914dde86141e61f8cbecaf8c9cefc07391f3287cf5')) )
self.assertEqual(hashlib.sha3_256(t, keccak=True).digest(), unhexlify('f7cab28da57204d01a907c697836577a4ae755e6c9bac60dcc318494a22debb3')) t = serialize_provision_namespace(
m.transaction,
m.provision_namespace,
unhexlify(
"84afa1bbc993b7f5536344914dde86141e61f8cbecaf8c9cefc07391f3287cf5"
),
)
self.assertEqual(
hashlib.sha3_256(t, keccak=True).digest(),
unhexlify(
"f7cab28da57204d01a907c697836577a4ae755e6c9bac60dcc318494a22debb3"
),
)
# http://bob.nem.ninja:8765/#/namespace/7ddd5fe607e1bfb5606e0ac576024c318c8300d237273117d4db32a60c49524d # http://bob.nem.ninja:8765/#/namespace/7ddd5fe607e1bfb5606e0ac576024c318c8300d237273117d4db32a60c49524d
m = _create_msg(NEM_NETWORK_TESTNET, m = _create_msg(
NEM_NETWORK_TESTNET,
21496797, 21496797,
108000000, 108000000,
21500397, 21500397,
'misc', "misc",
'alice', "alice",
'TAMESPACEWH4MKFMBCVFERDPOOP4FK7MTDJEYP35', "TAMESPACEWH4MKFMBCVFERDPOOP4FK7MTDJEYP35",
5000000000) 5000000000,
t = serialize_provision_namespace(m.transaction, m.provision_namespace, unhexlify('244fa194e2509ac0d2fbc18779c2618d8c2ebb61c16a3bcbebcf448c661ba8dc')) )
t = serialize_provision_namespace(
m.transaction,
m.provision_namespace,
unhexlify(
"244fa194e2509ac0d2fbc18779c2618d8c2ebb61c16a3bcbebcf448c661ba8dc"
),
)
self.assertEqual(hashlib.sha3_256(t, keccak=True).digest(), unhexlify('7ddd5fe607e1bfb5606e0ac576024c318c8300d237273117d4db32a60c49524d')) self.assertEqual(
hashlib.sha3_256(t, keccak=True).digest(),
unhexlify(
"7ddd5fe607e1bfb5606e0ac576024c318c8300d237273117d4db32a60c49524d"
),
)
# http://chain.nem.ninja/#/namespace/57071aad93ca125dc231dc02c07ad8610cd243d35068f9b36a7d231383907569 # http://chain.nem.ninja/#/namespace/57071aad93ca125dc231dc02c07ad8610cd243d35068f9b36a7d231383907569
m = _create_msg(NEM_NETWORK_MAINNET, m = _create_msg(
NEM_NETWORK_MAINNET,
26699717, 26699717,
108000000, 108000000,
26703317, 26703317,
'sex', "sex",
'', "",
'NAMESPACEWH4MKFMBCVFERDPOOP4FK7MTBXDPZZA', "NAMESPACEWH4MKFMBCVFERDPOOP4FK7MTBXDPZZA",
50000000000) 50000000000,
t = serialize_provision_namespace(m.transaction, m.provision_namespace, unhexlify('9f3c14f304309c8b72b2821339c4428793b1518bea72d58dd01f19d523518614')) )
t = serialize_provision_namespace(
m.transaction,
m.provision_namespace,
unhexlify(
"9f3c14f304309c8b72b2821339c4428793b1518bea72d58dd01f19d523518614"
),
)
self.assertEqual(hashlib.sha3_256(t, keccak=True).digest(), unhexlify('57071aad93ca125dc231dc02c07ad8610cd243d35068f9b36a7d231383907569')) self.assertEqual(
hashlib.sha3_256(t, keccak=True).digest(),
unhexlify(
"57071aad93ca125dc231dc02c07ad8610cd243d35068f9b36a7d231383907569"
),
)
def _create_msg(network: int, timestamp: int, fee: int, deadline: int, def _create_msg(
name: str, parent: str, sink: str, rental_fee: int): network: int,
timestamp: int,
fee: int,
deadline: int,
name: str,
parent: str,
sink: str,
rental_fee: int,
):
transaction = NEMTransactionCommon( transaction = NEMTransactionCommon(
network=network, network=network,
timestamp=timestamp, timestamp=timestamp,
@ -76,5 +122,5 @@ def _create_msg(network: int, timestamp: int, fee: int, deadline: int,
) )
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -12,96 +12,177 @@ if not utils.BITCOIN_ONLY:
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin") @unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestNemTransfer(unittest.TestCase): class TestNemTransfer(unittest.TestCase):
def test_create_transfer(self): def test_create_transfer(self):
# http://bob.nem.ninja:8765/#/transfer/0acbf8df91e6a65dc56c56c43d65f31ff2a6a48d06fc66e78c7f3436faf3e74f # http://bob.nem.ninja:8765/#/transfer/0acbf8df91e6a65dc56c56c43d65f31ff2a6a48d06fc66e78c7f3436faf3e74f
m = _create_msg(NEM_NETWORK_TESTNET, m = _create_msg(
NEM_NETWORK_TESTNET,
0, 0,
0, 0,
0, 0,
'TBGIMRE4SBFRUJXMH7DVF2IBY36L2EDWZ37GVSC4', "TBGIMRE4SBFRUJXMH7DVF2IBY36L2EDWZ37GVSC4",
50000000000000) 50000000000000,
)
t = serialize_transfer(m.transaction, m.transfer, unhexlify('e59ef184a612d4c3c4d89b5950eb57262c69862b2f96e59c5043bf41765c482f'), None, False) t = serialize_transfer(
self.assertEqual(t, unhexlify('01010000010000980000000020000000e59ef184a612d4c3c4d89b5950eb57262c69862b2f96e59c5043bf41765c482f00000000000000000000000028000000544247494d52453453424652554a584d48374456463249425933364c324544575a3337475653433400203d88792d000000000000')) m.transaction,
self.assertEqual(hashlib.sha3_256(t, keccak=True).digest(), unhexlify('0acbf8df91e6a65dc56c56c43d65f31ff2a6a48d06fc66e78c7f3436faf3e74f')) m.transfer,
unhexlify(
"e59ef184a612d4c3c4d89b5950eb57262c69862b2f96e59c5043bf41765c482f"
),
None,
False,
)
self.assertEqual(
t,
unhexlify(
"01010000010000980000000020000000e59ef184a612d4c3c4d89b5950eb57262c69862b2f96e59c5043bf41765c482f00000000000000000000000028000000544247494d52453453424652554a584d48374456463249425933364c324544575a3337475653433400203d88792d000000000000"
),
)
self.assertEqual(
hashlib.sha3_256(t, keccak=True).digest(),
unhexlify(
"0acbf8df91e6a65dc56c56c43d65f31ff2a6a48d06fc66e78c7f3436faf3e74f"
),
)
def test_create_transfer_with_payload(self): def test_create_transfer_with_payload(self):
# http://chain.nem.ninja/#/transfer/e90e98614c7598fbfa4db5411db1b331d157c2f86b558fb7c943d013ed9f71cb # http://chain.nem.ninja/#/transfer/e90e98614c7598fbfa4db5411db1b331d157c2f86b558fb7c943d013ed9f71cb
m = _create_msg(NEM_NETWORK_MAINNET, m = _create_msg(
NEM_NETWORK_MAINNET,
0, 0,
0, 0,
0, 0,
'NBT3WHA2YXG2IR4PWKFFMO772JWOITTD2V4PECSB', "NBT3WHA2YXG2IR4PWKFFMO772JWOITTD2V4PECSB",
5175000000000) 5175000000000,
)
t = serialize_transfer(m.transaction, m.transfer, t = serialize_transfer(
unhexlify('8d07f90fb4bbe7715fa327c926770166a11be2e494a970605f2e12557f66c9b9'), m.transaction,
bytearray('Good luck!'), m.transfer,
False) unhexlify(
self.assertEqual(hashlib.sha3_256(t, keccak=True).digest(), unhexlify('e90e98614c7598fbfa4db5411db1b331d157c2f86b558fb7c943d013ed9f71cb')) "8d07f90fb4bbe7715fa327c926770166a11be2e494a970605f2e12557f66c9b9"
),
bytearray("Good luck!"),
False,
)
self.assertEqual(
hashlib.sha3_256(t, keccak=True).digest(),
unhexlify(
"e90e98614c7598fbfa4db5411db1b331d157c2f86b558fb7c943d013ed9f71cb"
),
)
def test_create_transfer_with_encrypted_payload(self): def test_create_transfer_with_encrypted_payload(self):
# http://chain.nem.ninja/#/transfer/40e89160e6f83d37f7c82defc0afe2c1605ae8c919134570a51dd27ea1bb516c # http://chain.nem.ninja/#/transfer/40e89160e6f83d37f7c82defc0afe2c1605ae8c919134570a51dd27ea1bb516c
m = _create_msg(NEM_NETWORK_MAINNET, m = _create_msg(
NEM_NETWORK_MAINNET,
77229, 77229,
30000000, 30000000,
80829, 80829,
'NALICEPFLZQRZGPRIJTMJOCPWDNECXTNNG7QLSG3', "NALICEPFLZQRZGPRIJTMJOCPWDNECXTNNG7QLSG3",
30000000) 30000000,
)
t = serialize_transfer(m.transaction, m.transfer, t = serialize_transfer(
unhexlify('f85ab43dad059b9d2331ddacc384ad925d3467f03207182e01296bacfb242d01'), m.transaction,
unhexlify('4d9dcf9186967d30be93d6d5404ded22812dbbae7c3f0de501bcd7228cba45bded13000eec7b4c6215fc4d3588168c9218167cec98e6977359153a4132e050f594548e61e0dc61c153f0f53c5e65c595239c9eb7c4e7d48e0f4bb8b1dd2f5ddc'), m.transfer,
True) unhexlify(
self.assertEqual(hashlib.sha3_256(t, keccak=True).digest(), unhexlify('40e89160e6f83d37f7c82defc0afe2c1605ae8c919134570a51dd27ea1bb516c')) "f85ab43dad059b9d2331ddacc384ad925d3467f03207182e01296bacfb242d01"
),
unhexlify(
"4d9dcf9186967d30be93d6d5404ded22812dbbae7c3f0de501bcd7228cba45bded13000eec7b4c6215fc4d3588168c9218167cec98e6977359153a4132e050f594548e61e0dc61c153f0f53c5e65c595239c9eb7c4e7d48e0f4bb8b1dd2f5ddc"
),
True,
)
self.assertEqual(
hashlib.sha3_256(t, keccak=True).digest(),
unhexlify(
"40e89160e6f83d37f7c82defc0afe2c1605ae8c919134570a51dd27ea1bb516c"
),
)
def test_create_transfer_with_mosaic(self): def test_create_transfer_with_mosaic(self):
# http://bob.nem.ninja:8765/#/transfer/3409d9ece28d6296d6d5e220a7e3cb8641a3fb235ffcbd20c95da64f003ace6c # http://bob.nem.ninja:8765/#/transfer/3409d9ece28d6296d6d5e220a7e3cb8641a3fb235ffcbd20c95da64f003ace6c
m = _create_msg(NEM_NETWORK_TESTNET, m = _create_msg(
NEM_NETWORK_TESTNET,
14072100, 14072100,
194000000, 194000000,
14075700, 14075700,
'TBLOODPLWOWMZ2TARX4RFPOSOWLULHXMROBN2WXI', "TBLOODPLWOWMZ2TARX4RFPOSOWLULHXMROBN2WXI",
3000000, 3000000,
2) 2,
)
t = serialize_transfer(m.transaction, m.transfer, t = serialize_transfer(
unhexlify('994793ba1c789fa9bdea918afc9b06e2d0309beb1081ac5b6952991e4defd324'), m.transaction,
bytearray('sending you 3 pairs of paddles\n'), m.transfer,
False) unhexlify(
"994793ba1c789fa9bdea918afc9b06e2d0309beb1081ac5b6952991e4defd324"
),
bytearray("sending you 3 pairs of paddles\n"),
False,
)
self.assertEqual(t, unhexlify('010100000200009824b9d60020000000994793ba1c789fa9bdea918afc9b06e2d0309beb1081ac5b6952991e4defd3248034900b0000000034c7d6002800000054424c4f4f44504c574f574d5a3254415258345246504f534f574c554c48584d524f424e32575849c0c62d000000000027000000010000001f00000073656e64696e6720796f752033207061697273206f6620706164646c65730a02000000')) self.assertEqual(
t,
unhexlify(
"010100000200009824b9d60020000000994793ba1c789fa9bdea918afc9b06e2d0309beb1081ac5b6952991e4defd3248034900b0000000034c7d6002800000054424c4f4f44504c574f574d5a3254415258345246504f534f574c554c48584d524f424e32575849c0c62d000000000027000000010000001f00000073656e64696e6720796f752033207061697273206f6620706164646c65730a02000000"
),
)
serialize_mosaic(t, 'gimre.games.pong', 'paddles', 2) serialize_mosaic(t, "gimre.games.pong", "paddles", 2)
serialize_mosaic(t, 'nem', 'xem', 44000000) serialize_mosaic(t, "nem", "xem", 44000000)
self.assertEqual(hashlib.sha3_256(t, keccak=True).digest(), unhexlify('3409d9ece28d6296d6d5e220a7e3cb8641a3fb235ffcbd20c95da64f003ace6c')) self.assertEqual(
hashlib.sha3_256(t, keccak=True).digest(),
unhexlify(
"3409d9ece28d6296d6d5e220a7e3cb8641a3fb235ffcbd20c95da64f003ace6c"
),
)
# http://chain.nem.ninja/#/transfer/882dca18dcbe075e15e0ec5a1d7e6ccd69cc0f1309ffd3fde227bfbc107b3f6e # http://chain.nem.ninja/#/transfer/882dca18dcbe075e15e0ec5a1d7e6ccd69cc0f1309ffd3fde227bfbc107b3f6e
m = _create_msg(NEM_NETWORK_MAINNET, m = _create_msg(
NEM_NETWORK_MAINNET,
26730750, 26730750,
179500000, 179500000,
26734350, 26734350,
'NBE223WPKEBHQPCYUC4U4CDUQCRRFMPZLOQLB5OP', "NBE223WPKEBHQPCYUC4U4CDUQCRRFMPZLOQLB5OP",
1000000, 1000000,
1) 1,
)
t = serialize_transfer(m.transaction, m.transfer, t = serialize_transfer(
unhexlify('f85ab43dad059b9d2331ddacc384ad925d3467f03207182e01296bacfb242d01'), m.transaction,
bytearray('enjoy! :)'), m.transfer,
False) unhexlify(
serialize_mosaic(t, 'imre.g', 'tokens', 1) "f85ab43dad059b9d2331ddacc384ad925d3467f03207182e01296bacfb242d01"
),
bytearray("enjoy! :)"),
False,
)
serialize_mosaic(t, "imre.g", "tokens", 1)
self.assertEqual(hashlib.sha3_256(t, keccak=True).digest(), unhexlify('882dca18dcbe075e15e0ec5a1d7e6ccd69cc0f1309ffd3fde227bfbc107b3f6e')) self.assertEqual(
hashlib.sha3_256(t, keccak=True).digest(),
unhexlify(
"882dca18dcbe075e15e0ec5a1d7e6ccd69cc0f1309ffd3fde227bfbc107b3f6e"
),
)
def _create_msg(network: int, timestamp: int, fee: int, deadline: int, def _create_msg(
recipient: str, amount: int, mosaics: int = 0): network: int,
timestamp: int,
fee: int,
deadline: int,
recipient: str,
amount: int,
mosaics: int = 0,
):
transaction = NEMTransactionCommon( transaction = NEMTransactionCommon(
network=network, network=network,
timestamp=timestamp, timestamp=timestamp,
@ -112,7 +193,10 @@ def _create_msg(network: int, timestamp: int, fee: int, deadline: int,
transfer = NEMTransfer( transfer = NEMTransfer(
recipient=recipient, recipient=recipient,
amount=amount, amount=amount,
mosaics=[NEMMosaic(namespace="abc", quantity=5, mosaic="mosaic") for _ in range(mosaics)], mosaics=[
NEMMosaic(namespace="abc", quantity=5, mosaic="mosaic")
for _ in range(mosaics)
],
) )
return NEMSignTx( return NEMSignTx(
@ -121,5 +205,5 @@ def _create_msg(network: int, timestamp: int, fee: int, deadline: int,
) )
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -6,17 +6,28 @@ if not utils.BITCOIN_ONLY:
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin") @unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestRippleAddress(unittest.TestCase): class TestRippleAddress(unittest.TestCase):
def test_pubkey_to_address(self): def test_pubkey_to_address(self):
addr = address_from_public_key(unhexlify('ed9434799226374926eda3b54b1b461b4abf7237962eae18528fea67595397fa32')) addr = address_from_public_key(
self.assertEqual(addr, 'rDTXLQ7ZKZVKz33zJbHjgVShjsBnqMBhmN') unhexlify(
"ed9434799226374926eda3b54b1b461b4abf7237962eae18528fea67595397fa32"
)
)
self.assertEqual(addr, "rDTXLQ7ZKZVKz33zJbHjgVShjsBnqMBhmN")
addr = address_from_public_key(unhexlify('03e2b079e9b09ae8916da8f5ee40cbda9578dbe7c820553fe4d5f872eec7b1fdd4')) addr = address_from_public_key(
self.assertEqual(addr, 'rhq549rEtUrJowuxQC2WsHNGLjAjBQdAe8') unhexlify(
"03e2b079e9b09ae8916da8f5ee40cbda9578dbe7c820553fe4d5f872eec7b1fdd4"
)
)
self.assertEqual(addr, "rhq549rEtUrJowuxQC2WsHNGLjAjBQdAe8")
addr = address_from_public_key(unhexlify('0282ee731039929e97db6aec242002e9aa62cd62b989136df231f4bb9b8b7c7eb2')) addr = address_from_public_key(
self.assertEqual(addr, 'rKzE5DTyF9G6z7k7j27T2xEas2eMo85kmw') unhexlify(
"0282ee731039929e97db6aec242002e9aa62cd62b989136df231f4bb9b8b7c7eb2"
)
)
self.assertEqual(addr, "rKzE5DTyF9G6z7k7j27T2xEas2eMo85kmw")
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -7,35 +7,72 @@ if not utils.BITCOIN_ONLY:
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin") @unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestStellarAddress(unittest.TestCase): class TestStellarAddress(unittest.TestCase):
def test_address_to_pubkey(self): def test_address_to_pubkey(self):
self.assertEqual(public_key_from_address('GBOVKZBEM2YYLOCDCUXJ4IMRKHN4LCJAE7WEAEA2KF562XFAGDBOB64V'), self.assertEqual(
unhexlify('5d55642466b185b843152e9e219151dbc5892027ec40101a517bed5ca030c2e0')) public_key_from_address(
"GBOVKZBEM2YYLOCDCUXJ4IMRKHN4LCJAE7WEAEA2KF562XFAGDBOB64V"
),
unhexlify(
"5d55642466b185b843152e9e219151dbc5892027ec40101a517bed5ca030c2e0"
),
)
self.assertEqual(public_key_from_address('GCN2K2HG53AWX2SP5UHRPMJUUHLJF2XBTGSXROTPWRGAYJCDDP63J2U6'), self.assertEqual(
unhexlify('9ba568e6eec16bea4fed0f17b134a1d692eae199a578ba6fb44c0c24431bfdb4')) public_key_from_address(
"GCN2K2HG53AWX2SP5UHRPMJUUHLJF2XBTGSXROTPWRGAYJCDDP63J2U6"
),
unhexlify(
"9ba568e6eec16bea4fed0f17b134a1d692eae199a578ba6fb44c0c24431bfdb4"
),
)
def test_pubkey_to_address(self): def test_pubkey_to_address(self):
addr = address_from_public_key(unhexlify('5d55642466b185b843152e9e219151dbc5892027ec40101a517bed5ca030c2e0')) addr = address_from_public_key(
self.assertEqual(addr, 'GBOVKZBEM2YYLOCDCUXJ4IMRKHN4LCJAE7WEAEA2KF562XFAGDBOB64V') unhexlify(
"5d55642466b185b843152e9e219151dbc5892027ec40101a517bed5ca030c2e0"
)
)
self.assertEqual(
addr, "GBOVKZBEM2YYLOCDCUXJ4IMRKHN4LCJAE7WEAEA2KF562XFAGDBOB64V"
)
addr = address_from_public_key(unhexlify('9ba568e6eec16bea4fed0f17b134a1d692eae199a578ba6fb44c0c24431bfdb4')) addr = address_from_public_key(
self.assertEqual(addr, 'GCN2K2HG53AWX2SP5UHRPMJUUHLJF2XBTGSXROTPWRGAYJCDDP63J2U6') unhexlify(
"9ba568e6eec16bea4fed0f17b134a1d692eae199a578ba6fb44c0c24431bfdb4"
)
)
self.assertEqual(
addr, "GCN2K2HG53AWX2SP5UHRPMJUUHLJF2XBTGSXROTPWRGAYJCDDP63J2U6"
)
def test_both(self): def test_both(self):
pubkey = unhexlify('dfcc77d08588601702e02de2dc603f5c5281bea23baa894ae3b3b4778e5bbe40') pubkey = unhexlify(
self.assertEqual(public_key_from_address(address_from_public_key(pubkey)), pubkey) "dfcc77d08588601702e02de2dc603f5c5281bea23baa894ae3b3b4778e5bbe40"
)
self.assertEqual(
public_key_from_address(address_from_public_key(pubkey)), pubkey
)
pubkey = unhexlify('53214e6155469c32fb882b1b1d94930d5445a78202867b7ddc6a33ad42ff4464') pubkey = unhexlify(
self.assertEqual(public_key_from_address(address_from_public_key(pubkey)), pubkey) "53214e6155469c32fb882b1b1d94930d5445a78202867b7ddc6a33ad42ff4464"
)
self.assertEqual(
public_key_from_address(address_from_public_key(pubkey)), pubkey
)
pubkey = unhexlify('5ed4690134e5ef79b290ea1e7a4b8f3b6b3bcf287463c18bfe36baa030e7efbd') pubkey = unhexlify(
self.assertEqual(public_key_from_address(address_from_public_key(pubkey)), pubkey) "5ed4690134e5ef79b290ea1e7a4b8f3b6b3bcf287463c18bfe36baa030e7efbd"
)
self.assertEqual(
public_key_from_address(address_from_public_key(pubkey)), pubkey
)
def test_invalid_address(self): def test_invalid_address(self):
with self.assertRaises(ProcessError): with self.assertRaises(ProcessError):
public_key_from_address('GCN2K2HG53AWX2SP5UHRPMJUUHLJF2XBTGSXROTPWRGAYJCDDP63J2AA') # invalid checksum public_key_from_address(
"GCN2K2HG53AWX2SP5UHRPMJUUHLJF2XBTGSXROTPWRGAYJCDDP63J2AA"
) # invalid checksum
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -89,7 +89,15 @@ class TestTezosEncoding(unittest.TestCase):
def test_tezos_encode_natural(self): def test_tezos_encode_natural(self):
inputs = [200000000000, 2000000, 159066, 200, 60000, 157000000, 0] inputs = [200000000000, 2000000, 159066, 200, 60000, 157000000, 0]
outputs = ["0080c0ee8ed20b", "008092f401", "009ab513", "008803", "00a0a907", "008085dd9501", "0000"] outputs = [
"0080c0ee8ed20b",
"008092f401",
"009ab513",
"008803",
"00a0a907",
"008085dd9501",
"0000",
]
for i, o in zip(inputs, outputs): for i, o in zip(inputs, outputs):
w = bytearray() w = bytearray()

View File

@ -23,9 +23,7 @@ class TestCredential(unittest.TestCase):
rp_id = "example.com" rp_id = "example.com"
rp_id_hash = sha256(rp_id).digest() rp_id_hash = sha256(rp_id).digest()
user_id = ( user_id = b"3082019330820138a0030201023082019330820138a003020102308201933082"
b"3082019330820138a0030201023082019330820138a003020102308201933082"
)
user_name = "johnpsmith@example.com" user_name = "johnpsmith@example.com"
@ -107,18 +105,32 @@ class TestCredential(unittest.TestCase):
c2 = U2fCredential() c2 = U2fCredential()
self.assertEqual(sorted(_distinguishable_cred_list([a1, a2, a3, b1, b2, c1, c2])), [b2, a3, a1, c1]) self.assertEqual(
self.assertEqual(sorted(_distinguishable_cred_list([c2, c1, b2, b1, a3, a2, a1])), [b2, a3, a1, c2]) sorted(_distinguishable_cred_list([a1, a2, a3, b1, b2, c1, c2])),
[b2, a3, a1, c1],
)
self.assertEqual(
sorted(_distinguishable_cred_list([c2, c1, b2, b1, a3, a2, a1])),
[b2, a3, a1, c2],
)
# Test input by creation time. # Test input by creation time.
self.assertEqual(sorted(_distinguishable_cred_list([b2, a3, c1, a2, b1, a1, c2])), [b2, a3, a1, c1]) self.assertEqual(
self.assertEqual(sorted(_distinguishable_cred_list([c2, a1, b1, a2, c1, a3, b2])), [b2, a3, a1, c2]) sorted(_distinguishable_cred_list([b2, a3, c1, a2, b1, a1, c2])),
[b2, a3, a1, c1],
)
self.assertEqual(
sorted(_distinguishable_cred_list([c2, a1, b1, a2, c1, a3, b2])),
[b2, a3, a1, c2],
)
# Test duplicities. # Test duplicities.
self.assertEqual(sorted(_distinguishable_cred_list([c1, a1, a1, c2, c1])), [a1, c1]) self.assertEqual(
sorted(_distinguishable_cred_list([c1, a1, a1, c2, c1])), [a1, c1]
)
self.assertEqual(sorted(_distinguishable_cred_list([b2, b3])), [b2]) self.assertEqual(sorted(_distinguishable_cred_list([b2, b3])), [b2])
self.assertEqual(sorted(_distinguishable_cred_list([b3, b2])), [b3]) self.assertEqual(sorted(_distinguishable_cred_list([b3, b2])), [b3])
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -2,21 +2,52 @@ from common import *
from apps.zcash.f4jumble import f4jumble, f4unjumble from apps.zcash.f4jumble import f4jumble, f4unjumble
@unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin") @unittest.skipUnless(not utils.BITCOIN_ONLY, "altcoin")
class TestZcashF4jumble(unittest.TestCase): class TestZcashF4jumble(unittest.TestCase):
def test_f4jumble(self): def test_f4jumble(self):
#source: https://github.com/zcash/librustzcash/blob/main/components/f4jumble/src/test_vectors.rs # source: https://github.com/zcash/librustzcash/blob/main/components/f4jumble/src/test_vectors.rs
TEST_VECTORS = [ TEST_VECTORS = [
{'jumbled': unhexlify('0304d029141b995da5387c125970673504d6c764d91ea6c082123770c7139ccd88ee27368cd0c0921a0444c8e5858d22'), {
'normal': unhexlify('5d7a8f739a2d9e945b0ce152a8049e294c4d6e66b164939daffa2ef6ee6921481cdd86b3cc4318d9614fc820905d042b')}, "jumbled": unhexlify(
{'jumbled': unhexlify('5271fa3321f3adbcfb075196883d542b438ec6339176537daf859841fe6a56222bff76d1662b5509a9e1079e446eeedd2e683c31aae3ee1851d7954328526be1'), "0304d029141b995da5387c125970673504d6c764d91ea6c082123770c7139ccd88ee27368cd0c0921a0444c8e5858d22"
'normal': unhexlify('b1ef9ca3f24988c7b3534201cfb1cd8dbf69b8250c18ef41294ca97993db546c1fe01f7e9c8e36d6a5e29d4e30a73594bf5098421c69378af1e40f64e125946f')}, ),
{'jumbled': unhexlify('498cf1b1ba6f4577effe64151d67469adc30acc325e326207e7d78487085b4162669f82f02f9774c0cc26ae6e1a76f1e266c6a9a8a2f4ffe8d2d676b1ed71cc47195a3f19208998f7d8cdfc0b74d2a96364d733a62b4273c77d9828aa1fa061588a7c4c88dd3d3dde02239557acfaad35c55854f4541e1a1b3bc8c17076e7316'), "normal": unhexlify(
'normal': unhexlify('62c2fa7b2fecbcb64b6968912a6381ce3dc166d56a1d62f5a8d7551db5fd9313e8c7203d996af7d477083756d59af80d06a745f44ab023752cb5b406ed8985e18130ab33362697b0e4e4c763ccb8f676495c222f7fba1e31defa3d5a57efc2e1e9b01a035587d5fb1a38e01d94903d3c3e0ad3360c1d3710acd20b183e31d49f')}, "5d7a8f739a2d9e945b0ce152a8049e294c4d6e66b164939daffa2ef6ee6921481cdd86b3cc4318d9614fc820905d042b"
{'jumbled': unhexlify('7508a3a146714f229db91b543e240633ed57853f6451c9db6d64c6e86af1b88b28704f608582c53c51ce7d5b8548827a971d2b98d41b7f6258655902440cd66ee11e84dbfac7d2a43696fd0468810a3d9637c3fa58e7d2d341ef250fa09b9fb71a78a41d389370138a55ea58fcde779d714a04e0d30e61dc2d8be0da61cd684509'), ),
'normal': unhexlify('25c9a138f49b1a537edcf04be34a9851a7af9db6990ed83dd64af3597c04323ea51b0052ad8084a8b9da948d320dadd64f5431e61ddf658d24ae67c22c8d1309131fc00fe7f235734276d38d47f1e191e00c7a1d48af046827591e9733a97fa6b679f3dc601d008285edcbdae69ce8fc1be4aac00ff2711ebd931de518856878f7')}, },
{'jumbled': unhexlify('5139912fe8b95492c12731995a0f4478dbeb81ec36653a21bc80d673f3c6a0feef70b6c566f9d34bb726c098648382d105afb19b2b8486b73cbd47a17a0d2d1fd593b14bb9826c5d114b850c6f0cf3083a6f61e38e42713a37ef7997ebd2b376c8a410d797b3932e5a6e39e726b2894ce79604b4ae3c00acaea3be2c1dfe697fa644755102cf9ad78794d0594585494fe38ab56fa6ef3271a68a33481015adf3944c115311421a7dc3ce73ef2abf47e18a6aca7f9dd25a85ce8dbd6f1ad89c8d'), {
'normal': unhexlify('3476f21a482ec9378365c8f7393c94e2885315eb4671098b79535e790fe53e29fef2b3766697ac32b4f473f468a008e72389fc03880d780cb07fcfaabe3f1a84b27db59a4a153d882d2b2103596555ed9494c6ac893c49723833ec8926c1039586a7afcf4a0d9c731e985d99589c8bb838e8aaf745533ed9e8ae3a1cd074a51a20da8aba18d1dbebbc862ded42435e92476930d069896cff30eb414f727b89e001afa2fb8dc3436d75a4a6f26572504b192232ecb9f0c02411e52596bc5e9045')} "jumbled": unhexlify(
"5271fa3321f3adbcfb075196883d542b438ec6339176537daf859841fe6a56222bff76d1662b5509a9e1079e446eeedd2e683c31aae3ee1851d7954328526be1"
),
"normal": unhexlify(
"b1ef9ca3f24988c7b3534201cfb1cd8dbf69b8250c18ef41294ca97993db546c1fe01f7e9c8e36d6a5e29d4e30a73594bf5098421c69378af1e40f64e125946f"
),
},
{
"jumbled": unhexlify(
"498cf1b1ba6f4577effe64151d67469adc30acc325e326207e7d78487085b4162669f82f02f9774c0cc26ae6e1a76f1e266c6a9a8a2f4ffe8d2d676b1ed71cc47195a3f19208998f7d8cdfc0b74d2a96364d733a62b4273c77d9828aa1fa061588a7c4c88dd3d3dde02239557acfaad35c55854f4541e1a1b3bc8c17076e7316"
),
"normal": unhexlify(
"62c2fa7b2fecbcb64b6968912a6381ce3dc166d56a1d62f5a8d7551db5fd9313e8c7203d996af7d477083756d59af80d06a745f44ab023752cb5b406ed8985e18130ab33362697b0e4e4c763ccb8f676495c222f7fba1e31defa3d5a57efc2e1e9b01a035587d5fb1a38e01d94903d3c3e0ad3360c1d3710acd20b183e31d49f"
),
},
{
"jumbled": unhexlify(
"7508a3a146714f229db91b543e240633ed57853f6451c9db6d64c6e86af1b88b28704f608582c53c51ce7d5b8548827a971d2b98d41b7f6258655902440cd66ee11e84dbfac7d2a43696fd0468810a3d9637c3fa58e7d2d341ef250fa09b9fb71a78a41d389370138a55ea58fcde779d714a04e0d30e61dc2d8be0da61cd684509"
),
"normal": unhexlify(
"25c9a138f49b1a537edcf04be34a9851a7af9db6990ed83dd64af3597c04323ea51b0052ad8084a8b9da948d320dadd64f5431e61ddf658d24ae67c22c8d1309131fc00fe7f235734276d38d47f1e191e00c7a1d48af046827591e9733a97fa6b679f3dc601d008285edcbdae69ce8fc1be4aac00ff2711ebd931de518856878f7"
),
},
{
"jumbled": unhexlify(
"5139912fe8b95492c12731995a0f4478dbeb81ec36653a21bc80d673f3c6a0feef70b6c566f9d34bb726c098648382d105afb19b2b8486b73cbd47a17a0d2d1fd593b14bb9826c5d114b850c6f0cf3083a6f61e38e42713a37ef7997ebd2b376c8a410d797b3932e5a6e39e726b2894ce79604b4ae3c00acaea3be2c1dfe697fa644755102cf9ad78794d0594585494fe38ab56fa6ef3271a68a33481015adf3944c115311421a7dc3ce73ef2abf47e18a6aca7f9dd25a85ce8dbd6f1ad89c8d"
),
"normal": unhexlify(
"3476f21a482ec9378365c8f7393c94e2885315eb4671098b79535e790fe53e29fef2b3766697ac32b4f473f468a008e72389fc03880d780cb07fcfaabe3f1a84b27db59a4a153d882d2b2103596555ed9494c6ac893c49723833ec8926c1039586a7afcf4a0d9c731e985d99589c8bb838e8aaf745533ed9e8ae3a1cd074a51a20da8aba18d1dbebbc862ded42435e92476930d069896cff30eb414f727b89e001afa2fb8dc3436d75a4a6f26572504b192232ecb9f0c02411e52596bc5e9045"
),
},
] ]
for tv in TEST_VECTORS: for tv in TEST_VECTORS:
@ -26,5 +57,6 @@ class TestZcashF4jumble(unittest.TestCase):
f4unjumble(message) f4unjumble(message)
self.assertEqual(bytes(message), tv["normal"]) self.assertEqual(bytes(message), tv["normal"])
if __name__ == '__main__':
if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -9,30 +9,255 @@ SAPLING = unified_addresses.Typecode.SAPLING
ORCHARD = unified_addresses.Typecode.ORCHARD ORCHARD = unified_addresses.Typecode.ORCHARD
TESTVECTORS = [ TESTVECTORS = [
["From https://github.com/zcash-hackworks/zcash-test-vectors/blob/master/unified_address.py"], [
["p2pkh_bytes, p2sh_bytes, sapling_raw_addr, orchard_raw_addr, unknown_typecode, unknown_bytes, unified_addr, root_seed, account, diversifier_index"], "From https://github.com/zcash-hackworks/zcash-test-vectors/blob/master/unified_address.py"
["e6cabf813929132d772d04b03ae85223d03b9be8", None, None, "d4714ee761d1ae823b6972152e20957fefa3f6e3129ea4dfb0a9e98703a63dab929589d6dc51c970f935b3", 65533, "f6ee6921481cdd86b3cc4318d9614fc820905d042bb1ef9ca3f24988c7b3534201cfb1cd8dbf69b8250c18ef41294ca97993db546c1fe0", "753179793677386e336a6d6a73676a39777663656e7238723570366833387679636c686d71307767396b7a70786c7534367a387636346b3567737a72387966777a346a7672796c76766733673633337a30326c756b38356e6d73636b366432736578336e3564376b6e3638687a7a3574763475647439703673793770676c6565756c76676c767832363237646666353771396665703577676478386d3065737832386d307a767578706d7779617a74336a756e3272707177386e75366a326663657167686b353563656436366a73366b366a786e387932787475653866337061716a726b3871366e70746e6e", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 0, 0], ],
["7bec9de217c04f7ce1a86f1fb458aa881c8f39e4", None, None, "d8e5ecb4e005c28718e61a5c336a4f369e771ccdb3363f4f7a04b02a966901a4c05da662d5fd75678f7fb4", 65530, None, "75317a35677538783364766b7677636d726a30716b3568727839706361646c3536683834663777647970366e7635337233643563636365646563686d77393835746765357733633272353639716137326c676775753578727178683739616a7a63376b716d65733230706b747a71726a6c707835367168676d716d3536686e39777432686379787064616d616b", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 1, 0], [
["aa6d43480fd9d91375ce6c4a020706361bd296de", None, "88533c398a49c2513dc85162bf220abaf47dc983f14e908ddaaa7322dba16531bc62efe750fe575c8d149b", None, 65530, None, "7531343367706a3772643934766d39356d7a73757537746a74716161677934706d6678386c6b77656d70786a7463777a33357a746361383530796e6c7a323932307477617a6171703270367168787878337a357178616b6e73716372676c7578716a337070757367776635757963686c61677938376b376874613768773965793336776d7930367065776c6470", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 2, 0], "p2pkh_bytes, p2sh_bytes, sapling_raw_addr, orchard_raw_addr, unknown_typecode, unknown_bytes, unified_addr, root_seed, account, diversifier_index"
[None, "a8d7551db5fd9313e8c7203d996af7d477083756", "52fd6aedefbf401633c2e4532515ebcf95bcc2b4b8e4d676dfad7e17925c6dfb8671e52544dc2ca075e261", None, 65534, None, "753178797970646a307a7978637466666b6878796d766a6e6b376e383371666c376e7365356c3071726b346e3266376465376c3733727a79787970347463727975356d6b7875617a6c646e633279306479747a7567797a79636739373034616a66786173376b63757761776d706877776e383839743938743735376579716667346a766566746b687672337167", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 3, 0], ],
[None, "f44ab023752cb5b406ed8985e18130ab33362697", None, "165082de84f2ad7204426ffafd6b6c7de9cab6d25c13846a1786715268c415948db788f4a5e0daa03d699e", 65533, None, "7531706a336c72656d6e7175737368393878667161336a66647077303872726b35377330346b6c32366865707a7133746a72736e78653574367371716567653976716d776c63366c786373746e6333306e3575357232776b6b7a687039367a3564306a797530716137746b686378366663386a35396b616b387a35636570363261716d61336d36343566683863", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 4, 0], [
[None, None, None, "ea9df83fbee07d6f7895ebb2ea41ec7c4ba682b863e069b4a438e31c9571c83126c305d75456412aeaef1b", 65531, None, "753132787567643930666c726b646b6575336e6c6e6e337565736b793533707175356d323479366170786d38386d34387637333734636c7335367a7039336e61796c617864636866307161796678747267653034376d393533717a3376326772346c74737232736b3372", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 5, 0], "e6cabf813929132d772d04b03ae85223d03b9be8",
[None, None, None, "3c40246912b6efefab9a55244ac2c174e1a9f8c0bc0fd526933963c6ecb9b84ec8b0f6b40dc858fa23c72b", 65530, None, "75317370757467353667736a763233637435346d7277646c616e7a7665716337747a73356d78786e616135636465676d303368673778363661797079647336356d39327674397561786c3637327375687063367a3768747776657079686b727066757376617a71756539", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 6, 0], None,
[None, "defa3d5a57efc2e1e9b01a035587d5fb1a38e01d", None, "cc099cc214e56b1192c7b5b17e958c3413e27fefd553380700aca81b24b2918cac951a1a68017fac525a18", 65535, None, "75317667736b636d3939783567687561757668337978713777747037756e366130793663617964736e6e33357032647577707773356873367079676a6877703738326a716e65727a6c6878773370343971666d713237383339716a7472667976686b377964393877396e3064366a6e7336756834666333687364663736366b6e74716e6c6a646b64353667636e", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 7, 0], None,
[None, None, None, "5f09a9807a56323b263b05df368dc28391b21a64a0e1b40f9a6803b7e68f3905923f35cb01f119b223f493", 65530, None, "75316378636379656d6d3038747964776d743968703273356e6638776a766c757575366c32653861396a666c6c647861736e7a6b6438667665727170636a30786e767261637a71673235356377356e767936783977727566666d703975657a727a72376763783535396b", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 8, 0], "d4714ee761d1ae823b6972152e20957fefa3f6e3129ea4dfb0a9e98703a63dab929589d6dc51c970f935b3",
[None, "10acd20b183e31d49f25c9a138f49b1a537edcf0", "9b60ae3d302248b349d601567e3d7795bfb334ea1fd1a7e71402169ebbe14bd2ceaa244ccd6e5aa2245613", "e340636542ece1c81285ed4eab448adbb5a8c0f4d386eeff337e88e6915f6c3ec1b6ea835a88d56612d2bd", 65531, None, "75317a656b68686d686b353478356365356333367274376e63323735676570376e6176326e73783473683061666c6c75703976726835687338367a38736b6a746436646e736c7667736d6174743068386832343763676e666b73646c776c39786d617275797570666c743064716673637830647979656d3266616139776571653378616b397736656672353437636a3832397232746e7974613032687866647873646a6d76397a72356b746b70323066706378656164686672683032616b346136686e7876357336377267717272766670646a7435", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 9, 0], 65533,
[None, "af9db6990ed83dd64af3597c04323ea51b0052ad", None, "cdf7fed0d0822fd849cffb20a4d5ee701ad8141e66d81ddfabf87875117c05092240603c546b8dc187cd8c", 65532, None, "753165353471636e30746570796c33307a7a326672677a37713461366d736e326530326e7076326e6666736433683532336d747838643232616a7666767371757235736a7a3876666e6d77327973363730387170386b6139306a3561343330757938763833616c6a63306330357a6a7535347879356e7677336d66686b376e7737366b6b7964796c713466656c", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 10, 0], "f6ee6921481cdd86b3cc4318d9614fc820905d042bb1ef9ca3f24988c7b3534201cfb1cd8dbf69b8250c18ef41294ca97993db546c1fe0",
[None, None, None, "24fd59f32b2d39dde66e46c39206a31bc04fa5c6847976ea6bbd3163ee14f58f584acc131479ea558d3f84", 65530, None, "75317a38777372686d66366d3967766136766c33737a636b303670393730783577686d36336a666a3266726d6d63396e39756d34796373387975746a37673833387672676832306c667879353279306832367474386e6776643267796370797176396b793032716b6373", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 11, 0], "753179793677386e336a6d6a73676a39777663656e7238723570366833387679636c686d71307767396b7a70786c7534367a387636346b3567737a72387966777a346a7672796c76766733673633337a30326c756b38356e6d73636b366432736578336e3564376b6e3638687a7a3574763475647439703673793770676c6565756c76676c767832363237646666353771396665703577676478386d3065737832386d307a767578706d7779617a74336a756e3272707177386e75366a326663657167686b353563656436366a73366b366a786e387932787475653866337061716a726b3871366e70746e6e",
[None, None, "78d85bd0db639043377987cdd814c6390016964b684016faf1ad4f166c5f72399a5e8d469ec6beb873d55d", None, 65535, None, "75317861686a333570376d7639756c6b3337327333766465687172663438753077646633786c3772787a7270653461307468753864306d396d7961617078376b35767836747a357074636a76637675346472667137753771777a6d667565336b74387376736333736535", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 12, 0], "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
["33a6dd87b4d872a4895d345761e4ec423b77928d", None, None, "5178924f7067eac261044ca27ba3cf52f798486973af0795e61587aa1b1ecad333dc520497edc61df88980", 65533, "91e00c7a1d48af046827591e9733a97fa6b679f3dc601d008285edcbdae69ce8fc1be4aac00ff2711ebd931de518856878f73476f21a482ec9378365c8f7393c94e2885315eb4671098b79535e790fe53e29fef2b3766697ac32b4f473f468a008e72389fc03880d780cb07fcfaabe3f1a84b27db59a4a153d882d2b2103596555ed9494c6ac893c49723833ec8926c1", "7531687970706c733364776d616c783373756c746b72397564763237376679716a6478307378716c746638676a6e777976343968743575327270336c6c767632756e796d7330383675616a6b6638393837636175616a7136383670356638687276393474616336663078796637796d7a3636747279366b7936726179336d6a633567786661683030637370766b3564676d67736e3737663274336775763270307861366b6c6138717479376d6b6e6b6d337a68303932306c77733633326166743071686b3532363579736c337067323237747866373461736d7075656e326c746533616a6330667a376b34736878797a656d6e7035773770336b746c6874643030366d6b61787979306d746637646a73646175397a666b657332616e387661687a6737647173677938326330707830396d39683061657a736e7936786c66706767667268656d7661786a3578747871356a6e67763076306167726c3073757079676639636574656a35323779727a7a6574386471747164616771", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 13, 0], 0,
["a56c057ef71dab58aa90e47025695c5faaea5123", None, "a75a6de421d2ad1ee8f4b25e398adda9c0aaa6ab1f2518981a9ddb1de6a3957d77842332d6289dbe94e832", "b208c9235c8d40e49b76100b2d010f3783f12c66e7d3beb117b2c96321b7f6562adb4efc144e39d909e728", 65533, None, "7531646670723876647335683361756e79657a7a7877726d38756461353273743837733876726c676732746730357430713070783336686368783974676b786b6c77747370753332786a6135617271336b7470326e387a613470773779776a30676d68713372776539353072386b3973756e736a76773734743538716c3333347065673464766b616c6b746d6e676e716b7077723332353837653779747932376e6d673636747371377976723779343639776570366b7077346a3530786e6c6d78306a78786737766c6735796c6671387566657664", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 14, 0], 0,
[None, None, None, "9e5445d6cd3cb9f98b0df1062bda47adffd5a66c0c2c483c8bf15c3176d755914a3576496b5c35fee28a88", 65531, None, "75316a676c686a326d617936646674777a39753271796e786a717a6e75743637343768617375306d646d6c63303266636173756178756764797a776a326c38346d6a3966677a6a3779306b396663706a373336736c6d6a38676b37377567386c6c61766367326c666d6d", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 15, 0], ],
["b02aec10f6fa02a08667bf9b924c3d0574a1334f", None, None, "2598d84dffb34f5908b90732490f3881399150d4c694fce9bf30d1560b2c56f09829fe123b9add20e5d71c", 65534, None, "7531397163617a647761793438707566366a77616a78307732386d307871756d746d6e6435677974796c6c6e79676867396c76393978356d3872387439673566396a307a30786e34787a6d6e7866747a3772746633756164786b79367178706e6b7438666b66686c78386b63396d6e72646c6e7874733536786378656a7a6472776c65787a7637377876797634", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 16, 0], [
[None, None, "d3a803803feee7a032a24adfaa8f6a94cecb9671c1333d0d5d1a3d79d82bc310727c665364d71022559c50", "7c98b8f613f9ff02746bea2a167cfd1bd3a1862af9631bf61d9d604e0824e2cb8467a1e549db87a76e7a8a", 65535, None, "75316136346c303971727378756c666a7a6e6d366b326735333575737968746166386564363076346a726a6d6b77766b757834743770647963336e6b7a7265666467746e77383432306c6a3873686d30356a6139667878676e68726139326e6873713536677838633270757a33666b6b676e726b7166357975716664746637743672616e343767646366357676646661637a7766337575793466797368336d7a7538686435746b6c30356d76726765396e38", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 17, 0], "7bec9de217c04f7ce1a86f1fb458aa881c8f39e4",
["26c061d67beb8bad48c6b4774a156551e30e4fe2", None, None, "a80405d5568ab8ab8f8546163d951ab297fd5e6f43e7fcebcb664feacfab5afd80aaf7f354c07a9901788c", 65535, None, "7531787a757764386163686667776d336577793976326d6a3537373268726b6e6d6578777a6339346d7a6133356d78363863656e767877727a3973396670306e39767a753872756a357a71666d6d376c65387775366c363275346c6d30376e75717865656d383733677838366a766e776c70787379636c397576366b786b72686d30726c677037307830357366", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 18, 0], None,
[None, None, "8660070e3757ff6507060791fd694f6a631b8495a2b74ffa39236cf653caea5575b86af3200b010e513bab", "63b7b706d991169986aee56133f0a50b2a0c8225fba6dae95176007b1f023a1e97c1aa366e99bf970fda82", 65534, None, "7531766736326d676a64646e6c763577366c646b793278653063387465746d633832747539766c7a7a6b75796e783439666e75716a76786a743564676e33636d3874356e38357a6371356c6a727467377a6d77686b3730683672646d636c6637736378786e67756b35666c76663261707037367875393037636d6a796c787673656e3235786539763776336b727378613975793076326a6a7133376b6834796d6c61666e3870657671616c716134646d3637", "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 19, 5] None,
"d8e5ecb4e005c28718e61a5c336a4f369e771ccdb3363f4f7a04b02a966901a4c05da662d5fd75678f7fb4",
65530,
None,
"75317a35677538783364766b7677636d726a30716b3568727839706361646c3536683834663777647970366e7635337233643563636365646563686d77393835746765357733633272353639716137326c676775753578727178683739616a7a63376b716d65733230706b747a71726a6c707835367168676d716d3536686e39777432686379787064616d616b",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
1,
0,
],
[
"aa6d43480fd9d91375ce6c4a020706361bd296de",
None,
"88533c398a49c2513dc85162bf220abaf47dc983f14e908ddaaa7322dba16531bc62efe750fe575c8d149b",
None,
65530,
None,
"7531343367706a3772643934766d39356d7a73757537746a74716161677934706d6678386c6b77656d70786a7463777a33357a746361383530796e6c7a323932307477617a6171703270367168787878337a357178616b6e73716372676c7578716a337070757367776635757963686c61677938376b376874613768773965793336776d7930367065776c6470",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
2,
0,
],
[
None,
"a8d7551db5fd9313e8c7203d996af7d477083756",
"52fd6aedefbf401633c2e4532515ebcf95bcc2b4b8e4d676dfad7e17925c6dfb8671e52544dc2ca075e261",
None,
65534,
None,
"753178797970646a307a7978637466666b6878796d766a6e6b376e383371666c376e7365356c3071726b346e3266376465376c3733727a79787970347463727975356d6b7875617a6c646e633279306479747a7567797a79636739373034616a66786173376b63757761776d706877776e383839743938743735376579716667346a766566746b687672337167",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
3,
0,
],
[
None,
"f44ab023752cb5b406ed8985e18130ab33362697",
None,
"165082de84f2ad7204426ffafd6b6c7de9cab6d25c13846a1786715268c415948db788f4a5e0daa03d699e",
65533,
None,
"7531706a336c72656d6e7175737368393878667161336a66647077303872726b35377330346b6c32366865707a7133746a72736e78653574367371716567653976716d776c63366c786373746e6333306e3575357232776b6b7a687039367a3564306a797530716137746b686378366663386a35396b616b387a35636570363261716d61336d36343566683863",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
4,
0,
],
[
None,
None,
None,
"ea9df83fbee07d6f7895ebb2ea41ec7c4ba682b863e069b4a438e31c9571c83126c305d75456412aeaef1b",
65531,
None,
"753132787567643930666c726b646b6575336e6c6e6e337565736b793533707175356d323479366170786d38386d34387637333734636c7335367a7039336e61796c617864636866307161796678747267653034376d393533717a3376326772346c74737232736b3372",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
5,
0,
],
[
None,
None,
None,
"3c40246912b6efefab9a55244ac2c174e1a9f8c0bc0fd526933963c6ecb9b84ec8b0f6b40dc858fa23c72b",
65530,
None,
"75317370757467353667736a763233637435346d7277646c616e7a7665716337747a73356d78786e616135636465676d303368673778363661797079647336356d39327674397561786c3637327375687063367a3768747776657079686b727066757376617a71756539",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
6,
0,
],
[
None,
"defa3d5a57efc2e1e9b01a035587d5fb1a38e01d",
None,
"cc099cc214e56b1192c7b5b17e958c3413e27fefd553380700aca81b24b2918cac951a1a68017fac525a18",
65535,
None,
"75317667736b636d3939783567687561757668337978713777747037756e366130793663617964736e6e33357032647577707773356873367079676a6877703738326a716e65727a6c6878773370343971666d713237383339716a7472667976686b377964393877396e3064366a6e7336756834666333687364663736366b6e74716e6c6a646b64353667636e",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
7,
0,
],
[
None,
None,
None,
"5f09a9807a56323b263b05df368dc28391b21a64a0e1b40f9a6803b7e68f3905923f35cb01f119b223f493",
65530,
None,
"75316378636379656d6d3038747964776d743968703273356e6638776a766c757575366c32653861396a666c6c647861736e7a6b6438667665727170636a30786e767261637a71673235356377356e767936783977727566666d703975657a727a72376763783535396b",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
8,
0,
],
[
None,
"10acd20b183e31d49f25c9a138f49b1a537edcf0",
"9b60ae3d302248b349d601567e3d7795bfb334ea1fd1a7e71402169ebbe14bd2ceaa244ccd6e5aa2245613",
"e340636542ece1c81285ed4eab448adbb5a8c0f4d386eeff337e88e6915f6c3ec1b6ea835a88d56612d2bd",
65531,
None,
"75317a656b68686d686b353478356365356333367274376e63323735676570376e6176326e73783473683061666c6c75703976726835687338367a38736b6a746436646e736c7667736d6174743068386832343763676e666b73646c776c39786d617275797570666c743064716673637830647979656d3266616139776571653378616b397736656672353437636a3832397232746e7974613032687866647873646a6d76397a72356b746b70323066706378656164686672683032616b346136686e7876357336377267717272766670646a7435",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
9,
0,
],
[
None,
"af9db6990ed83dd64af3597c04323ea51b0052ad",
None,
"cdf7fed0d0822fd849cffb20a4d5ee701ad8141e66d81ddfabf87875117c05092240603c546b8dc187cd8c",
65532,
None,
"753165353471636e30746570796c33307a7a326672677a37713461366d736e326530326e7076326e6666736433683532336d747838643232616a7666767371757235736a7a3876666e6d77327973363730387170386b6139306a3561343330757938763833616c6a63306330357a6a7535347879356e7677336d66686b376e7737366b6b7964796c713466656c",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
10,
0,
],
[
None,
None,
None,
"24fd59f32b2d39dde66e46c39206a31bc04fa5c6847976ea6bbd3163ee14f58f584acc131479ea558d3f84",
65530,
None,
"75317a38777372686d66366d3967766136766c33737a636b303670393730783577686d36336a666a3266726d6d63396e39756d34796373387975746a37673833387672676832306c667879353279306832367474386e6776643267796370797176396b793032716b6373",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
11,
0,
],
[
None,
None,
"78d85bd0db639043377987cdd814c6390016964b684016faf1ad4f166c5f72399a5e8d469ec6beb873d55d",
None,
65535,
None,
"75317861686a333570376d7639756c6b3337327333766465687172663438753077646633786c3772787a7270653461307468753864306d396d7961617078376b35767836747a357074636a76637675346472667137753771777a6d667565336b74387376736333736535",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
12,
0,
],
[
"33a6dd87b4d872a4895d345761e4ec423b77928d",
None,
None,
"5178924f7067eac261044ca27ba3cf52f798486973af0795e61587aa1b1ecad333dc520497edc61df88980",
65533,
"91e00c7a1d48af046827591e9733a97fa6b679f3dc601d008285edcbdae69ce8fc1be4aac00ff2711ebd931de518856878f73476f21a482ec9378365c8f7393c94e2885315eb4671098b79535e790fe53e29fef2b3766697ac32b4f473f468a008e72389fc03880d780cb07fcfaabe3f1a84b27db59a4a153d882d2b2103596555ed9494c6ac893c49723833ec8926c1",
"7531687970706c733364776d616c783373756c746b72397564763237376679716a6478307378716c746638676a6e777976343968743575327270336c6c767632756e796d7330383675616a6b6638393837636175616a7136383670356638687276393474616336663078796637796d7a3636747279366b7936726179336d6a633567786661683030637370766b3564676d67736e3737663274336775763270307861366b6c6138717479376d6b6e6b6d337a68303932306c77733633326166743071686b3532363579736c337067323237747866373461736d7075656e326c746533616a6330667a376b34736878797a656d6e7035773770336b746c6874643030366d6b61787979306d746637646a73646175397a666b657332616e387661687a6737647173677938326330707830396d39683061657a736e7936786c66706767667268656d7661786a3578747871356a6e67763076306167726c3073757079676639636574656a35323779727a7a6574386471747164616771",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
13,
0,
],
[
"a56c057ef71dab58aa90e47025695c5faaea5123",
None,
"a75a6de421d2ad1ee8f4b25e398adda9c0aaa6ab1f2518981a9ddb1de6a3957d77842332d6289dbe94e832",
"b208c9235c8d40e49b76100b2d010f3783f12c66e7d3beb117b2c96321b7f6562adb4efc144e39d909e728",
65533,
None,
"7531646670723876647335683361756e79657a7a7877726d38756461353273743837733876726c676732746730357430713070783336686368783974676b786b6c77747370753332786a6135617271336b7470326e387a613470773779776a30676d68713372776539353072386b3973756e736a76773734743538716c3333347065673464766b616c6b746d6e676e716b7077723332353837653779747932376e6d673636747371377976723779343639776570366b7077346a3530786e6c6d78306a78786737766c6735796c6671387566657664",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
14,
0,
],
[
None,
None,
None,
"9e5445d6cd3cb9f98b0df1062bda47adffd5a66c0c2c483c8bf15c3176d755914a3576496b5c35fee28a88",
65531,
None,
"75316a676c686a326d617936646674777a39753271796e786a717a6e75743637343768617375306d646d6c63303266636173756178756764797a776a326c38346d6a3966677a6a3779306b396663706a373336736c6d6a38676b37377567386c6c61766367326c666d6d",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
15,
0,
],
[
"b02aec10f6fa02a08667bf9b924c3d0574a1334f",
None,
None,
"2598d84dffb34f5908b90732490f3881399150d4c694fce9bf30d1560b2c56f09829fe123b9add20e5d71c",
65534,
None,
"7531397163617a647761793438707566366a77616a78307732386d307871756d746d6e6435677974796c6c6e79676867396c76393978356d3872387439673566396a307a30786e34787a6d6e7866747a3772746633756164786b79367178706e6b7438666b66686c78386b63396d6e72646c6e7874733536786378656a7a6472776c65787a7637377876797634",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
16,
0,
],
[
None,
None,
"d3a803803feee7a032a24adfaa8f6a94cecb9671c1333d0d5d1a3d79d82bc310727c665364d71022559c50",
"7c98b8f613f9ff02746bea2a167cfd1bd3a1862af9631bf61d9d604e0824e2cb8467a1e549db87a76e7a8a",
65535,
None,
"75316136346c303971727378756c666a7a6e6d366b326735333575737968746166386564363076346a726a6d6b77766b757834743770647963336e6b7a7265666467746e77383432306c6a3873686d30356a6139667878676e68726139326e6873713536677838633270757a33666b6b676e726b7166357975716664746637743672616e343767646366357676646661637a7766337575793466797368336d7a7538686435746b6c30356d76726765396e38",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
17,
0,
],
[
"26c061d67beb8bad48c6b4774a156551e30e4fe2",
None,
None,
"a80405d5568ab8ab8f8546163d951ab297fd5e6f43e7fcebcb664feacfab5afd80aaf7f354c07a9901788c",
65535,
None,
"7531787a757764386163686667776d336577793976326d6a3537373268726b6e6d6578777a6339346d7a6133356d78363863656e767877727a3973396670306e39767a753872756a357a71666d6d376c65387775366c363275346c6d30376e75717865656d383733677838366a766e776c70787379636c397576366b786b72686d30726c677037307830357366",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
18,
0,
],
[
None,
None,
"8660070e3757ff6507060791fd694f6a631b8495a2b74ffa39236cf653caea5575b86af3200b010e513bab",
"63b7b706d991169986aee56133f0a50b2a0c8225fba6dae95176007b1f023a1e97c1aa366e99bf970fda82",
65534,
None,
"7531766736326d676a64646e6c763577366c646b793278653063387465746d633832747539766c7a7a6b75796e783439666e75716a76786a743564676e33636d3874356e38357a6371356c6a727467377a6d77686b3730683672646d636c6637736378786e67756b35666c76663261707037367875393037636d6a796c787673656e3235786539763776336b727378613975793076326a6a7133376b6834796d6c61666e3870657671616c716134646d3637",
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
19,
5,
],
] ]
class ZcashTestVector: class ZcashTestVector:
def __init__(self, inner): def __init__(self, inner):
self.inner = inner self.inner = inner
@ -76,5 +301,5 @@ class TestZcashAddress(unittest.TestCase):
self.assertEqual(receivers, get_receivers(tv)) self.assertEqual(receivers, get_receivers(tv))
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -44,57 +44,89 @@ class TestZcashSigHasher(unittest.TestCase):
) )
inputs = [ inputs = [
TxInput( TxInput(
prev_hash=unhexlify("4f61d91843ccb386dd1c482169eef62efaaf9d9364b1666e4d4c299e04a852e1"), prev_hash=unhexlify(
"4f61d91843ccb386dd1c482169eef62efaaf9d9364b1666e4d4c299e04a852e1"
),
prev_index=1569726664, prev_index=1569726664,
multisig=None, multisig=None,
amount=1249971475008092, amount=1249971475008092,
script_type=InputScriptType.SPENDADDRESS, script_type=InputScriptType.SPENDADDRESS,
sequence=0x8849f2a3, sequence=0x8849F2A3,
script_pubkey=unhexlify("76a9149466817faf329208fc3c3ef42ce4513d22fc1f9b88ac"), script_pubkey=unhexlify(
"76a9149466817faf329208fc3c3ef42ce4513d22fc1f9b88ac"
),
), ),
TxInput( TxInput(
prev_hash=unhexlify("368e9c7e1fe01f6c54db9379a94c2941ef180c25b869bf8dcdb1cf014253b3c7"), prev_hash=unhexlify(
"368e9c7e1fe01f6c54db9379a94c2941ef180c25b869bf8dcdb1cf014253b3c7"
),
prev_index=2648876502, prev_index=2648876502,
multisig=None, multisig=None,
amount=1353789347081201, amount=1353789347081201,
script_type=InputScriptType.SPENDADDRESS, script_type=InputScriptType.SPENDADDRESS,
sequence=0x8a37691c, sequence=0x8A37691C,
script_pubkey=unhexlify("76a9142275979f97043edd9a6083ee27d136727ce5f42888ac"), script_pubkey=unhexlify(
"76a9142275979f97043edd9a6083ee27d136727ce5f42888ac"
),
), ),
TxInput( TxInput(
prev_hash=unhexlify("f5621d6ad566c13dce81632a9168694bb6bcec2f7bfac2626f9425e1640fe4f1"), prev_hash=unhexlify(
"f5621d6ad566c13dce81632a9168694bb6bcec2f7bfac2626f9425e1640fe4f1"
),
prev_index=492165032, prev_index=492165032,
multisig=None, multisig=None,
amount=1672802384749611, amount=1672802384749611,
script_type=InputScriptType.SPENDADDRESS, script_type=InputScriptType.SPENDADDRESS,
sequence=0x6a993d20, sequence=0x6A993D20,
script_pubkey=unhexlify("76a914682c89bfc3940621bd4a4bfc349a79b46ce707e388ac"), script_pubkey=unhexlify(
"76a914682c89bfc3940621bd4a4bfc349a79b46ce707e388ac"
),
), ),
] ]
outputs = [ outputs = [
PrevOutput( PrevOutput(
amount=865034086766210, amount=865034086766210,
script_pubkey=unhexlify("76a9140d06a745f44ab023752cb5b406ed8985e18130ab88ac"), script_pubkey=unhexlify(
"76a9140d06a745f44ab023752cb5b406ed8985e18130ab88ac"
),
), ),
PrevOutput( PrevOutput(
amount=2088955338922857, amount=2088955338922857,
script_pubkey=unhexlify("76a91463ccb8f676495c222f7fba1e31defa3d5a57efc288ac"), script_pubkey=unhexlify(
"76a91463ccb8f676495c222f7fba1e31defa3d5a57efc288ac"
),
), ),
PrevOutput( PrevOutput(
amount=1760123755646275, amount=1760123755646275,
script_pubkey=unhexlify("76a914fb1a38e01d94903d3c3e0ad3360c1d3710acd20b88ac"), script_pubkey=unhexlify(
"76a914fb1a38e01d94903d3c3e0ad3360c1d3710acd20b88ac"
),
), ),
] ]
pubkeys = [ pubkeys = [
unhexlify("02ed9c769c787fda78a7da13764707d14217e74e26428b47a2a8fe6d5a0bc46196"), unhexlify(
unhexlify("0219ac5de9a45f76e7efede5259acd94bb047ab8e7cc60fe844cb32317072ebbf3"), "02ed9c769c787fda78a7da13764707d14217e74e26428b47a2a8fe6d5a0bc46196"
unhexlify("02829099a7cf1f617c956c0222e7b77ae331813d6a736eab3c5f6344d961843d39"), ),
unhexlify(
"0219ac5de9a45f76e7efede5259acd94bb047ab8e7cc60fe844cb32317072ebbf3"
),
unhexlify(
"02829099a7cf1f617c956c0222e7b77ae331813d6a736eab3c5f6344d961843d39"
),
] ]
expected_txid = unhexlify("c91d34ecc44484b07ee573f385d80e57e4e57571bb86aa6ec6c44d654123e4e9") expected_txid = unhexlify(
"c91d34ecc44484b07ee573f385d80e57e4e57571bb86aa6ec6c44d654123e4e9"
)
expected_sighashes = [ expected_sighashes = [
unhexlify("4d82669c8c0e9b1f26d59bcb347212f2d044eeb839fce21e039d8bb082bbc343"), unhexlify(
unhexlify("2e2a27d78d117e28760d3c972f9614547ec57688c970f06c19c515cded6b030c"), "4d82669c8c0e9b1f26d59bcb347212f2d044eeb839fce21e039d8bb082bbc343"
unhexlify("d0a92ffd4a4d262f5b84598bcfca741a42c17b8e9d26cf4fd87839df8f33e4ee"), ),
unhexlify(
"2e2a27d78d117e28760d3c972f9614547ec57688c970f06c19c515cded6b030c"
),
unhexlify(
"d0a92ffd4a4d262f5b84598bcfca741a42c17b8e9d26cf4fd87839df8f33e4ee"
),
] ]
hasher = ZcashHasher(tx) hasher = ZcashHasher(tx)
@ -109,9 +141,7 @@ class TestZcashSigHasher(unittest.TestCase):
# test ZcashSigHasher.signature_digest # test ZcashSigHasher.signature_digest
for txi, expected_sighash, pk in zip(inputs, expected_sighashes, pubkeys): for txi, expected_sighash, pk in zip(inputs, expected_sighashes, pubkeys):
computed_sighash = hasher.signature_digest( computed_sighash = hasher.signature_digest(txi, txi.script_pubkey)
txi, txi.script_pubkey
)
self.assertEqual(computed_sighash, expected_sighash) self.assertEqual(computed_sighash, expected_sighash)

View File

@ -4,7 +4,6 @@ from storage import device
class TestConfig(unittest.TestCase): class TestConfig(unittest.TestCase):
def test_counter(self): def test_counter(self):
config.init() config.init()
config.wipe() config.wipe()
@ -17,5 +16,5 @@ class TestConfig(unittest.TestCase):
self.assertEqual(device.next_u2f_counter(), 1) self.assertEqual(device.next_u2f_counter(), 1)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -17,7 +17,6 @@ def random_entry():
class TestConfig(unittest.TestCase): class TestConfig(unittest.TestCase):
def test_init(self): def test_init(self):
config.init() config.init()
config.init() config.init()
@ -26,13 +25,13 @@ class TestConfig(unittest.TestCase):
def test_wipe(self): def test_wipe(self):
config.init() config.init()
config.wipe() config.wipe()
self.assertEqual(config.unlock('', None), True) self.assertEqual(config.unlock("", None), True)
config.set(1, 1, b'hello') config.set(1, 1, b"hello")
config.set(1, 2, b'world') config.set(1, 2, b"world")
v0 = config.get(1, 1) v0 = config.get(1, 1)
v1 = config.get(1, 2) v1 = config.get(1, 2)
self.assertEqual(v0, b'hello') self.assertEqual(v0, b"hello")
self.assertEqual(v1, b'world') self.assertEqual(v1, b"world")
config.wipe() config.wipe()
v0 = config.get(1, 1) v0 = config.get(1, 1)
v1 = config.get(1, 2) v1 = config.get(1, 2)
@ -43,7 +42,7 @@ class TestConfig(unittest.TestCase):
for _ in range(128): for _ in range(128):
config.init() config.init()
config.wipe() config.wipe()
self.assertEqual(config.unlock('', None), True) self.assertEqual(config.unlock("", None), True)
appid, key = random_entry() appid, key = random_entry()
value = random.bytes(16) value = random.bytes(16)
config.set(appid, key, value) config.set(appid, key, value)
@ -57,7 +56,7 @@ class TestConfig(unittest.TestCase):
def test_public(self): def test_public(self):
config.init() config.init()
config.wipe() config.wipe()
self.assertEqual(config.unlock('', None), True) self.assertEqual(config.unlock("", None), True)
appid, key = random_entry() appid, key = random_entry()
@ -83,26 +82,32 @@ class TestConfig(unittest.TestCase):
def test_change_pin(self): def test_change_pin(self):
config.init() config.init()
config.wipe() config.wipe()
self.assertTrue(config.unlock('', None)) self.assertTrue(config.unlock("", None))
config.set(1, 1, b'value') config.set(1, 1, b"value")
PINS = ('123', '123', 'Trezor T', '3141592653589793238462643383279502884197', '') PINS = (
old_pin = '' "123",
"123",
"Trezor T",
"3141592653589793238462643383279502884197",
"",
)
old_pin = ""
for new_pin in PINS: for new_pin in PINS:
self.assertTrue(config.unlock(old_pin, None)) self.assertTrue(config.unlock(old_pin, None))
# The APP namespace which is reserved for storage related values is inaccessible even # The APP namespace which is reserved for storage related values is inaccessible even
# when unlocked. # when unlocked.
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
config.set(PINAPP, PINKEY, b'value') config.set(PINAPP, PINKEY, b"value")
self.assertTrue(config.change_pin(old_pin, new_pin, None, None)) self.assertTrue(config.change_pin(old_pin, new_pin, None, None))
# Old PIN cannot be used to change the current PIN. # Old PIN cannot be used to change the current PIN.
if old_pin != new_pin: if old_pin != new_pin:
self.assertFalse(config.change_pin(old_pin, '666', None, None)) self.assertFalse(config.change_pin(old_pin, "666", None, None))
# Storage remains unlocked. # Storage remains unlocked.
self.assertEqual(config.get(1, 1), b'value') self.assertEqual(config.get(1, 1), b"value")
# The APP namespace which is reserved for storage related values is inaccessible even # The APP namespace which is reserved for storage related values is inaccessible even
# when unlocked. # when unlocked.
@ -115,11 +120,11 @@ class TestConfig(unittest.TestCase):
self.assertFalse(config.unlock(old_pin, None)) self.assertFalse(config.unlock(old_pin, None))
self.assertEqual(config.get(1, 1), None) self.assertEqual(config.get(1, 1), None)
with self.assertRaises(RuntimeError): with self.assertRaises(RuntimeError):
config.set(1, 1, b'new value') config.set(1, 1, b"new value")
# New PIN unlocks the storage. # New PIN unlocks the storage.
self.assertTrue(config.unlock(new_pin, None)) self.assertTrue(config.unlock(new_pin, None))
self.assertEqual(config.get(1, 1), b'value') self.assertEqual(config.get(1, 1), b"value")
# Lock the storage. # Lock the storage.
config.init() config.init()
@ -132,37 +137,37 @@ class TestConfig(unittest.TestCase):
# Enable PIN and SD salt. # Enable PIN and SD salt.
config.init() config.init()
config.wipe() config.wipe()
self.assertTrue(config.unlock('', None)) self.assertTrue(config.unlock("", None))
config.set(1, 1, b'value') config.set(1, 1, b"value")
self.assertFalse(config.change_pin('', '', salt1, None)) self.assertFalse(config.change_pin("", "", salt1, None))
self.assertTrue(config.change_pin('', '000', None, salt1)) self.assertTrue(config.change_pin("", "000", None, salt1))
self.assertEqual(config.get(1, 1), b'value') self.assertEqual(config.get(1, 1), b"value")
# Disable PIN and change SD salt. # Disable PIN and change SD salt.
config.init() config.init()
self.assertFalse(config.unlock('000', None)) self.assertFalse(config.unlock("000", None))
self.assertIsNone(config.get(1, 1)) self.assertIsNone(config.get(1, 1))
self.assertTrue(config.unlock('000', salt1)) self.assertTrue(config.unlock("000", salt1))
self.assertTrue(config.change_pin('000', '', salt1, salt2)) self.assertTrue(config.change_pin("000", "", salt1, salt2))
self.assertEqual(config.get(1, 1), b'value') self.assertEqual(config.get(1, 1), b"value")
# Disable SD salt. # Disable SD salt.
config.init() config.init()
self.assertFalse(config.unlock('000', salt2)) self.assertFalse(config.unlock("000", salt2))
self.assertIsNone(config.get(1, 1)) self.assertIsNone(config.get(1, 1))
self.assertTrue(config.unlock('', salt2)) self.assertTrue(config.unlock("", salt2))
self.assertTrue(config.change_pin('', '', salt2, None)) self.assertTrue(config.change_pin("", "", salt2, None))
self.assertEqual(config.get(1, 1), b'value') self.assertEqual(config.get(1, 1), b"value")
# Check that PIN and SD salt are disabled. # Check that PIN and SD salt are disabled.
config.init() config.init()
self.assertTrue(config.unlock('', None)) self.assertTrue(config.unlock("", None))
self.assertEqual(config.get(1, 1), b'value') self.assertEqual(config.get(1, 1), b"value")
def test_set_get(self): def test_set_get(self):
config.init() config.init()
config.wipe() config.wipe()
self.assertEqual(config.unlock('', None), True) self.assertEqual(config.unlock("", None), True)
for _ in range(32): for _ in range(32):
appid, key = random_entry() appid, key = random_entry()
value = random.bytes(128) value = random.bytes(128)
@ -178,13 +183,13 @@ class TestConfig(unittest.TestCase):
# Test get/set for APP out ouf range. # Test get/set for APP out ouf range.
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
config.set(0, 1, b'test') config.set(0, 1, b"test")
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
config.get(0, 1) config.get(0, 1)
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
config.set(192, 1, b'test') config.set(192, 1, b"test")
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
config.get(192, 1) config.get(192, 1)
@ -209,7 +214,7 @@ class TestConfig(unittest.TestCase):
# Test increment with storage unlocked. # Test increment with storage unlocked.
self.assertEqual(config.unlock('', None), True) self.assertEqual(config.unlock("", None), True)
for i in range(200, 300): for i in range(200, 300):
self.assertEqual(config.next_counter(1, 2, True), i + 1) self.assertEqual(config.next_counter(1, 2, True), i + 1)
@ -235,7 +240,7 @@ class TestConfig(unittest.TestCase):
def test_compact(self): def test_compact(self):
config.init() config.init()
config.wipe() config.wipe()
self.assertEqual(config.unlock('', None), True) self.assertEqual(config.unlock("", None), True)
appid, key = 1, 1 appid, key = 1, 1
for _ in range(259): for _ in range(259):
value = random.bytes(259) value = random.bytes(259)
@ -246,12 +251,12 @@ class TestConfig(unittest.TestCase):
def test_get_default(self): def test_get_default(self):
config.init() config.init()
config.wipe() config.wipe()
self.assertEqual(config.unlock('', None), True) self.assertEqual(config.unlock("", None), True)
for _ in range(128): for _ in range(128):
appid, key = random_entry() appid, key = random_entry()
value = config.get(appid, key) value = config.get(appid, key)
self.assertEqual(value, None) self.assertEqual(value, None)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -8,29 +8,29 @@ class TestCryptoBase32(unittest.TestCase):
# https://tools.ietf.org/html/rfc4648 # https://tools.ietf.org/html/rfc4648
# https://github.com/emn178/hi-base32/blob/master/tests/test.js # https://github.com/emn178/hi-base32/blob/master/tests/test.js
vectors = [ vectors = [
(b'', ''), (b"", ""),
(b'f', 'MY======'), (b"f", "MY======"),
(b'fo', 'MZXQ===='), (b"fo", "MZXQ===="),
(b'foo', 'MZXW6==='), (b"foo", "MZXW6==="),
(b'foob', 'MZXW6YQ='), (b"foob", "MZXW6YQ="),
(b'fooba', 'MZXW6YTB'), (b"fooba", "MZXW6YTB"),
(b'foobar', 'MZXW6YTBOI======'), (b"foobar", "MZXW6YTBOI======"),
(b"H", "JA======"),
(b'H', 'JA======'), (b"He", "JBSQ===="),
(b'He', 'JBSQ===='), (b"Hel", "JBSWY==="),
(b'Hel', 'JBSWY==='), (b"Hell", "JBSWY3A="),
(b'Hell', 'JBSWY3A='), (b"Hello", "JBSWY3DP"),
(b'Hello', 'JBSWY3DP'), (
b"zlutoucky kun upel dabelske ody",
(b'zlutoucky kun upel dabelske ody', 'PJWHK5DPOVRWW6JANN2W4IDVOBSWYIDEMFRGK3DTNNSSA33EPE======'), "PJWHK5DPOVRWW6JANN2W4IDVOBSWYIDEMFRGK3DTNNSSA33EPE======",
),
(b'中文', '4S4K3ZUWQ4======'), # noqa:E999 (b"中文", "4S4K3ZUWQ4======"), # noqa:E999
(b'中文1', '4S4K3ZUWQ4YQ===='), # noqa:E999 (b"中文1", "4S4K3ZUWQ4YQ===="), # noqa:E999
(b'中文12', '4S4K3ZUWQ4YTE==='), # noqa:E999 (b"中文12", "4S4K3ZUWQ4YTE==="), # noqa:E999
(b'aécio', 'MHB2SY3JN4======'), # noqa:E999 (b"aécio", "MHB2SY3JN4======"), # noqa:E999
(b'𠜎', '6CQJZDQ='), # noqa:E999 (b"𠜎", "6CQJZDQ="), # noqa:E999
(b'Base64是一種基於64個可列印字元來表示二進制資料的表示方法', # noqa:E999 (b"Base64是一種基於64個可列印字元來表示二進制資料的表示方法", # noqa:E999
'IJQXGZJWGTTJRL7EXCAOPKFO4WP3VZUWXQ3DJZMARPSY7L7FRCL6LDNQ4WWZPZMFQPSL5BXIUGUOPJF24S5IZ2MAWLSYRNXIWOD6NFUZ46NIJ2FBVDT2JOXGS246NM4V') "IJQXGZJWGTTJRL7EXCAOPKFO4WP3VZUWXQ3DJZMARPSY7L7FRCL6LDNQ4WWZPZMFQPSL5BXIUGUOPJF24S5IZ2MAWLSYRNXIWOD6NFUZ46NIJ2FBVDT2JOXGS246NM4V")
] ]
def test_encode(self): def test_encode(self):
@ -42,5 +42,5 @@ class TestCryptoBase32(unittest.TestCase):
self.assertEqual(base32.decode(b), a) self.assertEqual(base32.decode(b), a)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -13,77 +13,243 @@ class TestCryptoBase58(unittest.TestCase):
# vectors from https://github.com/bitcoin/bitcoin/blob/master/src/test/data/base58_keys_valid.json # vectors from https://github.com/bitcoin/bitcoin/blob/master/src/test/data/base58_keys_valid.json
vectors = [ vectors = [
('0065a16059864a2fdbc7c99a4723a8395bc6f188eb', '1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i'), (
('0574f209f6ea907e2ea48f74fae05782ae8a665257', '3CMNFxN1oHBc4R1EpboAL5yzHGgE611Xou'), "0065a16059864a2fdbc7c99a4723a8395bc6f188eb",
('6f53c0307d6851aa0ce7825ba883c6bd9ad242b486', 'mo9ncXisMeAoXwqcV5EWuyncbmCcQN4rVs'), "1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i",
('c46349a418fc4578d10a372b54b45c280cc8c4382f', '2N2JD6wb56AfK4tfmM6PwdVmoYk2dCKf4Br'), ),
('80eddbdc1168f1daeadbd3e44c1e3f8f5a284c2029f78ad26af98583a499de5b19', '5Kd3NBUAdUnhyzenEwVLy9pBKxSwXvE9FMPyR4UKZvpe6E3AgLr'), (
('8055c9bccb9ed68446d1b75273bbce89d7fe013a8acd1625514420fb2aca1a21c401', 'Kz6UJmQACJmLtaQj5A3JAge4kVTNQ8gbvXuwbmCj7bsaabudb3RD'), "0574f209f6ea907e2ea48f74fae05782ae8a665257",
('ef36cb93b9ab1bdabf7fb9f2c04f1b9cc879933530ae7842398eef5a63a56800c2', '9213qJab2HNEpMpYNBa7wHGFKKbkDn24jpANDs2huN3yi4J11ko'), "3CMNFxN1oHBc4R1EpboAL5yzHGgE611Xou",
('efb9f4892c9e8282028fea1d2667c4dc5213564d41fc5783896a0d843fc15089f301', 'cTpB4YiyKiBcPxnefsDpbnDxFDffjqJob8wGCEDXxgQ7zQoMXJdH'), ),
('006d23156cbbdcc82a5a47eee4c2c7c583c18b6bf4', '1Ax4gZtb7gAit2TivwejZHYtNNLT18PUXJ'), (
('05fcc5460dd6e2487c7d75b1963625da0e8f4c5975', '3QjYXhTkvuj8qPaXHTTWb5wjXhdsLAAWVy'), "6f53c0307d6851aa0ce7825ba883c6bd9ad242b486",
('6ff1d470f9b02370fdec2e6b708b08ac431bf7a5f7', 'n3ZddxzLvAY9o7184TB4c6FJasAybsw4HZ'), "mo9ncXisMeAoXwqcV5EWuyncbmCcQN4rVs",
('c4c579342c2c4c9220205e2cdc285617040c924a0a', '2NBFNJTktNa7GZusGbDbGKRZTxdK9VVez3n'), ),
('80a326b95ebae30164217d7a7f57d72ab2b54e3be64928a19da0210b9568d4015e', '5K494XZwps2bGyeL71pWid4noiSNA2cfCibrvRWqcHSptoFn7rc'), (
('807d998b45c219a1e38e99e7cbd312ef67f77a455a9b50c730c27f02c6f730dfb401', 'L1RrrnXkcKut5DEMwtDthjwRcTTwED36thyL1DebVrKuwvohjMNi'), "c46349a418fc4578d10a372b54b45c280cc8c4382f",
('efd6bca256b5abc5602ec2e1c121a08b0da2556587430bcf7e1898af2224885203', '93DVKyFYwSN6wEo3E2fCrFPUp17FtrtNi2Lf7n4G3garFb16CRj'), "2N2JD6wb56AfK4tfmM6PwdVmoYk2dCKf4Br",
('efa81ca4e8f90181ec4b61b6a7eb998af17b2cb04de8a03b504b9e34c4c61db7d901', 'cTDVKtMGVYWTHCb1AFjmVbEbWjvKpKqKgMaR3QJxToMSQAhmCeTN'), ),
('007987ccaa53d02c8873487ef919677cd3db7a6912', '1C5bSj1iEGUgSTbziymG7Cn18ENQuT36vv'), (
('0563bcc565f9e68ee0189dd5cc67f1b0e5f02f45cb', '3AnNxabYGoTxYiTEZwFEnerUoeFXK2Zoks'), "80eddbdc1168f1daeadbd3e44c1e3f8f5a284c2029f78ad26af98583a499de5b19",
('6fef66444b5b17f14e8fae6e7e19b045a78c54fd79', 'n3LnJXCqbPjghuVs8ph9CYsAe4Sh4j97wk'), "5Kd3NBUAdUnhyzenEwVLy9pBKxSwXvE9FMPyR4UKZvpe6E3AgLr",
('c4c3e55fceceaa4391ed2a9677f4a4d34eacd021a0', '2NB72XtkjpnATMggui83aEtPawyyKvnbX2o'), ),
('80e75d936d56377f432f404aabb406601f892fd49da90eb6ac558a733c93b47252', '5KaBW9vNtWNhc3ZEDyNCiXLPdVPHCikRxSBWwV9NrpLLa4LsXi9'), (
('808248bd0375f2f75d7e274ae544fb920f51784480866b102384190b1addfbaa5c01', 'L1axzbSyynNYA8mCAhzxkipKkfHtAXYF4YQnhSKcLV8YXA874fgT'), "8055c9bccb9ed68446d1b75273bbce89d7fe013a8acd1625514420fb2aca1a21c401",
('ef44c4f6a096eac5238291a94cc24c01e3b19b8d8cef72874a079e00a242237a52', '927CnUkUbasYtDwYwVn2j8GdTuACNnKkjZ1rpZd2yBB1CLcnXpo'), "Kz6UJmQACJmLtaQj5A3JAge4kVTNQ8gbvXuwbmCj7bsaabudb3RD",
('efd1de707020a9059d6d3abaf85e17967c6555151143db13dbb06db78df0f15c6901', 'cUcfCMRjiQf85YMzzQEk9d1s5A4K7xL5SmBCLrezqXFuTVefyhY7'), ),
('00adc1cc2081a27206fae25792f28bbc55b831549d', '1Gqk4Tv79P91Cc1STQtU3s1W6277M2CVWu'), (
('05188f91a931947eddd7432d6e614387e32b244709', '33vt8ViH5jsr115AGkW6cEmEz9MpvJSwDk'), "ef36cb93b9ab1bdabf7fb9f2c04f1b9cc879933530ae7842398eef5a63a56800c2",
('6f1694f5bc1a7295b600f40018a618a6ea48eeb498', 'mhaMcBxNh5cqXm4aTQ6EcVbKtfL6LGyK2H'), "9213qJab2HNEpMpYNBa7wHGFKKbkDn24jpANDs2huN3yi4J11ko",
('c43b9b3fd7a50d4f08d1a5b0f62f644fa7115ae2f3', '2MxgPqX1iThW3oZVk9KoFcE5M4JpiETssVN'), ),
('80091035445ef105fa1bb125eccfb1882f3fe69592265956ade751fd095033d8d0', '5HtH6GdcwCJA4ggWEL1B3jzBBUB8HPiBi9SBc5h9i4Wk4PSeApR'), (
('80ab2b4bcdfc91d34dee0ae2a8c6b6668dadaeb3a88b9859743156f462325187af01', 'L2xSYmMeVo3Zek3ZTsv9xUrXVAmrWxJ8Ua4cw8pkfbQhcEFhkXT8'), "efb9f4892c9e8282028fea1d2667c4dc5213564d41fc5783896a0d843fc15089f301",
('efb4204389cef18bbe2b353623cbf93e8678fbc92a475b664ae98ed594e6cf0856', '92xFEve1Z9N8Z641KQQS7ByCSb8kGjsDzw6fAmjHN1LZGKQXyMq'), "cTpB4YiyKiBcPxnefsDpbnDxFDffjqJob8wGCEDXxgQ7zQoMXJdH",
('efe7b230133f1b5489843260236b06edca25f66adb1be455fbd38d4010d48faeef01', 'cVM65tdYu1YK37tNoAyGoJTR13VBYFva1vg9FLuPAsJijGvG6NEA'), ),
('00c4c1b72491ede1eedaca00618407ee0b772cad0d', '1JwMWBVLtiqtscbaRHai4pqHokhFCbtoB4'), (
('05f6fe69bcb548a829cce4c57bf6fff8af3a5981f9', '3QCzvfL4ZRvmJFiWWBVwxfdaNBT8EtxB5y'), "006d23156cbbdcc82a5a47eee4c2c7c583c18b6bf4",
('6f261f83568a098a8638844bd7aeca039d5f2352c0', 'mizXiucXRCsEriQCHUkCqef9ph9qtPbZZ6'), "1Ax4gZtb7gAit2TivwejZHYtNNLT18PUXJ",
('c4e930e1834a4d234702773951d627cce82fbb5d2e', '2NEWDzHWwY5ZZp8CQWbB7ouNMLqCia6YRda'), ),
('80d1fab7ab7385ad26872237f1eb9789aa25cc986bacc695e07ac571d6cdac8bc0', '5KQmDryMNDcisTzRp3zEq9e4awRmJrEVU1j5vFRTKpRNYPqYrMg'), (
('80b0bbede33ef254e8376aceb1510253fc3550efd0fcf84dcd0c9998b288f166b301', 'L39Fy7AC2Hhj95gh3Yb2AU5YHh1mQSAHgpNixvm27poizcJyLtUi'), "05fcc5460dd6e2487c7d75b1963625da0e8f4c5975",
('ef037f4192c630f399d9271e26c575269b1d15be553ea1a7217f0cb8513cef41cb', '91cTVUcgydqyZLgaANpf1fvL55FH53QMm4BsnCADVNYuWuqdVys'), "3QjYXhTkvuj8qPaXHTTWb5wjXhdsLAAWVy",
('ef6251e205e8ad508bab5596bee086ef16cd4b239e0cc0c5d7c4e6035441e7d5de01', 'cQspfSzsgLeiJGB2u8vrAiWpCU4MxUT6JseWo2SjXy4Qbzn2fwDw'), ),
('005eadaf9bb7121f0f192561a5a62f5e5f54210292', '19dcawoKcZdQz365WpXWMhX6QCUpR9SY4r'), (
('053f210e7277c899c3a155cc1c90f4106cbddeec6e', '37Sp6Rv3y4kVd1nQ1JV5pfqXccHNyZm1x3'), "6ff1d470f9b02370fdec2e6b708b08ac431bf7a5f7",
('6fc8a3c2a09a298592c3e180f02487cd91ba3400b5', 'myoqcgYiehufrsnnkqdqbp69dddVDMopJu'), "n3ZddxzLvAY9o7184TB4c6FJasAybsw4HZ",
('c499b31df7c9068d1481b596578ddbb4d3bd90baeb', '2N7FuwuUuoTBrDFdrAZ9KxBmtqMLxce9i1C'), ),
('80c7666842503db6dc6ea061f092cfb9c388448629a6fe868d068c42a488b478ae', '5KL6zEaMtPRXZKo1bbMq7JDjjo1bJuQcsgL33je3oY8uSJCR5b4'), (
('8007f0803fc5399e773555ab1e8939907e9badacc17ca129e67a2f5f2ff84351dd01', 'KwV9KAfwbwt51veZWNscRTeZs9CKpojyu1MsPnaKTF5kz69H1UN2'), "c4c579342c2c4c9220205e2cdc285617040c924a0a",
('efea577acfb5d1d14d3b7b195c321566f12f87d2b77ea3a53f68df7ebf8604a801', '93N87D6uxSBzwXvpokpzg8FFmfQPmvX4xHoWQe3pLdYpbiwT5YV'), "2NBFNJTktNa7GZusGbDbGKRZTxdK9VVez3n",
('ef0b3b34f0958d8a268193a9814da92c3e8b58b4a4378a542863e34ac289cd830c01', 'cMxXusSihaX58wpJ3tNuuUcZEQGt6DKJ1wEpxys88FFaQCYjku9h'), ),
('001ed467017f043e91ed4c44b4e8dd674db211c4e6', '13p1ijLwsnrcuyqcTvJXkq2ASdXqcnEBLE'), (
('055ece0cadddc415b1980f001785947120acdb36fc', '3ALJH9Y951VCGcVZYAdpA3KchoP9McEj1G'), "80a326b95ebae30164217d7a7f57d72ab2b54e3be64928a19da0210b9568d4015e",
"5K494XZwps2bGyeL71pWid4noiSNA2cfCibrvRWqcHSptoFn7rc",
),
(
"807d998b45c219a1e38e99e7cbd312ef67f77a455a9b50c730c27f02c6f730dfb401",
"L1RrrnXkcKut5DEMwtDthjwRcTTwED36thyL1DebVrKuwvohjMNi",
),
(
"efd6bca256b5abc5602ec2e1c121a08b0da2556587430bcf7e1898af2224885203",
"93DVKyFYwSN6wEo3E2fCrFPUp17FtrtNi2Lf7n4G3garFb16CRj",
),
(
"efa81ca4e8f90181ec4b61b6a7eb998af17b2cb04de8a03b504b9e34c4c61db7d901",
"cTDVKtMGVYWTHCb1AFjmVbEbWjvKpKqKgMaR3QJxToMSQAhmCeTN",
),
(
"007987ccaa53d02c8873487ef919677cd3db7a6912",
"1C5bSj1iEGUgSTbziymG7Cn18ENQuT36vv",
),
(
"0563bcc565f9e68ee0189dd5cc67f1b0e5f02f45cb",
"3AnNxabYGoTxYiTEZwFEnerUoeFXK2Zoks",
),
(
"6fef66444b5b17f14e8fae6e7e19b045a78c54fd79",
"n3LnJXCqbPjghuVs8ph9CYsAe4Sh4j97wk",
),
(
"c4c3e55fceceaa4391ed2a9677f4a4d34eacd021a0",
"2NB72XtkjpnATMggui83aEtPawyyKvnbX2o",
),
(
"80e75d936d56377f432f404aabb406601f892fd49da90eb6ac558a733c93b47252",
"5KaBW9vNtWNhc3ZEDyNCiXLPdVPHCikRxSBWwV9NrpLLa4LsXi9",
),
(
"808248bd0375f2f75d7e274ae544fb920f51784480866b102384190b1addfbaa5c01",
"L1axzbSyynNYA8mCAhzxkipKkfHtAXYF4YQnhSKcLV8YXA874fgT",
),
(
"ef44c4f6a096eac5238291a94cc24c01e3b19b8d8cef72874a079e00a242237a52",
"927CnUkUbasYtDwYwVn2j8GdTuACNnKkjZ1rpZd2yBB1CLcnXpo",
),
(
"efd1de707020a9059d6d3abaf85e17967c6555151143db13dbb06db78df0f15c6901",
"cUcfCMRjiQf85YMzzQEk9d1s5A4K7xL5SmBCLrezqXFuTVefyhY7",
),
(
"00adc1cc2081a27206fae25792f28bbc55b831549d",
"1Gqk4Tv79P91Cc1STQtU3s1W6277M2CVWu",
),
(
"05188f91a931947eddd7432d6e614387e32b244709",
"33vt8ViH5jsr115AGkW6cEmEz9MpvJSwDk",
),
(
"6f1694f5bc1a7295b600f40018a618a6ea48eeb498",
"mhaMcBxNh5cqXm4aTQ6EcVbKtfL6LGyK2H",
),
(
"c43b9b3fd7a50d4f08d1a5b0f62f644fa7115ae2f3",
"2MxgPqX1iThW3oZVk9KoFcE5M4JpiETssVN",
),
(
"80091035445ef105fa1bb125eccfb1882f3fe69592265956ade751fd095033d8d0",
"5HtH6GdcwCJA4ggWEL1B3jzBBUB8HPiBi9SBc5h9i4Wk4PSeApR",
),
(
"80ab2b4bcdfc91d34dee0ae2a8c6b6668dadaeb3a88b9859743156f462325187af01",
"L2xSYmMeVo3Zek3ZTsv9xUrXVAmrWxJ8Ua4cw8pkfbQhcEFhkXT8",
),
(
"efb4204389cef18bbe2b353623cbf93e8678fbc92a475b664ae98ed594e6cf0856",
"92xFEve1Z9N8Z641KQQS7ByCSb8kGjsDzw6fAmjHN1LZGKQXyMq",
),
(
"efe7b230133f1b5489843260236b06edca25f66adb1be455fbd38d4010d48faeef01",
"cVM65tdYu1YK37tNoAyGoJTR13VBYFva1vg9FLuPAsJijGvG6NEA",
),
(
"00c4c1b72491ede1eedaca00618407ee0b772cad0d",
"1JwMWBVLtiqtscbaRHai4pqHokhFCbtoB4",
),
(
"05f6fe69bcb548a829cce4c57bf6fff8af3a5981f9",
"3QCzvfL4ZRvmJFiWWBVwxfdaNBT8EtxB5y",
),
(
"6f261f83568a098a8638844bd7aeca039d5f2352c0",
"mizXiucXRCsEriQCHUkCqef9ph9qtPbZZ6",
),
(
"c4e930e1834a4d234702773951d627cce82fbb5d2e",
"2NEWDzHWwY5ZZp8CQWbB7ouNMLqCia6YRda",
),
(
"80d1fab7ab7385ad26872237f1eb9789aa25cc986bacc695e07ac571d6cdac8bc0",
"5KQmDryMNDcisTzRp3zEq9e4awRmJrEVU1j5vFRTKpRNYPqYrMg",
),
(
"80b0bbede33ef254e8376aceb1510253fc3550efd0fcf84dcd0c9998b288f166b301",
"L39Fy7AC2Hhj95gh3Yb2AU5YHh1mQSAHgpNixvm27poizcJyLtUi",
),
(
"ef037f4192c630f399d9271e26c575269b1d15be553ea1a7217f0cb8513cef41cb",
"91cTVUcgydqyZLgaANpf1fvL55FH53QMm4BsnCADVNYuWuqdVys",
),
(
"ef6251e205e8ad508bab5596bee086ef16cd4b239e0cc0c5d7c4e6035441e7d5de01",
"cQspfSzsgLeiJGB2u8vrAiWpCU4MxUT6JseWo2SjXy4Qbzn2fwDw",
),
(
"005eadaf9bb7121f0f192561a5a62f5e5f54210292",
"19dcawoKcZdQz365WpXWMhX6QCUpR9SY4r",
),
(
"053f210e7277c899c3a155cc1c90f4106cbddeec6e",
"37Sp6Rv3y4kVd1nQ1JV5pfqXccHNyZm1x3",
),
(
"6fc8a3c2a09a298592c3e180f02487cd91ba3400b5",
"myoqcgYiehufrsnnkqdqbp69dddVDMopJu",
),
(
"c499b31df7c9068d1481b596578ddbb4d3bd90baeb",
"2N7FuwuUuoTBrDFdrAZ9KxBmtqMLxce9i1C",
),
(
"80c7666842503db6dc6ea061f092cfb9c388448629a6fe868d068c42a488b478ae",
"5KL6zEaMtPRXZKo1bbMq7JDjjo1bJuQcsgL33je3oY8uSJCR5b4",
),
(
"8007f0803fc5399e773555ab1e8939907e9badacc17ca129e67a2f5f2ff84351dd01",
"KwV9KAfwbwt51veZWNscRTeZs9CKpojyu1MsPnaKTF5kz69H1UN2",
),
(
"efea577acfb5d1d14d3b7b195c321566f12f87d2b77ea3a53f68df7ebf8604a801",
"93N87D6uxSBzwXvpokpzg8FFmfQPmvX4xHoWQe3pLdYpbiwT5YV",
),
(
"ef0b3b34f0958d8a268193a9814da92c3e8b58b4a4378a542863e34ac289cd830c01",
"cMxXusSihaX58wpJ3tNuuUcZEQGt6DKJ1wEpxys88FFaQCYjku9h",
),
(
"001ed467017f043e91ed4c44b4e8dd674db211c4e6",
"13p1ijLwsnrcuyqcTvJXkq2ASdXqcnEBLE",
),
(
"055ece0cadddc415b1980f001785947120acdb36fc",
"3ALJH9Y951VCGcVZYAdpA3KchoP9McEj1G",
),
] ]
vectors_graphene = [ vectors_graphene = [
('02e649f63f8e8121345fd7f47d0d185a3ccaa843115cd2e9392dcd9b82263bc680', '6dumtt9swxCqwdPZBGXh9YmHoEjFFnNfwHaTqRbQTghGAY2gRz'), (
('021c7359cd885c0e319924d97e3980206ad64387aff54908241125b3a88b55ca16', '5725vivYpuFWbeyTifZ5KevnHyqXCi5hwHbNU9cYz1FHbFXCxX'), "02e649f63f8e8121345fd7f47d0d185a3ccaa843115cd2e9392dcd9b82263bc680",
('02f561e0b57a552df3fa1df2d87a906b7a9fc33a83d5d15fa68a644ecb0806b49a', '6kZKHSuxqAwdCYsMvwTcipoTsNE2jmEUNBQufGYywpniBKXWZK'), "6dumtt9swxCqwdPZBGXh9YmHoEjFFnNfwHaTqRbQTghGAY2gRz",
('03e7595c3e6b58f907bee951dc29796f3757307e700ecf3d09307a0cc4a564eba3', '8b82mpnH8YX1E9RHnU2a2YgLTZ8ooevEGP9N15c1yFqhoBvJur'), ),
(
"021c7359cd885c0e319924d97e3980206ad64387aff54908241125b3a88b55ca16",
"5725vivYpuFWbeyTifZ5KevnHyqXCi5hwHbNU9cYz1FHbFXCxX",
),
(
"02f561e0b57a552df3fa1df2d87a906b7a9fc33a83d5d15fa68a644ecb0806b49a",
"6kZKHSuxqAwdCYsMvwTcipoTsNE2jmEUNBQufGYywpniBKXWZK",
),
(
"03e7595c3e6b58f907bee951dc29796f3757307e700ecf3d09307a0cc4a564eba3",
"8b82mpnH8YX1E9RHnU2a2YgLTZ8ooevEGP9N15c1yFqhoBvJur",
),
] ]
def test_decode_check(self): def test_decode_check(self):
for a, b in self.vectors: for a, b in self.vectors:
self.assertEqual(base58.decode_check(b), unhexlify(a)) self.assertEqual(base58.decode_check(b), unhexlify(a))
for a, b in self.vectors_graphene: for a, b in self.vectors_graphene:
self.assertEqual(base58.decode_check(b, digestfunc=digestfunc_graphene), unhexlify(a)) self.assertEqual(
base58.decode_check(b, digestfunc=digestfunc_graphene), unhexlify(a)
)
def test_encode_check(self): def test_encode_check(self):
for a, b in self.vectors: for a, b in self.vectors:
self.assertEqual(base58.encode_check(unhexlify(a)), b) self.assertEqual(base58.encode_check(unhexlify(a)), b)
for a, b in self.vectors_graphene: for a, b in self.vectors_graphene:
self.assertEqual(base58.encode_check(unhexlify(a), digestfunc=digestfunc_graphene), b) self.assertEqual(
base58.encode_check(unhexlify(a), digestfunc=digestfunc_graphene), b
)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -34,18 +34,36 @@ VALID_CHECKSUM = [
# BIP-173 # BIP-173
("A12UEL5L", bech32.Encoding.BECH32), ("A12UEL5L", bech32.Encoding.BECH32),
("a12uel5l", bech32.Encoding.BECH32), ("a12uel5l", bech32.Encoding.BECH32),
("an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio1tt5tgs", bech32.Encoding.BECH32), (
"an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio1tt5tgs",
bech32.Encoding.BECH32,
),
("abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw", bech32.Encoding.BECH32), ("abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw", bech32.Encoding.BECH32),
("11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j", bech32.Encoding.BECH32), (
("split1checkupstagehandshakeupstreamerranterredcaperred2y9e3w", bech32.Encoding.BECH32), "11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j",
bech32.Encoding.BECH32,
),
(
"split1checkupstagehandshakeupstreamerranterredcaperred2y9e3w",
bech32.Encoding.BECH32,
),
("?1ezyfcl", bech32.Encoding.BECH32), ("?1ezyfcl", bech32.Encoding.BECH32),
# BIP-350 # BIP-350
("A1LQFN3A", bech32.Encoding.BECH32M), ("A1LQFN3A", bech32.Encoding.BECH32M),
("a1lqfn3a", bech32.Encoding.BECH32M), ("a1lqfn3a", bech32.Encoding.BECH32M),
("an83characterlonghumanreadablepartthatcontainsthetheexcludedcharactersbioandnumber11sg7hg6", bech32.Encoding.BECH32M), (
"an83characterlonghumanreadablepartthatcontainsthetheexcludedcharactersbioandnumber11sg7hg6",
bech32.Encoding.BECH32M,
),
("abcdef1l7aum6echk45nj3s0wdvt2fg8x9yrzpqzd3ryx", bech32.Encoding.BECH32M), ("abcdef1l7aum6echk45nj3s0wdvt2fg8x9yrzpqzd3ryx", bech32.Encoding.BECH32M),
("11llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllludsr8", bech32.Encoding.BECH32M), (
("split1checkupstagehandshakeupstreamerranterredcaperredlc445v", bech32.Encoding.BECH32M), "11llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllludsr8",
bech32.Encoding.BECH32M,
),
(
"split1checkupstagehandshakeupstreamerranterredcaperredlc445v",
bech32.Encoding.BECH32M,
),
("?1v759aa", bech32.Encoding.BECH32M), ("?1v759aa", bech32.Encoding.BECH32M),
] ]
@ -82,20 +100,45 @@ INVALID_CHECKSUM = [
VALID_ADDRESS = [ VALID_ADDRESS = [
# BIP-173 # BIP-173
("BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4", "0014751e76e8199196d454941c45d1b3a323f1433bd6"), (
("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7", "BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4",
"00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262"), "0014751e76e8199196d454941c45d1b3a323f1433bd6",
("tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy", ),
"0020000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433"), (
"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7",
"00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262",
),
(
"tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy",
"0020000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433",
),
# BIP-350 # BIP-350
("BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4", "0014751e76e8199196d454941c45d1b3a323f1433bd6"), (
("tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7", "00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262"), "BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4",
("bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kt5nd6y", "5128751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45d1b3a323f1433bd6"), "0014751e76e8199196d454941c45d1b3a323f1433bd6",
),
(
"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7",
"00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262",
),
(
"bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kt5nd6y",
"5128751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45d1b3a323f1433bd6",
),
("BC1SW50QGDZ25J", "6002751e"), ("BC1SW50QGDZ25J", "6002751e"),
("bc1zw508d6qejxtdg4y5r3zarvaryvaxxpcs", "5210751e76e8199196d454941c45d1b3a323"), ("bc1zw508d6qejxtdg4y5r3zarvaryvaxxpcs", "5210751e76e8199196d454941c45d1b3a323"),
("tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy", "0020000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433"), (
("tb1pqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesf3hn0c", "5120000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433"), "tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy",
("bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqzk5jj0", "512079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"), "0020000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433",
),
(
"tb1pqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesf3hn0c",
"5120000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433",
),
(
"bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqzk5jj0",
"512079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
),
] ]
INVALID_ADDRESS = [ INVALID_ADDRESS = [

View File

@ -2,286 +2,731 @@ from common import *
from trezor.crypto import bip32 from trezor.crypto import bip32
SECP256K1_NAME = 'secp256k1' SECP256K1_NAME = "secp256k1"
HARDENED = 0x80000000 HARDENED = 0x80000000
VERSION_PUBLIC = 0x0488b21e VERSION_PUBLIC = 0x0488B21E
VERSION_PRIVATE = 0x0488ade4 VERSION_PRIVATE = 0x0488ADE4
class TestCryptoBip32(unittest.TestCase): class TestCryptoBip32(unittest.TestCase):
def test_from_seed_invalid(self): def test_from_seed_invalid(self):
for c in [SECP256K1_NAME]: for c in [SECP256K1_NAME]:
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
bip32.from_seed('', c) bip32.from_seed("", c)
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
bip32.from_seed(bytes(), c) bip32.from_seed(bytes(), c)
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
bip32.from_seed(bytearray(), c) bip32.from_seed(bytearray(), c)
with self.assertRaises(TypeError): with self.assertRaises(TypeError):
bip32.from_seed(1, c) bip32.from_seed(1, c)
s = unhexlify('000102030405060708090a0b0c0d0e0f') s = unhexlify("000102030405060708090a0b0c0d0e0f")
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
bip32.from_seed(s, '') bip32.from_seed(s, "")
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
bip32.from_seed(s, bytes()) bip32.from_seed(s, bytes())
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
bip32.from_seed(s, bytearray()) bip32.from_seed(s, bytearray())
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
bip32.from_seed(s, 'foobar') bip32.from_seed(s, "foobar")
def test_secp256k1_vector_1_derive(self): def test_secp256k1_vector_1_derive(self):
# pylint: disable=C0301 # pylint: disable=C0301
# test vector 1 from https://en.bitcoin.it/wiki/BIP_0032_TestVectors # test vector 1 from https://en.bitcoin.it/wiki/BIP_0032_TestVectors
# init m # init m
n = bip32.from_seed(unhexlify('000102030405060708090a0b0c0d0e0f'), SECP256K1_NAME) n = bip32.from_seed(
unhexlify("000102030405060708090a0b0c0d0e0f"), SECP256K1_NAME
)
# [Chain m] # [Chain m]
self.assertEqual(n.fingerprint(), 0x00000000) self.assertEqual(n.fingerprint(), 0x00000000)
self.assertEqual(n.chain_code(), unhexlify('873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2')) unhexlify(
"873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8') self.assertEqual(
ns,
"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8",
)
# [Chain m/0'] # [Chain m/0']
n.derive(HARDENED | 0) n.derive(HARDENED | 0)
self.assertEqual(n.fingerprint(), 0x3442193e) self.assertEqual(n.fingerprint(), 0x3442193E)
self.assertEqual(n.chain_code(), unhexlify('47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56')) unhexlify(
"47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw') self.assertEqual(
ns,
"xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw",
)
# [Chain m/0'/1] # [Chain m/0'/1]
n.derive(1) n.derive(1)
self.assertEqual(n.fingerprint(), 0x5c1bd648) self.assertEqual(n.fingerprint(), 0x5C1BD648)
self.assertEqual(n.chain_code(), unhexlify('2a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('3c6cb8d0f6a264c91ea8b5030fadaa8e538b020f0a387421a12de9319dc93368')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('03501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c')) unhexlify(
"2a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"3c6cb8d0f6a264c91ea8b5030fadaa8e538b020f0a387421a12de9319dc93368"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"03501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ') self.assertEqual(
ns,
"xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ",
)
# [Chain m/0'/1/2'] # [Chain m/0'/1/2']
n.derive(HARDENED | 2) n.derive(HARDENED | 2)
self.assertEqual(n.fingerprint(), 0xbef5a2f9) self.assertEqual(n.fingerprint(), 0xBEF5A2F9)
self.assertEqual(n.chain_code(), unhexlify('04466b9cc8e161e966409ca52986c584f07e9dc81f735db683c3ff6ec7b1503f')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('cbce0d719ecf7431d88e6a89fa1483e02e35092af60c042b1df2ff59fa424dca')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('0357bfe1e341d01c69fe5654309956cbea516822fba8a601743a012a7896ee8dc2')) unhexlify(
"04466b9cc8e161e966409ca52986c584f07e9dc81f735db683c3ff6ec7b1503f"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"cbce0d719ecf7431d88e6a89fa1483e02e35092af60c042b1df2ff59fa424dca"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"0357bfe1e341d01c69fe5654309956cbea516822fba8a601743a012a7896ee8dc2"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5') self.assertEqual(
ns,
"xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5",
)
# [Chain m/0'/1/2'/2] # [Chain m/0'/1/2'/2]
n.derive(2) n.derive(2)
self.assertEqual(n.fingerprint(), 0xee7ab90c) self.assertEqual(n.fingerprint(), 0xEE7AB90C)
self.assertEqual(n.chain_code(), unhexlify('cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('0f479245fb19a38a1954c5c7c0ebab2f9bdfd96a17563ef28a6a4b1a2a764ef4')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29')) unhexlify(
"cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"0f479245fb19a38a1954c5c7c0ebab2f9bdfd96a17563ef28a6a4b1a2a764ef4"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV') self.assertEqual(
ns,
"xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV",
)
# [Chain m/0'/1/2'/2/1000000000] # [Chain m/0'/1/2'/2/1000000000]
n.derive(1000000000) n.derive(1000000000)
self.assertEqual(n.fingerprint(), 0xd880d7d8) self.assertEqual(n.fingerprint(), 0xD880D7D8)
self.assertEqual(n.chain_code(), unhexlify('c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('471b76e389e528d6de6d816857e012c5455051cad6660850e58372a6c3e6e7c8')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('022a471424da5e657499d1ff51cb43c47481a03b1e77f951fe64cec9f5a48f7011')) unhexlify(
"c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"471b76e389e528d6de6d816857e012c5455051cad6660850e58372a6c3e6e7c8"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"022a471424da5e657499d1ff51cb43c47481a03b1e77f951fe64cec9f5a48f7011"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy') self.assertEqual(
ns,
"xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy",
)
def test_secp256k1_vector_2_derive(self): def test_secp256k1_vector_2_derive(self):
# pylint: disable=C0301 # pylint: disable=C0301
# test vector 2 from https://en.bitcoin.it/wiki/BIP_0032_TestVectors # test vector 2 from https://en.bitcoin.it/wiki/BIP_0032_TestVectors
# init m # init m
n = bip32.from_seed(unhexlify('fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542'), SECP256K1_NAME) n = bip32.from_seed(
unhexlify(
"fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542"
),
SECP256K1_NAME,
)
# [Chain m] # [Chain m]
self.assertEqual(n.fingerprint(), 0x00000000) self.assertEqual(n.fingerprint(), 0x00000000)
self.assertEqual(n.chain_code(), unhexlify('60499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('4b03d6fc340455b363f51020ad3ecca4f0850280cf436c70c727923f6db46c3e')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('03cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7')) unhexlify(
"60499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"4b03d6fc340455b363f51020ad3ecca4f0850280cf436c70c727923f6db46c3e"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"03cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB') self.assertEqual(
ns,
"xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB",
)
# [Chain m/0] # [Chain m/0]
n.derive(0) n.derive(0)
self.assertEqual(n.fingerprint(), 0xbd16bee5) self.assertEqual(n.fingerprint(), 0xBD16BEE5)
self.assertEqual(n.chain_code(), unhexlify('f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('abe74a98f6c7eabee0428f53798f0ab8aa1bd37873999041703c742f15ac7e1e')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea')) unhexlify(
"f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"abe74a98f6c7eabee0428f53798f0ab8aa1bd37873999041703c742f15ac7e1e"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH') self.assertEqual(
ns,
"xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH",
)
# [Chain m/0/2147483647'] # [Chain m/0/2147483647']
n.derive(HARDENED | 2147483647) n.derive(HARDENED | 2147483647)
self.assertEqual(n.fingerprint(), 0x5a61ff8e) self.assertEqual(n.fingerprint(), 0x5A61FF8E)
self.assertEqual(n.chain_code(), unhexlify('be17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d9')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('877c779ad9687164e9c2f4f0f4ff0340814392330693ce95a58fe18fd52e6e93')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('03c01e7425647bdefa82b12d9bad5e3e6865bee0502694b94ca58b666abc0a5c3b')) unhexlify(
"be17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d9"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"877c779ad9687164e9c2f4f0f4ff0340814392330693ce95a58fe18fd52e6e93"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"03c01e7425647bdefa82b12d9bad5e3e6865bee0502694b94ca58b666abc0a5c3b"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a') self.assertEqual(
ns,
"xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a",
)
# [Chain m/0/2147483647'/1] # [Chain m/0/2147483647'/1]
n.derive(1) n.derive(1)
self.assertEqual(n.fingerprint(), 0xd8ab4937) self.assertEqual(n.fingerprint(), 0xD8AB4937)
self.assertEqual(n.chain_code(), unhexlify('f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('704addf544a06e5ee4bea37098463c23613da32020d604506da8c0518e1da4b7')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('03a7d1d856deb74c508e05031f9895dab54626251b3806e16b4bd12e781a7df5b9')) unhexlify(
"f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"704addf544a06e5ee4bea37098463c23613da32020d604506da8c0518e1da4b7"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"03a7d1d856deb74c508e05031f9895dab54626251b3806e16b4bd12e781a7df5b9"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon') self.assertEqual(
ns,
"xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon",
)
# [Chain m/0/2147483647'/1/2147483646'] # [Chain m/0/2147483647'/1/2147483646']
n.derive(HARDENED | 2147483646) n.derive(HARDENED | 2147483646)
self.assertEqual(n.fingerprint(), 0x78412e3a) self.assertEqual(n.fingerprint(), 0x78412E3A)
self.assertEqual(n.chain_code(), unhexlify('637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e29')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('f1c7c871a54a804afe328b4c83a1c33b8e5ff48f5087273f04efa83b247d6a2d')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('02d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0')) unhexlify(
"637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e29"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"f1c7c871a54a804afe328b4c83a1c33b8e5ff48f5087273f04efa83b247d6a2d"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"02d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL') self.assertEqual(
ns,
"xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL",
)
# [Chain m/0/2147483647'/1/2147483646'/2] # [Chain m/0/2147483647'/1/2147483646'/2]
n.derive(2) n.derive(2)
self.assertEqual(n.fingerprint(), 0x31a507b8) self.assertEqual(n.fingerprint(), 0x31A507B8)
self.assertEqual(n.chain_code(), unhexlify('9452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('bb7d39bdb83ecf58f2fd82b6d918341cbef428661ef01ab97c28a4842125ac23')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c')) unhexlify(
"9452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"bb7d39bdb83ecf58f2fd82b6d918341cbef428661ef01ab97c28a4842125ac23"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt') self.assertEqual(
ns,
"xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt",
)
def test_secp256k1_vector_1_derive_path(self): def test_secp256k1_vector_1_derive_path(self):
# pylint: disable=C0301 # pylint: disable=C0301
# test vector 1 from https://en.bitcoin.it/wiki/BIP_0032_TestVectors # test vector 1 from https://en.bitcoin.it/wiki/BIP_0032_TestVectors
# init m # init m
m = bip32.from_seed(unhexlify('000102030405060708090a0b0c0d0e0f'), SECP256K1_NAME) m = bip32.from_seed(
unhexlify("000102030405060708090a0b0c0d0e0f"), SECP256K1_NAME
)
# [Chain m] # [Chain m]
n = m.clone() n = m.clone()
self.assertEqual(n.fingerprint(), 0x00000000) self.assertEqual(n.fingerprint(), 0x00000000)
self.assertEqual(n.chain_code(), unhexlify('873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2')) unhexlify(
"873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8') self.assertEqual(
ns,
"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8",
)
# [Chain m/0'] # [Chain m/0']
n = m.clone() n = m.clone()
n.derive_path([HARDENED | 0]) n.derive_path([HARDENED | 0])
self.assertEqual(n.fingerprint(), 0x3442193e) self.assertEqual(n.fingerprint(), 0x3442193E)
self.assertEqual(n.chain_code(), unhexlify('47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56')) unhexlify(
"47fdacbd0f1097043b78c63c20c34ef4ed9a111d980047ad16282c7ae6236141"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"edb2e14f9ee77d26dd93b4ecede8d16ed408ce149b6cd80b0715a2d911a0afea"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"035a784662a4a20a65bf6aab9ae98a6c068a81c52e4b032c0fb5400c706cfccc56"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw') self.assertEqual(
ns,
"xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw",
)
# [Chain m/0'/1] # [Chain m/0'/1]
n = m.clone() n = m.clone()
n.derive_path([HARDENED | 0, 1]) n.derive_path([HARDENED | 0, 1])
self.assertEqual(n.fingerprint(), 0x5c1bd648) self.assertEqual(n.fingerprint(), 0x5C1BD648)
self.assertEqual(n.chain_code(), unhexlify('2a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('3c6cb8d0f6a264c91ea8b5030fadaa8e538b020f0a387421a12de9319dc93368')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('03501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c')) unhexlify(
"2a7857631386ba23dacac34180dd1983734e444fdbf774041578e9b6adb37c19"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"3c6cb8d0f6a264c91ea8b5030fadaa8e538b020f0a387421a12de9319dc93368"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"03501e454bf00751f24b1b489aa925215d66af2234e3891c3b21a52bedb3cd711c"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ') self.assertEqual(
ns,
"xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ",
)
# [Chain m/0'/1/2'] # [Chain m/0'/1/2']
n = m.clone() n = m.clone()
n.derive_path([HARDENED | 0, 1, HARDENED | 2]) n.derive_path([HARDENED | 0, 1, HARDENED | 2])
self.assertEqual(n.fingerprint(), 0xbef5a2f9) self.assertEqual(n.fingerprint(), 0xBEF5A2F9)
self.assertEqual(n.chain_code(), unhexlify('04466b9cc8e161e966409ca52986c584f07e9dc81f735db683c3ff6ec7b1503f')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('cbce0d719ecf7431d88e6a89fa1483e02e35092af60c042b1df2ff59fa424dca')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('0357bfe1e341d01c69fe5654309956cbea516822fba8a601743a012a7896ee8dc2')) unhexlify(
"04466b9cc8e161e966409ca52986c584f07e9dc81f735db683c3ff6ec7b1503f"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"cbce0d719ecf7431d88e6a89fa1483e02e35092af60c042b1df2ff59fa424dca"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"0357bfe1e341d01c69fe5654309956cbea516822fba8a601743a012a7896ee8dc2"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5') self.assertEqual(
ns,
"xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5",
)
# [Chain m/0'/1/2'/2] # [Chain m/0'/1/2'/2]
n = m.clone() n = m.clone()
n.derive_path([HARDENED | 0, 1, HARDENED | 2, 2]) n.derive_path([HARDENED | 0, 1, HARDENED | 2, 2])
self.assertEqual(n.fingerprint(), 0xee7ab90c) self.assertEqual(n.fingerprint(), 0xEE7AB90C)
self.assertEqual(n.chain_code(), unhexlify('cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('0f479245fb19a38a1954c5c7c0ebab2f9bdfd96a17563ef28a6a4b1a2a764ef4')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29')) unhexlify(
"cfb71883f01676f587d023cc53a35bc7f88f724b1f8c2892ac1275ac822a3edd"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"0f479245fb19a38a1954c5c7c0ebab2f9bdfd96a17563ef28a6a4b1a2a764ef4"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"02e8445082a72f29b75ca48748a914df60622a609cacfce8ed0e35804560741d29"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV') self.assertEqual(
ns,
"xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV",
)
# [Chain m/0'/1/2'/2/1000000000] # [Chain m/0'/1/2'/2/1000000000]
n = m.clone() n = m.clone()
n.derive_path([HARDENED | 0, 1, HARDENED | 2, 2, 1000000000]) n.derive_path([HARDENED | 0, 1, HARDENED | 2, 2, 1000000000])
self.assertEqual(n.fingerprint(), 0xd880d7d8) self.assertEqual(n.fingerprint(), 0xD880D7D8)
self.assertEqual(n.chain_code(), unhexlify('c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('471b76e389e528d6de6d816857e012c5455051cad6660850e58372a6c3e6e7c8')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('022a471424da5e657499d1ff51cb43c47481a03b1e77f951fe64cec9f5a48f7011')) unhexlify(
"c783e67b921d2beb8f6b389cc646d7263b4145701dadd2161548a8b078e65e9e"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"471b76e389e528d6de6d816857e012c5455051cad6660850e58372a6c3e6e7c8"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"022a471424da5e657499d1ff51cb43c47481a03b1e77f951fe64cec9f5a48f7011"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy') self.assertEqual(
ns,
"xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy",
)
def test_secp256k1_vector_2_derive_path(self): def test_secp256k1_vector_2_derive_path(self):
# pylint: disable=C0301 # pylint: disable=C0301
# test vector 2 from https://en.bitcoin.it/wiki/BIP_0032_TestVectors # test vector 2 from https://en.bitcoin.it/wiki/BIP_0032_TestVectors
# init m # init m
m = bip32.from_seed(unhexlify('fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542'), SECP256K1_NAME) m = bip32.from_seed(
unhexlify(
"fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542"
),
SECP256K1_NAME,
)
# [Chain m] # [Chain m]
n = m.clone() n = m.clone()
self.assertEqual(n.fingerprint(), 0x00000000) self.assertEqual(n.fingerprint(), 0x00000000)
self.assertEqual(n.chain_code(), unhexlify('60499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('4b03d6fc340455b363f51020ad3ecca4f0850280cf436c70c727923f6db46c3e')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('03cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7')) unhexlify(
"60499f801b896d83179a4374aeb7822aaeaceaa0db1f85ee3e904c4defbd9689"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"4b03d6fc340455b363f51020ad3ecca4f0850280cf436c70c727923f6db46c3e"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"03cbcaa9c98c877a26977d00825c956a238e8dddfbd322cce4f74b0b5bd6ace4a7"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB') self.assertEqual(
ns,
"xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB",
)
# [Chain m/0] # [Chain m/0]
n = m.clone() n = m.clone()
n.derive_path([0]) n.derive_path([0])
self.assertEqual(n.fingerprint(), 0xbd16bee5) self.assertEqual(n.fingerprint(), 0xBD16BEE5)
self.assertEqual(n.chain_code(), unhexlify('f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('abe74a98f6c7eabee0428f53798f0ab8aa1bd37873999041703c742f15ac7e1e')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea')) unhexlify(
"f0909affaa7ee7abe5dd4e100598d4dc53cd709d5a5c2cac40e7412f232f7c9c"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"abe74a98f6c7eabee0428f53798f0ab8aa1bd37873999041703c742f15ac7e1e"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"02fc9e5af0ac8d9b3cecfe2a888e2117ba3d089d8585886c9c826b6b22a98d12ea"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH') self.assertEqual(
ns,
"xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH",
)
# [Chain m/0/2147483647'] # [Chain m/0/2147483647']
n = m.clone() n = m.clone()
n.derive_path([0, HARDENED | 2147483647]) n.derive_path([0, HARDENED | 2147483647])
self.assertEqual(n.fingerprint(), 0x5a61ff8e) self.assertEqual(n.fingerprint(), 0x5A61FF8E)
self.assertEqual(n.chain_code(), unhexlify('be17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d9')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('877c779ad9687164e9c2f4f0f4ff0340814392330693ce95a58fe18fd52e6e93')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('03c01e7425647bdefa82b12d9bad5e3e6865bee0502694b94ca58b666abc0a5c3b')) unhexlify(
"be17a268474a6bb9c61e1d720cf6215e2a88c5406c4aee7b38547f585c9a37d9"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"877c779ad9687164e9c2f4f0f4ff0340814392330693ce95a58fe18fd52e6e93"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"03c01e7425647bdefa82b12d9bad5e3e6865bee0502694b94ca58b666abc0a5c3b"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a') self.assertEqual(
ns,
"xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a",
)
# [Chain m/0/2147483647'/1] # [Chain m/0/2147483647'/1]
n = m.clone() n = m.clone()
n.derive_path([0, HARDENED | 2147483647, 1]) n.derive_path([0, HARDENED | 2147483647, 1])
self.assertEqual(n.fingerprint(), 0xd8ab4937) self.assertEqual(n.fingerprint(), 0xD8AB4937)
self.assertEqual(n.chain_code(), unhexlify('f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('704addf544a06e5ee4bea37098463c23613da32020d604506da8c0518e1da4b7')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('03a7d1d856deb74c508e05031f9895dab54626251b3806e16b4bd12e781a7df5b9')) unhexlify(
"f366f48f1ea9f2d1d3fe958c95ca84ea18e4c4ddb9366c336c927eb246fb38cb"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"704addf544a06e5ee4bea37098463c23613da32020d604506da8c0518e1da4b7"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"03a7d1d856deb74c508e05031f9895dab54626251b3806e16b4bd12e781a7df5b9"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon') self.assertEqual(
ns,
"xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon",
)
# [Chain m/0/2147483647'/1/2147483646'] # [Chain m/0/2147483647'/1/2147483646']
n = m.clone() n = m.clone()
n.derive_path([0, HARDENED | 2147483647, 1, HARDENED | 2147483646]) n.derive_path([0, HARDENED | 2147483647, 1, HARDENED | 2147483646])
self.assertEqual(n.fingerprint(), 0x78412e3a) self.assertEqual(n.fingerprint(), 0x78412E3A)
self.assertEqual(n.chain_code(), unhexlify('637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e29')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('f1c7c871a54a804afe328b4c83a1c33b8e5ff48f5087273f04efa83b247d6a2d')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('02d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0')) unhexlify(
"637807030d55d01f9a0cb3a7839515d796bd07706386a6eddf06cc29a65a0e29"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"f1c7c871a54a804afe328b4c83a1c33b8e5ff48f5087273f04efa83b247d6a2d"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"02d2b36900396c9282fa14628566582f206a5dd0bcc8d5e892611806cafb0301f0"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL') self.assertEqual(
ns,
"xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL",
)
# [Chain m/0/2147483647'/1/2147483646'/2] # [Chain m/0/2147483647'/1/2147483646'/2]
n = m.clone() n = m.clone()
n.derive_path([0, HARDENED | 2147483647, 1, HARDENED | 2147483646, 2]) n.derive_path([0, HARDENED | 2147483647, 1, HARDENED | 2147483646, 2])
self.assertEqual(n.fingerprint(), 0x31a507b8) self.assertEqual(n.fingerprint(), 0x31A507B8)
self.assertEqual(n.chain_code(), unhexlify('9452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271')) self.assertEqual(
self.assertEqual(n.private_key(), unhexlify('bb7d39bdb83ecf58f2fd82b6d918341cbef428661ef01ab97c28a4842125ac23')) n.chain_code(),
self.assertEqual(n.public_key(), unhexlify('024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c')) unhexlify(
"9452b549be8cea3ecb7a84bec10dcfd94afe4d129ebfd3b3cb58eedf394ed271"
),
)
self.assertEqual(
n.private_key(),
unhexlify(
"bb7d39bdb83ecf58f2fd82b6d918341cbef428661ef01ab97c28a4842125ac23"
),
)
self.assertEqual(
n.public_key(),
unhexlify(
"024d902e1a2fc7a8755ab5b694c575fce742c48d9ff192e63df5193e4c7afe1f9c"
),
)
ns = n.serialize_public(VERSION_PUBLIC) ns = n.serialize_public(VERSION_PUBLIC)
self.assertEqual(ns, 'xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt') self.assertEqual(
ns,
"xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt",
)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -4,122 +4,217 @@ from trezor.crypto import bip39
class TestCryptoBip39(unittest.TestCase): class TestCryptoBip39(unittest.TestCase):
def test_mnemonic(self): def test_mnemonic(self):
v = [ v = [
('00000000000000000000000000000000', 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about', 'c55257c360c07c72029aebc1b53c05ed0362ada38ead3e3e9efa3708e53495531f09a6987599d18264c1e1c92f2cf141630c7a3c4ab7c81b2f001698e7463b04'), (
('7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f', 'legal winner thank year wave sausage worth useful legal winner thank yellow', '2e8905819b8723fe2c1d161860e5ee1830318dbf49a83bd451cfb8440c28bd6fa457fe1296106559a3c80937a1c1069be3a3a5bd381ee6260e8d9739fce1f607'), "00000000000000000000000000000000",
('80808080808080808080808080808080', 'letter advice cage absurd amount doctor acoustic avoid letter advice cage above', 'd71de856f81a8acc65e6fc851a38d4d7ec216fd0796d0a6827a3ad6ed5511a30fa280f12eb2e47ed2ac03b5c462a0358d18d69fe4f985ec81778c1b370b652a8'), "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about",
('ffffffffffffffffffffffffffffffff', 'zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong', 'ac27495480225222079d7be181583751e86f571027b0497b5b5d11218e0a8a13332572917f0f8e5a589620c6f15b11c61dee327651a14c34e18231052e48c069'), "c55257c360c07c72029aebc1b53c05ed0362ada38ead3e3e9efa3708e53495531f09a6987599d18264c1e1c92f2cf141630c7a3c4ab7c81b2f001698e7463b04",
('000000000000000000000000000000000000000000000000', 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent', '035895f2f481b1b0f01fcf8c289c794660b289981a78f8106447707fdd9666ca06da5a9a565181599b79f53b844d8a71dd9f439c52a3d7b3e8a79c906ac845fa'), ),
('7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f', 'legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will', 'f2b94508732bcbacbcc020faefecfc89feafa6649a5491b8c952cede496c214a0c7b3c392d168748f2d4a612bada0753b52a1c7ac53c1e93abd5c6320b9e95dd'), (
('808080808080808080808080808080808080808080808080', 'letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always', '107d7c02a5aa6f38c58083ff74f04c607c2d2c0ecc55501dadd72d025b751bc27fe913ffb796f841c49b1d33b610cf0e91d3aa239027f5e99fe4ce9e5088cd65'), "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f",
('ffffffffffffffffffffffffffffffffffffffffffffffff', 'zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when', '0cd6e5d827bb62eb8fc1e262254223817fd068a74b5b449cc2f667c3f1f985a76379b43348d952e2265b4cd129090758b3e3c2c49103b5051aac2eaeb890a528'), "legal winner thank year wave sausage worth useful legal winner thank yellow",
('0000000000000000000000000000000000000000000000000000000000000000', 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art', 'bda85446c68413707090a52022edd26a1c9462295029f2e60cd7c4f2bbd3097170af7a4d73245cafa9c3cca8d561a7c3de6f5d4a10be8ed2a5e608d68f92fcc8'), "2e8905819b8723fe2c1d161860e5ee1830318dbf49a83bd451cfb8440c28bd6fa457fe1296106559a3c80937a1c1069be3a3a5bd381ee6260e8d9739fce1f607",
('7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f', 'legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title', 'bc09fca1804f7e69da93c2f2028eb238c227f2e9dda30cd63699232578480a4021b146ad717fbb7e451ce9eb835f43620bf5c514db0f8add49f5d121449d3e87'), ),
('8080808080808080808080808080808080808080808080808080808080808080', 'letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless', 'c0c519bd0e91a2ed54357d9d1ebef6f5af218a153624cf4f2da911a0ed8f7a09e2ef61af0aca007096df430022f7a2b6fb91661a9589097069720d015e4e982f'), (
('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 'zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote', 'dd48c104698c30cfe2b6142103248622fb7bb0ff692eebb00089b32d22484e1613912f0a5b694407be899ffd31ed3992c456cdf60f5d4564b8ba3f05a69890ad'), "80808080808080808080808080808080",
('77c2b00716cec7213839159e404db50d', 'jelly better achieve collect unaware mountain thought cargo oxygen act hood bridge', 'b5b6d0127db1a9d2226af0c3346031d77af31e918dba64287a1b44b8ebf63cdd52676f672a290aae502472cf2d602c051f3e6f18055e84e4c43897fc4e51a6ff'), "letter advice cage absurd amount doctor acoustic avoid letter advice cage above",
('b63a9c59a6e641f288ebc103017f1da9f8290b3da6bdef7b', 'renew stay biology evidence goat welcome casual join adapt armor shuffle fault little machine walk stumble urge swap', '9248d83e06f4cd98debf5b6f010542760df925ce46cf38a1bdb4e4de7d21f5c39366941c69e1bdbf2966e0f6e6dbece898a0e2f0a4c2b3e640953dfe8b7bbdc5'), "d71de856f81a8acc65e6fc851a38d4d7ec216fd0796d0a6827a3ad6ed5511a30fa280f12eb2e47ed2ac03b5c462a0358d18d69fe4f985ec81778c1b370b652a8",
('3e141609b97933b66a060dcddc71fad1d91677db872031e85f4c015c5e7e8982', 'dignity pass list indicate nasty swamp pool script soccer toe leaf photo multiply desk host tomato cradle drill spread actor shine dismiss champion exotic', 'ff7f3184df8696d8bef94b6c03114dbee0ef89ff938712301d27ed8336ca89ef9635da20af07d4175f2bf5f3de130f39c9d9e8dd0472489c19b1a020a940da67'), ),
('0460ef47585604c5660618db2e6a7e7f', 'afford alter spike radar gate glance object seek swamp infant panel yellow', '65f93a9f36b6c85cbe634ffc1f99f2b82cbb10b31edc7f087b4f6cb9e976e9faf76ff41f8f27c99afdf38f7a303ba1136ee48a4c1e7fcd3dba7aa876113a36e4'), (
('72f60ebac5dd8add8d2a25a797102c3ce21bc029c200076f', 'indicate race push merry suffer human cruise dwarf pole review arch keep canvas theme poem divorce alter left', '3bbf9daa0dfad8229786ace5ddb4e00fa98a044ae4c4975ffd5e094dba9e0bb289349dbe2091761f30f382d4e35c4a670ee8ab50758d2c55881be69e327117ba'), "ffffffffffffffffffffffffffffffff",
('2c85efc7f24ee4573d2b81a6ec66cee209b2dcbd09d8eddc51e0215b0b68e416', 'clutch control vehicle tonight unusual clog visa ice plunge glimpse recipe series open hour vintage deposit universe tip job dress radar refuse motion taste', 'fe908f96f46668b2d5b37d82f558c77ed0d69dd0e7e043a5b0511c48c2f1064694a956f86360c93dd04052a8899497ce9e985ebe0c8c52b955e6ae86d4ff4449'), "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong",
('eaebabb2383351fd31d703840b32e9e2', 'turtle front uncle idea crush write shrug there lottery flower risk shell', 'bdfb76a0759f301b0b899a1e3985227e53b3f51e67e3f2a65363caedf3e32fde42a66c404f18d7b05818c95ef3ca1e5146646856c461c073169467511680876c'), "ac27495480225222079d7be181583751e86f571027b0497b5b5d11218e0a8a13332572917f0f8e5a589620c6f15b11c61dee327651a14c34e18231052e48c069",
('7ac45cfe7722ee6c7ba84fbc2d5bd61b45cb2fe5eb65aa78', 'kiss carry display unusual confirm curtain upgrade antique rotate hello void custom frequent obey nut hole price segment', 'ed56ff6c833c07982eb7119a8f48fd363c4a9b1601cd2de736b01045c5eb8ab4f57b079403485d1c4924f0790dc10a971763337cb9f9c62226f64fff26397c79'), ),
('4fa1a8bc3e6d80ee1316050e862c1812031493212b7ec3f3bb1b08f168cabeef', 'exile ask congress lamp submit jacket era scheme attend cousin alcohol catch course end lucky hurt sentence oven short ball bird grab wing top', '095ee6f817b4c2cb30a5a797360a81a40ab0f9a4e25ecd672a3f58a0b5ba0687c096a6b14d2c0deb3bdefce4f61d01ae07417d502429352e27695163f7447a8c'), (
('18ab19a9f54a9274f03e5209a2ac8a91', 'board flee heavy tunnel powder denial science ski answer betray cargo cat', '6eff1bb21562918509c73cb990260db07c0ce34ff0e3cc4a8cb3276129fbcb300bddfe005831350efd633909f476c45c88253276d9fd0df6ef48609e8bb7dca8'), "000000000000000000000000000000000000000000000000",
('18a2e1d81b8ecfb2a333adcb0c17a5b9eb76cc5d05db91a4', 'board blade invite damage undo sun mimic interest slam gaze truly inherit resist great inject rocket museum chief', 'f84521c777a13b61564234bf8f8b62b3afce27fc4062b51bb5e62bdfecb23864ee6ecf07c1d5a97c0834307c5c852d8ceb88e7c97923c0a3b496bedd4e5f88a9'), "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent",
('15da872c95a13dd738fbf50e427583ad61f18fd99f628c417a61cf8343c90419', 'beyond stage sleep clip because twist token leaf atom beauty genius food business side grid unable middle armed observe pair crouch tonight away coconut', 'b15509eaa2d09d3efd3e006ef42151b30367dc6e3aa5e44caba3fe4d3e352e65101fbdb86a96776b91946ff06f8eac594dc6ee1d3e82a42dfe1b40fef6bcc3fd'), "035895f2f481b1b0f01fcf8c289c794660b289981a78f8106447707fdd9666ca06da5a9a565181599b79f53b844d8a71dd9f439c52a3d7b3e8a79c906ac845fa",
),
(
"7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f",
"legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will",
"f2b94508732bcbacbcc020faefecfc89feafa6649a5491b8c952cede496c214a0c7b3c392d168748f2d4a612bada0753b52a1c7ac53c1e93abd5c6320b9e95dd",
),
(
"808080808080808080808080808080808080808080808080",
"letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always",
"107d7c02a5aa6f38c58083ff74f04c607c2d2c0ecc55501dadd72d025b751bc27fe913ffb796f841c49b1d33b610cf0e91d3aa239027f5e99fe4ce9e5088cd65",
),
(
"ffffffffffffffffffffffffffffffffffffffffffffffff",
"zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when",
"0cd6e5d827bb62eb8fc1e262254223817fd068a74b5b449cc2f667c3f1f985a76379b43348d952e2265b4cd129090758b3e3c2c49103b5051aac2eaeb890a528",
),
(
"0000000000000000000000000000000000000000000000000000000000000000",
"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art",
"bda85446c68413707090a52022edd26a1c9462295029f2e60cd7c4f2bbd3097170af7a4d73245cafa9c3cca8d561a7c3de6f5d4a10be8ed2a5e608d68f92fcc8",
),
(
"7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f",
"legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title",
"bc09fca1804f7e69da93c2f2028eb238c227f2e9dda30cd63699232578480a4021b146ad717fbb7e451ce9eb835f43620bf5c514db0f8add49f5d121449d3e87",
),
(
"8080808080808080808080808080808080808080808080808080808080808080",
"letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless",
"c0c519bd0e91a2ed54357d9d1ebef6f5af218a153624cf4f2da911a0ed8f7a09e2ef61af0aca007096df430022f7a2b6fb91661a9589097069720d015e4e982f",
),
(
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote",
"dd48c104698c30cfe2b6142103248622fb7bb0ff692eebb00089b32d22484e1613912f0a5b694407be899ffd31ed3992c456cdf60f5d4564b8ba3f05a69890ad",
),
(
"77c2b00716cec7213839159e404db50d",
"jelly better achieve collect unaware mountain thought cargo oxygen act hood bridge",
"b5b6d0127db1a9d2226af0c3346031d77af31e918dba64287a1b44b8ebf63cdd52676f672a290aae502472cf2d602c051f3e6f18055e84e4c43897fc4e51a6ff",
),
(
"b63a9c59a6e641f288ebc103017f1da9f8290b3da6bdef7b",
"renew stay biology evidence goat welcome casual join adapt armor shuffle fault little machine walk stumble urge swap",
"9248d83e06f4cd98debf5b6f010542760df925ce46cf38a1bdb4e4de7d21f5c39366941c69e1bdbf2966e0f6e6dbece898a0e2f0a4c2b3e640953dfe8b7bbdc5",
),
(
"3e141609b97933b66a060dcddc71fad1d91677db872031e85f4c015c5e7e8982",
"dignity pass list indicate nasty swamp pool script soccer toe leaf photo multiply desk host tomato cradle drill spread actor shine dismiss champion exotic",
"ff7f3184df8696d8bef94b6c03114dbee0ef89ff938712301d27ed8336ca89ef9635da20af07d4175f2bf5f3de130f39c9d9e8dd0472489c19b1a020a940da67",
),
(
"0460ef47585604c5660618db2e6a7e7f",
"afford alter spike radar gate glance object seek swamp infant panel yellow",
"65f93a9f36b6c85cbe634ffc1f99f2b82cbb10b31edc7f087b4f6cb9e976e9faf76ff41f8f27c99afdf38f7a303ba1136ee48a4c1e7fcd3dba7aa876113a36e4",
),
(
"72f60ebac5dd8add8d2a25a797102c3ce21bc029c200076f",
"indicate race push merry suffer human cruise dwarf pole review arch keep canvas theme poem divorce alter left",
"3bbf9daa0dfad8229786ace5ddb4e00fa98a044ae4c4975ffd5e094dba9e0bb289349dbe2091761f30f382d4e35c4a670ee8ab50758d2c55881be69e327117ba",
),
(
"2c85efc7f24ee4573d2b81a6ec66cee209b2dcbd09d8eddc51e0215b0b68e416",
"clutch control vehicle tonight unusual clog visa ice plunge glimpse recipe series open hour vintage deposit universe tip job dress radar refuse motion taste",
"fe908f96f46668b2d5b37d82f558c77ed0d69dd0e7e043a5b0511c48c2f1064694a956f86360c93dd04052a8899497ce9e985ebe0c8c52b955e6ae86d4ff4449",
),
(
"eaebabb2383351fd31d703840b32e9e2",
"turtle front uncle idea crush write shrug there lottery flower risk shell",
"bdfb76a0759f301b0b899a1e3985227e53b3f51e67e3f2a65363caedf3e32fde42a66c404f18d7b05818c95ef3ca1e5146646856c461c073169467511680876c",
),
(
"7ac45cfe7722ee6c7ba84fbc2d5bd61b45cb2fe5eb65aa78",
"kiss carry display unusual confirm curtain upgrade antique rotate hello void custom frequent obey nut hole price segment",
"ed56ff6c833c07982eb7119a8f48fd363c4a9b1601cd2de736b01045c5eb8ab4f57b079403485d1c4924f0790dc10a971763337cb9f9c62226f64fff26397c79",
),
(
"4fa1a8bc3e6d80ee1316050e862c1812031493212b7ec3f3bb1b08f168cabeef",
"exile ask congress lamp submit jacket era scheme attend cousin alcohol catch course end lucky hurt sentence oven short ball bird grab wing top",
"095ee6f817b4c2cb30a5a797360a81a40ab0f9a4e25ecd672a3f58a0b5ba0687c096a6b14d2c0deb3bdefce4f61d01ae07417d502429352e27695163f7447a8c",
),
(
"18ab19a9f54a9274f03e5209a2ac8a91",
"board flee heavy tunnel powder denial science ski answer betray cargo cat",
"6eff1bb21562918509c73cb990260db07c0ce34ff0e3cc4a8cb3276129fbcb300bddfe005831350efd633909f476c45c88253276d9fd0df6ef48609e8bb7dca8",
),
(
"18a2e1d81b8ecfb2a333adcb0c17a5b9eb76cc5d05db91a4",
"board blade invite damage undo sun mimic interest slam gaze truly inherit resist great inject rocket museum chief",
"f84521c777a13b61564234bf8f8b62b3afce27fc4062b51bb5e62bdfecb23864ee6ecf07c1d5a97c0834307c5c852d8ceb88e7c97923c0a3b496bedd4e5f88a9",
),
(
"15da872c95a13dd738fbf50e427583ad61f18fd99f628c417a61cf8343c90419",
"beyond stage sleep clip because twist token leaf atom beauty genius food business side grid unable middle armed observe pair crouch tonight away coconut",
"b15509eaa2d09d3efd3e006ef42151b30367dc6e3aa5e44caba3fe4d3e352e65101fbdb86a96776b91946ff06f8eac594dc6ee1d3e82a42dfe1b40fef6bcc3fd",
),
] ]
for d, m, s in v: for d, m, s in v:
self.assertEqual(bip39.from_data(unhexlify(d)), m) self.assertEqual(bip39.from_data(unhexlify(d)), m)
self.assertEqual(bip39.seed(m, 'TREZOR'), unhexlify(s)) self.assertEqual(bip39.seed(m, "TREZOR"), unhexlify(s))
def test_check_ok(self): def test_check_ok(self):
v = [ v = [
'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about', "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about",
'legal winner thank year wave sausage worth useful legal winner thank yellow', "legal winner thank year wave sausage worth useful legal winner thank yellow",
'letter advice cage absurd amount doctor acoustic avoid letter advice cage above', "letter advice cage absurd amount doctor acoustic avoid letter advice cage above",
'zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong', "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong",
'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent', "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent",
'legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will', "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will",
'letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always', "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always",
'zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when', "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when",
'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art', "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art",
'legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title', "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title",
'letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless', "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless",
'zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote', "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote",
'jelly better achieve collect unaware mountain thought cargo oxygen act hood bridge', "jelly better achieve collect unaware mountain thought cargo oxygen act hood bridge",
'renew stay biology evidence goat welcome casual join adapt armor shuffle fault little machine walk stumble urge swap', "renew stay biology evidence goat welcome casual join adapt armor shuffle fault little machine walk stumble urge swap",
'dignity pass list indicate nasty swamp pool script soccer toe leaf photo multiply desk host tomato cradle drill spread actor shine dismiss champion exotic', "dignity pass list indicate nasty swamp pool script soccer toe leaf photo multiply desk host tomato cradle drill spread actor shine dismiss champion exotic",
'afford alter spike radar gate glance object seek swamp infant panel yellow', "afford alter spike radar gate glance object seek swamp infant panel yellow",
'indicate race push merry suffer human cruise dwarf pole review arch keep canvas theme poem divorce alter left', "indicate race push merry suffer human cruise dwarf pole review arch keep canvas theme poem divorce alter left",
'clutch control vehicle tonight unusual clog visa ice plunge glimpse recipe series open hour vintage deposit universe tip job dress radar refuse motion taste', "clutch control vehicle tonight unusual clog visa ice plunge glimpse recipe series open hour vintage deposit universe tip job dress radar refuse motion taste",
'turtle front uncle idea crush write shrug there lottery flower risk shell', "turtle front uncle idea crush write shrug there lottery flower risk shell",
'kiss carry display unusual confirm curtain upgrade antique rotate hello void custom frequent obey nut hole price segment', "kiss carry display unusual confirm curtain upgrade antique rotate hello void custom frequent obey nut hole price segment",
'exile ask congress lamp submit jacket era scheme attend cousin alcohol catch course end lucky hurt sentence oven short ball bird grab wing top', "exile ask congress lamp submit jacket era scheme attend cousin alcohol catch course end lucky hurt sentence oven short ball bird grab wing top",
'board flee heavy tunnel powder denial science ski answer betray cargo cat', "board flee heavy tunnel powder denial science ski answer betray cargo cat",
'board blade invite damage undo sun mimic interest slam gaze truly inherit resist great inject rocket museum chief', "board blade invite damage undo sun mimic interest slam gaze truly inherit resist great inject rocket museum chief",
'beyond stage sleep clip because twist token leaf atom beauty genius food business side grid unable middle armed observe pair crouch tonight away coconut', "beyond stage sleep clip because twist token leaf atom beauty genius food business side grid unable middle armed observe pair crouch tonight away coconut",
] ]
for m in v: for m in v:
self.assertEqual(bip39.check(m), True) self.assertEqual(bip39.check(m), True)
def test_check_fail(self): def test_check_fail(self):
v = [ v = [
'above abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about', "above abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about",
'above winner thank year wave sausage worth useful legal winner thank yellow', "above winner thank year wave sausage worth useful legal winner thank yellow",
'above advice cage absurd amount doctor acoustic avoid letter advice cage above', "above advice cage absurd amount doctor acoustic avoid letter advice cage above",
'above zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong', "above zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong",
'above abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent', "above abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent",
'above winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will', "above winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will",
'above advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always', "above advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always",
'above zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when', "above zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when",
'above abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art', "above abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art",
'above winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title', "above winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title",
'above advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless', "above advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless",
'above zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote', "above zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote",
'above better achieve collect unaware mountain thought cargo oxygen act hood bridge', "above better achieve collect unaware mountain thought cargo oxygen act hood bridge",
'above stay biology evidence goat welcome casual join adapt armor shuffle fault little machine walk stumble urge swap', "above stay biology evidence goat welcome casual join adapt armor shuffle fault little machine walk stumble urge swap",
'above pass list indicate nasty swamp pool script soccer toe leaf photo multiply desk host tomato cradle drill spread actor shine dismiss champion exotic', "above pass list indicate nasty swamp pool script soccer toe leaf photo multiply desk host tomato cradle drill spread actor shine dismiss champion exotic",
'above alter spike radar gate glance object seek swamp infant panel yellow', "above alter spike radar gate glance object seek swamp infant panel yellow",
'above race push merry suffer human cruise dwarf pole review arch keep canvas theme poem divorce alter left', "above race push merry suffer human cruise dwarf pole review arch keep canvas theme poem divorce alter left",
'above control vehicle tonight unusual clog visa ice plunge glimpse recipe series open hour vintage deposit universe tip job dress radar refuse motion taste', "above control vehicle tonight unusual clog visa ice plunge glimpse recipe series open hour vintage deposit universe tip job dress radar refuse motion taste",
'above front uncle idea crush write shrug there lottery flower risk shell', "above front uncle idea crush write shrug there lottery flower risk shell",
'above carry display unusual confirm curtain upgrade antique rotate hello void custom frequent obey nut hole price segment', "above carry display unusual confirm curtain upgrade antique rotate hello void custom frequent obey nut hole price segment",
'above ask congress lamp submit jacket era scheme attend cousin alcohol catch course end lucky hurt sentence oven short ball bird grab wing top', "above ask congress lamp submit jacket era scheme attend cousin alcohol catch course end lucky hurt sentence oven short ball bird grab wing top",
'above flee heavy tunnel powder denial science ski answer betray cargo cat', "above flee heavy tunnel powder denial science ski answer betray cargo cat",
'above blade invite damage undo sun mimic interest slam gaze truly inherit resist great inject rocket museum chief', "above blade invite damage undo sun mimic interest slam gaze truly inherit resist great inject rocket museum chief",
'above stage sleep clip because twist token leaf atom beauty genius food business side grid unable middle armed observe pair crouch tonight away coconut', "above stage sleep clip because twist token leaf atom beauty genius food business side grid unable middle armed observe pair crouch tonight away coconut",
'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about', "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about",
'winner thank year wave sausage worth useful legal winner thank yellow', "winner thank year wave sausage worth useful legal winner thank yellow",
'advice cage absurd amount doctor acoustic avoid letter advice cage above', "advice cage absurd amount doctor acoustic avoid letter advice cage above",
'zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong', "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong",
'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent', "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent",
'winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will', "winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will",
'advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always', "advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always",
'zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when', "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when",
'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art', "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art",
'winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title', "winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title",
'advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless', "advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless",
'zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote', "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote",
'better achieve collect unaware mountain thought cargo oxygen act hood bridge', "better achieve collect unaware mountain thought cargo oxygen act hood bridge",
'stay biology evidence goat welcome casual join adapt armor shuffle fault little machine walk stumble urge swap', "stay biology evidence goat welcome casual join adapt armor shuffle fault little machine walk stumble urge swap",
'pass list indicate nasty swamp pool script soccer toe leaf photo multiply desk host tomato cradle drill spread actor shine dismiss champion exotic', "pass list indicate nasty swamp pool script soccer toe leaf photo multiply desk host tomato cradle drill spread actor shine dismiss champion exotic",
'alter spike radar gate glance object seek swamp infant panel yellow', "alter spike radar gate glance object seek swamp infant panel yellow",
'race push merry suffer human cruise dwarf pole review arch keep canvas theme poem divorce alter left', "race push merry suffer human cruise dwarf pole review arch keep canvas theme poem divorce alter left",
'control vehicle tonight unusual clog visa ice plunge glimpse recipe series open hour vintage deposit universe tip job dress radar refuse motion taste', "control vehicle tonight unusual clog visa ice plunge glimpse recipe series open hour vintage deposit universe tip job dress radar refuse motion taste",
'front uncle idea crush write shrug there lottery flower risk shell', "front uncle idea crush write shrug there lottery flower risk shell",
'carry display unusual confirm curtain upgrade antique rotate hello void custom frequent obey nut hole price segment', "carry display unusual confirm curtain upgrade antique rotate hello void custom frequent obey nut hole price segment",
'ask congress lamp submit jacket era scheme attend cousin alcohol catch course end lucky hurt sentence oven short ball bird grab wing top', "ask congress lamp submit jacket era scheme attend cousin alcohol catch course end lucky hurt sentence oven short ball bird grab wing top",
'flee heavy tunnel powder denial science ski answer betray cargo cat', "flee heavy tunnel powder denial science ski answer betray cargo cat",
'blade invite damage undo sun mimic interest slam gaze truly inherit resist great inject rocket museum chief', "blade invite damage undo sun mimic interest slam gaze truly inherit resist great inject rocket museum chief",
'stage sleep clip because twist token leaf atom beauty genius food business side grid unable middle armed observe pair crouch tonight away coconut', "stage sleep clip because twist token leaf atom beauty genius food business side grid unable middle armed observe pair crouch tonight away coconut",
] ]
for m in v: for m in v:
self.assertEqual(bip39.check(m), False) self.assertEqual(bip39.check(m), False)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -35,26 +35,43 @@ VALID_CHECKSUM = [
] ]
VALID_ADDRESS = [ VALID_ADDRESS = [
("1BpEi6DfDAUFd7GtittLSdBeYJvcoaVggu", "bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a"), (
("1KXrWXciRDZUpQwQmuM1DbwsKDLYAYsVLR", "bitcoincash:qr95sy3j9xwd2ap32xkykttr4cvcu7as4y0qverfuy"), "1BpEi6DfDAUFd7GtittLSdBeYJvcoaVggu",
("16w1D5WRVKJuZUsSRzdLp9w3YGcgoxDXb", "bitcoincash:qqq3728yw0y47sqn6l2na30mcw6zm78dzqre909m2r"), "bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a",
("3CWFddi6m4ndiGyKqzYvsFYagqDLPVMTzC", "bitcoincash:ppm2qsznhks23z7629mms6s4cwef74vcwvn0h829pq"), ),
("3LDsS579y7sruadqu11beEJoTjdFiFCdX4", "bitcoincash:pr95sy3j9xwd2ap32xkykttr4cvcu7as4yc93ky28e"), (
("31nwvkZwyPdgzjBJZXfDmSWsC4ZLKpYyUw", "bitcoincash:pqq3728yw0y47sqn6l2na30mcw6zm78dzq5ucqzc37") "1KXrWXciRDZUpQwQmuM1DbwsKDLYAYsVLR",
"bitcoincash:qr95sy3j9xwd2ap32xkykttr4cvcu7as4y0qverfuy",
),
(
"16w1D5WRVKJuZUsSRzdLp9w3YGcgoxDXb",
"bitcoincash:qqq3728yw0y47sqn6l2na30mcw6zm78dzqre909m2r",
),
(
"3CWFddi6m4ndiGyKqzYvsFYagqDLPVMTzC",
"bitcoincash:ppm2qsznhks23z7629mms6s4cwef74vcwvn0h829pq",
),
(
"3LDsS579y7sruadqu11beEJoTjdFiFCdX4",
"bitcoincash:pr95sy3j9xwd2ap32xkykttr4cvcu7as4yc93ky28e",
),
(
"31nwvkZwyPdgzjBJZXfDmSWsC4ZLKpYyUw",
"bitcoincash:pqq3728yw0y47sqn6l2na30mcw6zm78dzq5ucqzc37",
),
] ]
class TestCryptoCashAddr(unittest.TestCase): class TestCryptoCashAddr(unittest.TestCase):
def test_valid_checksum(self): def test_valid_checksum(self):
for test in VALID_CHECKSUM: for test in VALID_CHECKSUM:
prefix, addr = test.split(':') prefix, addr = test.split(":")
cashaddr.decode(prefix, addr) cashaddr.decode(prefix, addr)
def test_invalid_checksum(self): def test_invalid_checksum(self):
for test in VALID_CHECKSUM: for test in VALID_CHECKSUM:
test += 'xxx' test += "xxx"
prefix, addr = test.split(':') prefix, addr = test.split(":")
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
cashaddr.decode(prefix, addr) cashaddr.decode(prefix, addr)
@ -65,11 +82,11 @@ class TestCryptoCashAddr(unittest.TestCase):
version = data[0] version = data[0]
if version == 5: if version == 5:
version = 8 version = 8
enc = cashaddr.encode('bitcoincash', version, data[1:]) enc = cashaddr.encode("bitcoincash", version, data[1:])
self.assertEqual(ca, enc) self.assertEqual(ca, enc)
# cashaddr -> base58 # cashaddr -> base58
for b58, ca in VALID_ADDRESS: for b58, ca in VALID_ADDRESS:
prefix, addr = ca.split(':') prefix, addr = ca.split(":")
version, data = cashaddr.decode(prefix, addr) version, data = cashaddr.decode(prefix, addr)
if version == 8: if version == 8:
version = 5 version = 5

View File

@ -8,21 +8,21 @@ class TestCryptoChaCha20Poly1305(unittest.TestCase):
vectors = [ vectors = [
# from https://github.com/wg/c20p1305/blob/master/rfc7539_test.c # from https://github.com/wg/c20p1305/blob/master/rfc7539_test.c
( (
'4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e', "4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e",
'50515253c0c1c2c3c4c5c6c7', "50515253c0c1c2c3c4c5c6c7",
'808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f', "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
'070000004041424344454647', "070000004041424344454647",
'd31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b6116', "d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b6116",
'1ae10b594f09e26a7e902ecbd0600691', "1ae10b594f09e26a7e902ecbd0600691",
), ),
# from https://tools.ietf.org/html/rfc7539#appendix-A.5 # from https://tools.ietf.org/html/rfc7539#appendix-A.5
( (
'496e7465726e65742d4472616674732061726520647261667420646f63756d656e74732076616c696420666f722061206d6178696d756d206f6620736978206d6f6e74687320616e64206d617920626520757064617465642c207265706c616365642c206f72206f62736f6c65746564206279206f7468657220646f63756d656e747320617420616e792074696d652e20497420697320696e617070726f70726961746520746f2075736520496e7465726e65742d447261667473206173207265666572656e6365206d6174657269616c206f7220746f2063697465207468656d206f74686572207468616e206173202fe2809c776f726b20696e2070726f67726573732e2fe2809d', "496e7465726e65742d4472616674732061726520647261667420646f63756d656e74732076616c696420666f722061206d6178696d756d206f6620736978206d6f6e74687320616e64206d617920626520757064617465642c207265706c616365642c206f72206f62736f6c65746564206279206f7468657220646f63756d656e747320617420616e792074696d652e20497420697320696e617070726f70726961746520746f2075736520496e7465726e65742d447261667473206173207265666572656e6365206d6174657269616c206f7220746f2063697465207468656d206f74686572207468616e206173202fe2809c776f726b20696e2070726f67726573732e2fe2809d",
'f33388860000000000004e91', "f33388860000000000004e91",
'1c9240a5eb55d38af333888604f6b5f0473917c1402b80099dca5cbc207075c0', "1c9240a5eb55d38af333888604f6b5f0473917c1402b80099dca5cbc207075c0",
'000000000102030405060708', "000000000102030405060708",
'64a0861575861af460f062c79be643bd5e805cfd345cf389f108670ac76c8cb24c6cfc18755d43eea09ee94e382d26b0bdb7b73c321b0100d4f03b7f355894cf332f830e710b97ce98c8a84abd0b948114ad176e008d33bd60f982b1ff37c8559797a06ef4f0ef61c186324e2b3506383606907b6a7c02b0f9f6157b53c867e4b9166c767b804d46a59b5216cde7a4e99040c5a40433225ee282a1b0a06c523eaf4534d7f83fa1155b0047718cbc546a0d072b04b3564eea1b422273f548271a0bb2316053fa76991955ebd63159434ecebb4e466dae5a1073a6727627097a1049e617d91d361094fa68f0ff77987130305beaba2eda04df997b714d6c6f2c29a6ad5cb4022b02709b', "64a0861575861af460f062c79be643bd5e805cfd345cf389f108670ac76c8cb24c6cfc18755d43eea09ee94e382d26b0bdb7b73c321b0100d4f03b7f355894cf332f830e710b97ce98c8a84abd0b948114ad176e008d33bd60f982b1ff37c8559797a06ef4f0ef61c186324e2b3506383606907b6a7c02b0f9f6157b53c867e4b9166c767b804d46a59b5216cde7a4e99040c5a40433225ee282a1b0a06c523eaf4534d7f83fa1155b0047718cbc546a0d072b04b3564eea1b422273f548271a0bb2316053fa76991955ebd63159434ecebb4e466dae5a1073a6727627097a1049e617d91d361094fa68f0ff77987130305beaba2eda04df997b714d6c6f2c29a6ad5cb4022b02709b",
'eead9d67890cbb22392336fea1851f38', "eead9d67890cbb22392336fea1851f38",
), ),
] ]
@ -57,5 +57,5 @@ class TestCryptoChaCha20Poly1305(unittest.TestCase):
self.assertEqual(out, unhexlify(tag)) self.assertEqual(out, unhexlify(tag))
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -6,11 +6,26 @@ from trezor.crypto import crc
class TestCryptoCrc(unittest.TestCase): class TestCryptoCrc(unittest.TestCase):
vectors_crc32 = [ vectors_crc32 = [
('123456789', 0xCBF43926), ("123456789", 0xCBF43926),
(unhexlify('0000000000000000000000000000000000000000000000000000000000000000'), 0x190A55AD), (
(unhexlify('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'), 0xFF6CAB0B), unhexlify(
(unhexlify('000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F'), 0x91267E8A), "0000000000000000000000000000000000000000000000000000000000000000"
('The quick brown fox jumps over the lazy dog', 0x414FA339), ),
0x190A55AD,
),
(
unhexlify(
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
),
0xFF6CAB0B,
),
(
unhexlify(
"000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"
),
0x91267E8A,
),
("The quick brown fox jumps over the lazy dog", 0x414FA339),
] ]
def test_crc32(self): def test_crc32(self):
@ -18,5 +33,5 @@ class TestCryptoCrc(unittest.TestCase):
self.assertEqual(crc.crc32(i), o) self.assertEqual(crc.crc32(i), o)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -6,7 +6,11 @@ from trezor.crypto.curve import curve25519
class TestCryptoCurve25519(unittest.TestCase): class TestCryptoCurve25519(unittest.TestCase):
vectors = [ vectors = [
('38c9d9b17911de26ed812f5cc19c0029e8d016bcbc6078bc9db2af33f1761e4a', '311b6248af8dabec5cc81eac5bf229925f6d218a12e0547fb1856e015cc76f5d', 'a93dbdb23e5c99da743e203bd391af79f2b83fb8d0fd6ec813371c71f08f2d4d'), (
"38c9d9b17911de26ed812f5cc19c0029e8d016bcbc6078bc9db2af33f1761e4a",
"311b6248af8dabec5cc81eac5bf229925f6d218a12e0547fb1856e015cc76f5d",
"a93dbdb23e5c99da743e203bd391af79f2b83fb8d0fd6ec813371c71f08f2d4d",
),
] ]
def test_generate_secret(self): def test_generate_secret(self):
@ -31,5 +35,5 @@ class TestCryptoCurve25519(unittest.TestCase):
self.assertEqual(session1, session2) self.assertEqual(session1, session2)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -9,14 +9,46 @@ class TestCryptoEd25519(unittest.TestCase):
# vectors from https://github.com/torproject/tor/blob/master/src/test/ed25519_vectors.inc # vectors from https://github.com/torproject/tor/blob/master/src/test/ed25519_vectors.inc
vectors = [ vectors = [
('26c76712d89d906e6672dafa614c42e5cb1caac8c6568e4d2493087db51f0d36', 'c2247870536a192d142d056abefca68d6193158e7c1a59c1654c954eccaff894', 'd23188eac3773a316d46006fa59c095060be8b1a23582a0dd99002a82a0662bd246d8449e172e04c5f46ac0d1404cebe4aabd8a75a1457aa06cae41f3334f104'), (
('fba7a5366b5cb98c2667a18783f5cf8f4f8d1a2ce939ad22a6e685edde85128d', '1519a3b15816a1aafab0b213892026ebf5c0dc232c58b21088d88cb90e9b940d', '3a785ac1201c97ee5f6f0d99323960d5f264c7825e61aa7cc81262f15bef75eb4fa5723add9b9d45b12311b6d403eb3ac79ff8e4e631fc3cd51e4ad2185b200b'), "26c76712d89d906e6672dafa614c42e5cb1caac8c6568e4d2493087db51f0d36",
('67e3aa7a14fac8445d15e45e38a523481a69ae35513c9e4143eb1c2196729a0e', '081faa81992e360ea22c06af1aba096e7a73f1c665bc8b3e4e531c46455fd1dd', 'cf431fd0416bfbd20c9d95ef9b723e2acddffb33900edc72195dea95965d52d888d30b7b8a677c0bd8ae1417b1e1a0ec6700deadd5d8b54b6689275e04a04509'), "c2247870536a192d142d056abefca68d6193158e7c1a59c1654c954eccaff894",
('d51385942033a76dc17f089a59e6a5a7fe80d9c526ae8ddd8c3a506b99d3d0a6', '73cfa1189a723aad7966137cbffa35140bb40d7e16eae4c40b79b5f0360dd65a', '2375380cd72d1a6c642aeddff862be8a5804b916acb72c02d9ed052c1561881aa658a5af856fcd6d43113e42f698cd6687c99efeef7f2ce045824440d26c5d00'), "d23188eac3773a316d46006fa59c095060be8b1a23582a0dd99002a82a0662bd246d8449e172e04c5f46ac0d1404cebe4aabd8a75a1457aa06cae41f3334f104",
('5c8eac469bb3f1b85bc7cd893f52dc42a9ab66f1b02b5ce6a68e9b175d3bb433', '66c1a77104d86461b6f98f73acf3cd229c80624495d2d74d6fda1e940080a96b', '2385a472f599ca965bbe4d610e391cdeabeba9c336694b0d6249e551458280be122c2441dd9746a81bbfb9cd619364bab0df37ff4ceb7aefd24469c39d3bc508'), ),
('eda433d483059b6d1ff8b7cfbd0fe406bfb23722c8f3c8252629284573b61b86', 'd21c294db0e64cb2d8976625786ede1d9754186ae8197a64d72f68c792eecc19', 'e500cd0b8cfff35442f88008d894f3a2fa26ef7d3a0ca5714ae0d3e2d40caae58ba7cdf69dd126994dad6be536fcda846d89dd8138d1683cc144c8853dce7607'), (
('4377c40431c30883c5fbd9bc92ae48d1ed8a47b81d13806beac5351739b5533d', 'c4d58b4cf85a348ff3d410dd936fa460c4f18da962c01b1963792b9dcc8a6ea6', 'd187b9e334b0050154de10bf69b3e4208a584e1a65015ec28b14bcc252cf84b8baa9c94867daa60f2a82d09ba9652d41e8dde292b624afc8d2c26441b95e3c0e'), "fba7a5366b5cb98c2667a18783f5cf8f4f8d1a2ce939ad22a6e685edde85128d",
('c6bbcce615839756aed2cc78b1de13884dd3618f48367a17597a16c1cd7a290b', '95126f14d86494020665face03f2d42ee2b312a85bc729903eb17522954a1c4a', '815213640a643d198bd056e02bba74e1c8d2d931643e84497adf3347eb485079c9afe0afce9284cdc084946b561abbb214f1304ca11228ff82702185cf28f60d'), "1519a3b15816a1aafab0b213892026ebf5c0dc232c58b21088d88cb90e9b940d",
"3a785ac1201c97ee5f6f0d99323960d5f264c7825e61aa7cc81262f15bef75eb4fa5723add9b9d45b12311b6d403eb3ac79ff8e4e631fc3cd51e4ad2185b200b",
),
(
"67e3aa7a14fac8445d15e45e38a523481a69ae35513c9e4143eb1c2196729a0e",
"081faa81992e360ea22c06af1aba096e7a73f1c665bc8b3e4e531c46455fd1dd",
"cf431fd0416bfbd20c9d95ef9b723e2acddffb33900edc72195dea95965d52d888d30b7b8a677c0bd8ae1417b1e1a0ec6700deadd5d8b54b6689275e04a04509",
),
(
"d51385942033a76dc17f089a59e6a5a7fe80d9c526ae8ddd8c3a506b99d3d0a6",
"73cfa1189a723aad7966137cbffa35140bb40d7e16eae4c40b79b5f0360dd65a",
"2375380cd72d1a6c642aeddff862be8a5804b916acb72c02d9ed052c1561881aa658a5af856fcd6d43113e42f698cd6687c99efeef7f2ce045824440d26c5d00",
),
(
"5c8eac469bb3f1b85bc7cd893f52dc42a9ab66f1b02b5ce6a68e9b175d3bb433",
"66c1a77104d86461b6f98f73acf3cd229c80624495d2d74d6fda1e940080a96b",
"2385a472f599ca965bbe4d610e391cdeabeba9c336694b0d6249e551458280be122c2441dd9746a81bbfb9cd619364bab0df37ff4ceb7aefd24469c39d3bc508",
),
(
"eda433d483059b6d1ff8b7cfbd0fe406bfb23722c8f3c8252629284573b61b86",
"d21c294db0e64cb2d8976625786ede1d9754186ae8197a64d72f68c792eecc19",
"e500cd0b8cfff35442f88008d894f3a2fa26ef7d3a0ca5714ae0d3e2d40caae58ba7cdf69dd126994dad6be536fcda846d89dd8138d1683cc144c8853dce7607",
),
(
"4377c40431c30883c5fbd9bc92ae48d1ed8a47b81d13806beac5351739b5533d",
"c4d58b4cf85a348ff3d410dd936fa460c4f18da962c01b1963792b9dcc8a6ea6",
"d187b9e334b0050154de10bf69b3e4208a584e1a65015ec28b14bcc252cf84b8baa9c94867daa60f2a82d09ba9652d41e8dde292b624afc8d2c26441b95e3c0e",
),
(
"c6bbcce615839756aed2cc78b1de13884dd3618f48367a17597a16c1cd7a290b",
"95126f14d86494020665face03f2d42ee2b312a85bc729903eb17522954a1c4a",
"815213640a643d198bd056e02bba74e1c8d2d931643e84497adf3347eb485079c9afe0afce9284cdc084946b561abbb214f1304ca11228ff82702185cf28f60d",
),
] ]
def test_publickey(self): def test_publickey(self):
@ -33,7 +65,9 @@ class TestCryptoEd25519(unittest.TestCase):
def test_verify(self): def test_verify(self):
for sk, pk, sig in self.vectors: for sk, pk, sig in self.vectors:
# msg = pk # msg = pk
self.assertTrue(ed25519.verify(unhexlify(pk), unhexlify(sig), unhexlify(pk))) self.assertTrue(
ed25519.verify(unhexlify(pk), unhexlify(sig), unhexlify(pk))
)
pass pass
def test_generate_secret(self): def test_generate_secret(self):
@ -51,5 +85,5 @@ class TestCryptoEd25519(unittest.TestCase):
self.assertTrue(ed25519.verify(pk, sig, msg)) self.assertTrue(ed25519.verify(pk, sig, msg))
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -8,80 +8,241 @@ class TestCryptoNist256p1(unittest.TestCase):
# vectors from http://point-at-infinity.org/ecc/nisttv # vectors from http://point-at-infinity.org/ecc/nisttv
vectors = [ vectors = [
(1, '6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5'), (
(2, '7CF27B188D034F7E8A52380304B51AC3C08969E277F21B35A60B48FC4766997807775510DB8ED040293D9AC69F7430DBBA7DADE63CE982299E04B79D227873D1'), 1,
(3, '5ECBE4D1A6330A44C8F7EF951D4BF165E6C6B721EFADA985FB41661BC6E7FD6C8734640C4998FF7E374B06CE1A64A2ECD82AB036384FB83D9A79B127A27D5032'), "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5",
(4, 'E2534A3532D08FBBA02DDE659EE62BD0031FE2DB785596EF509302446B030852E0F1575A4C633CC719DFEE5FDA862D764EFC96C3F30EE0055C42C23F184ED8C6'), ),
(5, '51590B7A515140D2D784C85608668FDFEF8C82FD1F5BE52421554A0DC3D033EDE0C17DA8904A727D8AE1BF36BF8A79260D012F00D4D80888D1D0BB44FDA16DA4'), (
(6, 'B01A172A76A4602C92D3242CB897DDE3024C740DEBB215B4C6B0AAE93C2291A9E85C10743237DAD56FEC0E2DFBA703791C00F7701C7E16BDFD7C48538FC77FE2'), 2,
(7, '8E533B6FA0BF7B4625BB30667C01FB607EF9F8B8A80FEF5B300628703187B2A373EB1DBDE03318366D069F83A6F5900053C73633CB041B21C55E1A86C1F400B4'), "7CF27B188D034F7E8A52380304B51AC3C08969E277F21B35A60B48FC4766997807775510DB8ED040293D9AC69F7430DBBA7DADE63CE982299E04B79D227873D1",
(8, '62D9779DBEE9B0534042742D3AB54CADC1D238980FCE97DBB4DD9DC1DB6FB393AD5ACCBD91E9D8244FF15D771167CEE0A2ED51F6BBE76A78DA540A6A0F09957E'), ),
(9, 'EA68D7B6FEDF0B71878938D51D71F8729E0ACB8C2C6DF8B3D79E8A4B90949EE02A2744C972C9FCE787014A964A8EA0C84D714FEAA4DE823FE85A224A4DD048FA'), (
(10, 'CEF66D6B2A3A993E591214D1EA223FB545CA6C471C48306E4C36069404C5723F878662A229AAAE906E123CDD9D3B4C10590DED29FE751EEECA34BBAA44AF0773'), 3,
(11, '3ED113B7883B4C590638379DB0C21CDA16742ED0255048BF433391D374BC21D19099209ACCC4C8A224C843AFA4F4C68A090D04DA5E9889DAE2F8EEFCE82A3740'), "5ECBE4D1A6330A44C8F7EF951D4BF165E6C6B721EFADA985FB41661BC6E7FD6C8734640C4998FF7E374B06CE1A64A2ECD82AB036384FB83D9A79B127A27D5032",
(12, '741DD5BDA817D95E4626537320E5D55179983028B2F82C99D500C5EE8624E3C40770B46A9C385FDC567383554887B1548EEB912C35BA5CA71995FF22CD4481D3'), ),
(13, '177C837AE0AC495A61805DF2D85EE2FC792E284B65EAD58A98E15D9D46072C0163BB58CD4EBEA558A24091ADB40F4E7226EE14C3A1FB4DF39C43BBE2EFC7BFD8'), (
(14, '54E77A001C3862B97A76647F4336DF3CF126ACBE7A069C5E5709277324D2920BF599F1BB29F4317542121F8C05A2E7C37171EA77735090081BA7C82F60D0B375'), 4,
(15, 'F0454DC6971ABAE7ADFB378999888265AE03AF92DE3A0EF163668C63E59B9D5FB5B93EE3592E2D1F4E6594E51F9643E62A3B21CE75B5FA3F47E59CDE0D034F36'), "E2534A3532D08FBBA02DDE659EE62BD0031FE2DB785596EF509302446B030852E0F1575A4C633CC719DFEE5FDA862D764EFC96C3F30EE0055C42C23F184ED8C6",
(16, '76A94D138A6B41858B821C629836315FCD28392EFF6CA038A5EB4787E1277C6EA985FE61341F260E6CB0A1B5E11E87208599A0040FC78BAA0E9DDD724B8C5110'), ),
(17, '47776904C0F1CC3A9C0984B66F75301A5FA68678F0D64AF8BA1ABCE34738A73EAA005EE6B5B957286231856577648E8381B2804428D5733F32F787FF71F1FCDC'), (
(18, '1057E0AB5780F470DEFC9378D1C7C87437BB4C6F9EA55C63D936266DBD781FDAF6F1645A15CBE5DC9FA9B7DFD96EE5A7DCC11B5C5EF4F1F78D83B3393C6A45A2'), 5,
(19, 'CB6D2861102C0C25CE39B7C17108C507782C452257884895C1FC7B74AB03ED8358D7614B24D9EF515C35E7100D6D6CE4A496716E30FA3E03E39150752BCECDAA'), "51590B7A515140D2D784C85608668FDFEF8C82FD1F5BE52421554A0DC3D033EDE0C17DA8904A727D8AE1BF36BF8A79260D012F00D4D80888D1D0BB44FDA16DA4",
(20, '83A01A9378395BAB9BCD6A0AD03CC56D56E6B19250465A94A234DC4C6B28DA9A76E49B6DE2F73234AE6A5EB9D612B75C9F2202BB6923F54FF8240AAA86F640B8'), ),
(112233445566778899, '339150844EC15234807FE862A86BE77977DBFB3AE3D96F4C22795513AEAAB82FB1C14DDFDC8EC1B2583F51E85A5EB3A155840F2034730E9B5ADA38B674336A21'), (
(112233445566778899112233445566778899, '1B7E046A076CC25E6D7FA5003F6729F665CC3241B5ADAB12B498CD32F2803264BFEA79BE2B666B073DB69A2A241ADAB0738FE9D2DD28B5604EB8C8CF097C457B'), 6,
(29852220098221261079183923314599206100666902414330245206392788703677545185283, '9EACE8F4B071E677C5350B02F2BB2B384AAE89D58AA72CA97A170572E0FB222F1BBDAEC2430B09B93F7CB08678636CE12EAAFD58390699B5FD2F6E1188FC2A78'), "B01A172A76A4602C92D3242CB897DDE3024C740DEBB215B4C6B0AAE93C2291A9E85C10743237DAD56FEC0E2DFBA703791C00F7701C7E16BDFD7C48538FC77FE2",
(57896042899961394862005778464643882389978449576758748073725983489954366354431, '878F22CC6DB6048D2B767268F22FFAD8E56AB8E2DC615F7BD89F1E350500DD8D714A5D7BB901C9C5853400D12341A892EF45D87FC553786756C4F0C9391D763E'), ),
(1766845392945710151501889105729049882997660004824848915955419660366636031, '659A379625AB122F2512B8DADA02C6348D53B54452DFF67AC7ACE4E8856295CA49D81AB97B648464D0B4A288BD7818FAB41A16426E943527C4FED8736C53D0F6'), (
(28948025760307534517734791687894775804466072615242963443097661355606862201087, 'CBCEAAA8A4DD44BBCE58E8DB7740A5510EC2CB7EA8DA8D8F036B3FB04CDA4DE44BD7AA301A80D7F59FD983FEDBE59BB7B2863FE46494935E3745B360E32332FA'), 7,
(113078210460870548944811695960290644973229224625838436424477095834645696384, 'F0C4A0576154FF3A33A3460D42EAED806E854DFA37125221D37935124BA462A45B392FA964434D29EEC6C9DBC261CF116796864AA2FAADB984A2DF38D1AEF7A3'), "8E533B6FA0BF7B4625BB30667C01FB607EF9F8B8A80FEF5B300628703187B2A373EB1DBDE03318366D069F83A6F5900053C73633CB041B21C55E1A86C1F400B4",
(12078056106883488161242983286051341125085761470677906721917479268909056, '5E6C8524B6369530B12C62D31EC53E0288173BD662BDF680B53A41ECBCAD00CC447FE742C2BFEF4D0DB14B5B83A2682309B5618E0064A94804E9282179FE089F'), ),
(57782969857385448082319957860328652998540760998293976083718804450708503920639, '03792E541BC209076A3D7920A915021ECD396A6EB5C3960024BE5575F3223484FC774AE092403101563B712F68170312304F20C80B40C06282063DB25F268DE4'), (
(57896017119460046759583662757090100341435943767777707906455551163257755533312, '2379FF85AB693CDF901D6CE6F2473F39C04A2FE3DCD842CE7AAB0E002095BCF8F8B476530A634589D5129E46F322B02FBC610A703D80875EE70D7CE1877436A1'), 8,
(452312848374287284681282171017647412726433684238464212999305864837160993279, 'C1E4072C529BF2F44DA769EFC934472848003B3AF2C0F5AA8F8DDBD53E12ED7C39A6EE77812BB37E8079CD01ED649D3830FCA46F718C1D3993E4A591824ABCDB'), "62D9779DBEE9B0534042742D3AB54CADC1D238980FCE97DBB4DD9DC1DB6FB393AD5ACCBD91E9D8244FF15D771167CEE0A2ED51F6BBE76A78DA540A6A0F09957E",
(904571339174065134293634407946054000774746055866917729876676367558469746684, '34DFBC09404C21E250A9B40FA8772897AC63A094877DB65862B61BD1507B34F3CF6F8A876C6F99CEAEC87148F18C7E1E0DA6E165FFC8ED82ABB65955215F77D3'), ),
(115792089210356248762697446949407573529996955224135760342422259061068512044349, '83A01A9378395BAB9BCD6A0AD03CC56D56E6B19250465A94A234DC4C6B28DA9A891B64911D08CDCC5195A14629ED48A360DDFD4596DC0AB007DBF5557909BF47'), (
(115792089210356248762697446949407573529996955224135760342422259061068512044350, 'CB6D2861102C0C25CE39B7C17108C507782C452257884895C1FC7B74AB03ED83A7289EB3DB2610AFA3CA18EFF292931B5B698E92CF05C1FC1C6EAF8AD4313255'), 9,
(115792089210356248762697446949407573529996955224135760342422259061068512044351, '1057E0AB5780F470DEFC9378D1C7C87437BB4C6F9EA55C63D936266DBD781FDA090E9BA4EA341A246056482026911A58233EE4A4A10B0E08727C4CC6C395BA5D'), "EA68D7B6FEDF0B71878938D51D71F8729E0ACB8C2C6DF8B3D79E8A4B90949EE02A2744C972C9FCE787014A964A8EA0C84D714FEAA4DE823FE85A224A4DD048FA",
(115792089210356248762697446949407573529996955224135760342422259061068512044352, '47776904C0F1CC3A9C0984B66F75301A5FA68678F0D64AF8BA1ABCE34738A73E55FFA1184A46A8D89DCE7A9A889B717C7E4D7FBCD72A8CC0CD0878008E0E0323'), ),
(115792089210356248762697446949407573529996955224135760342422259061068512044353, '76A94D138A6B41858B821C629836315FCD28392EFF6CA038A5EB4787E1277C6E567A019DCBE0D9F2934F5E4A1EE178DF7A665FFCF0387455F162228DB473AEEF'), (
(115792089210356248762697446949407573529996955224135760342422259061068512044354, 'F0454DC6971ABAE7ADFB378999888265AE03AF92DE3A0EF163668C63E59B9D5F4A46C11BA6D1D2E1B19A6B1AE069BC19D5C4DE328A4A05C0B81A6321F2FCB0C9'), 10,
(115792089210356248762697446949407573529996955224135760342422259061068512044355, '54E77A001C3862B97A76647F4336DF3CF126ACBE7A069C5E5709277324D2920B0A660E43D60BCE8BBDEDE073FA5D183C8E8E15898CAF6FF7E45837D09F2F4C8A'), "CEF66D6B2A3A993E591214D1EA223FB545CA6C471C48306E4C36069404C5723F878662A229AAAE906E123CDD9D3B4C10590DED29FE751EEECA34BBAA44AF0773",
(115792089210356248762697446949407573529996955224135760342422259061068512044356, '177C837AE0AC495A61805DF2D85EE2FC792E284B65EAD58A98E15D9D46072C019C44A731B1415AA85DBF6E524BF0B18DD911EB3D5E04B20C63BC441D10384027'), ),
(115792089210356248762697446949407573529996955224135760342422259061068512044357, '741DD5BDA817D95E4626537320E5D55179983028B2F82C99D500C5EE8624E3C4F88F4B9463C7A024A98C7CAAB7784EAB71146ED4CA45A358E66A00DD32BB7E2C'), (
(115792089210356248762697446949407573529996955224135760342422259061068512044358, '3ED113B7883B4C590638379DB0C21CDA16742ED0255048BF433391D374BC21D16F66DF64333B375EDB37BC505B0B3975F6F2FB26A16776251D07110317D5C8BF'), 11,
(115792089210356248762697446949407573529996955224135760342422259061068512044359, 'CEF66D6B2A3A993E591214D1EA223FB545CA6C471C48306E4C36069404C5723F78799D5CD655517091EDC32262C4B3EFA6F212D7018AE11135CB4455BB50F88C'), "3ED113B7883B4C590638379DB0C21CDA16742ED0255048BF433391D374BC21D19099209ACCC4C8A224C843AFA4F4C68A090D04DA5E9889DAE2F8EEFCE82A3740",
(115792089210356248762697446949407573529996955224135760342422259061068512044360, 'EA68D7B6FEDF0B71878938D51D71F8729E0ACB8C2C6DF8B3D79E8A4B90949EE0D5D8BB358D36031978FEB569B5715F37B28EB0165B217DC017A5DDB5B22FB705'), ),
(115792089210356248762697446949407573529996955224135760342422259061068512044361, '62D9779DBEE9B0534042742D3AB54CADC1D238980FCE97DBB4DD9DC1DB6FB39352A533416E1627DCB00EA288EE98311F5D12AE0A4418958725ABF595F0F66A81'), (
(115792089210356248762697446949407573529996955224135760342422259061068512044362, '8E533B6FA0BF7B4625BB30667C01FB607EF9F8B8A80FEF5B300628703187B2A38C14E2411FCCE7CA92F9607C590A6FFFAC38C9CD34FBE4DE3AA1E5793E0BFF4B'), 12,
(115792089210356248762697446949407573529996955224135760342422259061068512044363, 'B01A172A76A4602C92D3242CB897DDE3024C740DEBB215B4C6B0AAE93C2291A917A3EF8ACDC8252B9013F1D20458FC86E3FF0890E381E9420283B7AC7038801D'), "741DD5BDA817D95E4626537320E5D55179983028B2F82C99D500C5EE8624E3C40770B46A9C385FDC567383554887B1548EEB912C35BA5CA71995FF22CD4481D3",
(115792089210356248762697446949407573529996955224135760342422259061068512044364, '51590B7A515140D2D784C85608668FDFEF8C82FD1F5BE52421554A0DC3D033ED1F3E82566FB58D83751E40C9407586D9F2FED1002B27F7772E2F44BB025E925B'), ),
(115792089210356248762697446949407573529996955224135760342422259061068512044365, 'E2534A3532D08FBBA02DDE659EE62BD0031FE2DB785596EF509302446B0308521F0EA8A4B39CC339E62011A02579D289B103693D0CF11FFAA3BD3DC0E7B12739'), (
(115792089210356248762697446949407573529996955224135760342422259061068512044366, '5ECBE4D1A6330A44C8F7EF951D4BF165E6C6B721EFADA985FB41661BC6E7FD6C78CB9BF2B6670082C8B4F931E59B5D1327D54FCAC7B047C265864ED85D82AFCD'), 13,
(115792089210356248762697446949407573529996955224135760342422259061068512044367, '7CF27B188D034F7E8A52380304B51AC3C08969E277F21B35A60B48FC47669978F888AAEE24712FC0D6C26539608BCF244582521AC3167DD661FB4862DD878C2E'), "177C837AE0AC495A61805DF2D85EE2FC792E284B65EAD58A98E15D9D46072C0163BB58CD4EBEA558A24091ADB40F4E7226EE14C3A1FB4DF39C43BBE2EFC7BFD8",
(115792089210356248762697446949407573529996955224135760342422259061068512044368, '6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296B01CBD1C01E58065711814B583F061E9D431CCA994CEA1313449BF97C840AE0A'), ),
(
14,
"54E77A001C3862B97A76647F4336DF3CF126ACBE7A069C5E5709277324D2920BF599F1BB29F4317542121F8C05A2E7C37171EA77735090081BA7C82F60D0B375",
),
(
15,
"F0454DC6971ABAE7ADFB378999888265AE03AF92DE3A0EF163668C63E59B9D5FB5B93EE3592E2D1F4E6594E51F9643E62A3B21CE75B5FA3F47E59CDE0D034F36",
),
(
16,
"76A94D138A6B41858B821C629836315FCD28392EFF6CA038A5EB4787E1277C6EA985FE61341F260E6CB0A1B5E11E87208599A0040FC78BAA0E9DDD724B8C5110",
),
(
17,
"47776904C0F1CC3A9C0984B66F75301A5FA68678F0D64AF8BA1ABCE34738A73EAA005EE6B5B957286231856577648E8381B2804428D5733F32F787FF71F1FCDC",
),
(
18,
"1057E0AB5780F470DEFC9378D1C7C87437BB4C6F9EA55C63D936266DBD781FDAF6F1645A15CBE5DC9FA9B7DFD96EE5A7DCC11B5C5EF4F1F78D83B3393C6A45A2",
),
(
19,
"CB6D2861102C0C25CE39B7C17108C507782C452257884895C1FC7B74AB03ED8358D7614B24D9EF515C35E7100D6D6CE4A496716E30FA3E03E39150752BCECDAA",
),
(
20,
"83A01A9378395BAB9BCD6A0AD03CC56D56E6B19250465A94A234DC4C6B28DA9A76E49B6DE2F73234AE6A5EB9D612B75C9F2202BB6923F54FF8240AAA86F640B8",
),
(
112233445566778899,
"339150844EC15234807FE862A86BE77977DBFB3AE3D96F4C22795513AEAAB82FB1C14DDFDC8EC1B2583F51E85A5EB3A155840F2034730E9B5ADA38B674336A21",
),
(
112233445566778899112233445566778899,
"1B7E046A076CC25E6D7FA5003F6729F665CC3241B5ADAB12B498CD32F2803264BFEA79BE2B666B073DB69A2A241ADAB0738FE9D2DD28B5604EB8C8CF097C457B",
),
(
29852220098221261079183923314599206100666902414330245206392788703677545185283,
"9EACE8F4B071E677C5350B02F2BB2B384AAE89D58AA72CA97A170572E0FB222F1BBDAEC2430B09B93F7CB08678636CE12EAAFD58390699B5FD2F6E1188FC2A78",
),
(
57896042899961394862005778464643882389978449576758748073725983489954366354431,
"878F22CC6DB6048D2B767268F22FFAD8E56AB8E2DC615F7BD89F1E350500DD8D714A5D7BB901C9C5853400D12341A892EF45D87FC553786756C4F0C9391D763E",
),
(
1766845392945710151501889105729049882997660004824848915955419660366636031,
"659A379625AB122F2512B8DADA02C6348D53B54452DFF67AC7ACE4E8856295CA49D81AB97B648464D0B4A288BD7818FAB41A16426E943527C4FED8736C53D0F6",
),
(
28948025760307534517734791687894775804466072615242963443097661355606862201087,
"CBCEAAA8A4DD44BBCE58E8DB7740A5510EC2CB7EA8DA8D8F036B3FB04CDA4DE44BD7AA301A80D7F59FD983FEDBE59BB7B2863FE46494935E3745B360E32332FA",
),
(
113078210460870548944811695960290644973229224625838436424477095834645696384,
"F0C4A0576154FF3A33A3460D42EAED806E854DFA37125221D37935124BA462A45B392FA964434D29EEC6C9DBC261CF116796864AA2FAADB984A2DF38D1AEF7A3",
),
(
12078056106883488161242983286051341125085761470677906721917479268909056,
"5E6C8524B6369530B12C62D31EC53E0288173BD662BDF680B53A41ECBCAD00CC447FE742C2BFEF4D0DB14B5B83A2682309B5618E0064A94804E9282179FE089F",
),
(
57782969857385448082319957860328652998540760998293976083718804450708503920639,
"03792E541BC209076A3D7920A915021ECD396A6EB5C3960024BE5575F3223484FC774AE092403101563B712F68170312304F20C80B40C06282063DB25F268DE4",
),
(
57896017119460046759583662757090100341435943767777707906455551163257755533312,
"2379FF85AB693CDF901D6CE6F2473F39C04A2FE3DCD842CE7AAB0E002095BCF8F8B476530A634589D5129E46F322B02FBC610A703D80875EE70D7CE1877436A1",
),
(
452312848374287284681282171017647412726433684238464212999305864837160993279,
"C1E4072C529BF2F44DA769EFC934472848003B3AF2C0F5AA8F8DDBD53E12ED7C39A6EE77812BB37E8079CD01ED649D3830FCA46F718C1D3993E4A591824ABCDB",
),
(
904571339174065134293634407946054000774746055866917729876676367558469746684,
"34DFBC09404C21E250A9B40FA8772897AC63A094877DB65862B61BD1507B34F3CF6F8A876C6F99CEAEC87148F18C7E1E0DA6E165FFC8ED82ABB65955215F77D3",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044349,
"83A01A9378395BAB9BCD6A0AD03CC56D56E6B19250465A94A234DC4C6B28DA9A891B64911D08CDCC5195A14629ED48A360DDFD4596DC0AB007DBF5557909BF47",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044350,
"CB6D2861102C0C25CE39B7C17108C507782C452257884895C1FC7B74AB03ED83A7289EB3DB2610AFA3CA18EFF292931B5B698E92CF05C1FC1C6EAF8AD4313255",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044351,
"1057E0AB5780F470DEFC9378D1C7C87437BB4C6F9EA55C63D936266DBD781FDA090E9BA4EA341A246056482026911A58233EE4A4A10B0E08727C4CC6C395BA5D",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044352,
"47776904C0F1CC3A9C0984B66F75301A5FA68678F0D64AF8BA1ABCE34738A73E55FFA1184A46A8D89DCE7A9A889B717C7E4D7FBCD72A8CC0CD0878008E0E0323",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044353,
"76A94D138A6B41858B821C629836315FCD28392EFF6CA038A5EB4787E1277C6E567A019DCBE0D9F2934F5E4A1EE178DF7A665FFCF0387455F162228DB473AEEF",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044354,
"F0454DC6971ABAE7ADFB378999888265AE03AF92DE3A0EF163668C63E59B9D5F4A46C11BA6D1D2E1B19A6B1AE069BC19D5C4DE328A4A05C0B81A6321F2FCB0C9",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044355,
"54E77A001C3862B97A76647F4336DF3CF126ACBE7A069C5E5709277324D2920B0A660E43D60BCE8BBDEDE073FA5D183C8E8E15898CAF6FF7E45837D09F2F4C8A",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044356,
"177C837AE0AC495A61805DF2D85EE2FC792E284B65EAD58A98E15D9D46072C019C44A731B1415AA85DBF6E524BF0B18DD911EB3D5E04B20C63BC441D10384027",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044357,
"741DD5BDA817D95E4626537320E5D55179983028B2F82C99D500C5EE8624E3C4F88F4B9463C7A024A98C7CAAB7784EAB71146ED4CA45A358E66A00DD32BB7E2C",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044358,
"3ED113B7883B4C590638379DB0C21CDA16742ED0255048BF433391D374BC21D16F66DF64333B375EDB37BC505B0B3975F6F2FB26A16776251D07110317D5C8BF",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044359,
"CEF66D6B2A3A993E591214D1EA223FB545CA6C471C48306E4C36069404C5723F78799D5CD655517091EDC32262C4B3EFA6F212D7018AE11135CB4455BB50F88C",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044360,
"EA68D7B6FEDF0B71878938D51D71F8729E0ACB8C2C6DF8B3D79E8A4B90949EE0D5D8BB358D36031978FEB569B5715F37B28EB0165B217DC017A5DDB5B22FB705",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044361,
"62D9779DBEE9B0534042742D3AB54CADC1D238980FCE97DBB4DD9DC1DB6FB39352A533416E1627DCB00EA288EE98311F5D12AE0A4418958725ABF595F0F66A81",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044362,
"8E533B6FA0BF7B4625BB30667C01FB607EF9F8B8A80FEF5B300628703187B2A38C14E2411FCCE7CA92F9607C590A6FFFAC38C9CD34FBE4DE3AA1E5793E0BFF4B",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044363,
"B01A172A76A4602C92D3242CB897DDE3024C740DEBB215B4C6B0AAE93C2291A917A3EF8ACDC8252B9013F1D20458FC86E3FF0890E381E9420283B7AC7038801D",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044364,
"51590B7A515140D2D784C85608668FDFEF8C82FD1F5BE52421554A0DC3D033ED1F3E82566FB58D83751E40C9407586D9F2FED1002B27F7772E2F44BB025E925B",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044365,
"E2534A3532D08FBBA02DDE659EE62BD0031FE2DB785596EF509302446B0308521F0EA8A4B39CC339E62011A02579D289B103693D0CF11FFAA3BD3DC0E7B12739",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044366,
"5ECBE4D1A6330A44C8F7EF951D4BF165E6C6B721EFADA985FB41661BC6E7FD6C78CB9BF2B6670082C8B4F931E59B5D1327D54FCAC7B047C265864ED85D82AFCD",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044367,
"7CF27B188D034F7E8A52380304B51AC3C08969E277F21B35A60B48FC47669978F888AAEE24712FC0D6C26539608BCF244582521AC3167DD661FB4862DD878C2E",
),
(
115792089210356248762697446949407573529996955224135760342422259061068512044368,
"6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296B01CBD1C01E58065711814B583F061E9D431CCA994CEA1313449BF97C840AE0A",
),
] ]
def test_generate_secret(self): def test_generate_secret(self):
for _ in range(100): for _ in range(100):
sk = nist256p1.generate_secret() sk = nist256p1.generate_secret()
self.assertTrue(len(sk) == 32) self.assertTrue(len(sk) == 32)
self.assertTrue(sk != b'\x00' * 32) self.assertTrue(sk != b"\x00" * 32)
self.assertTrue(sk < b'\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xBC\xE6\xFA\xAD\xA7\x17\x9E\x84\xF3\xB9\xCA\xC2\xFC\x63\x25\x51') self.assertTrue(
sk
< b"\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xBC\xE6\xFA\xAD\xA7\x17\x9E\x84\xF3\xB9\xCA\xC2\xFC\x63\x25\x51"
)
def test_publickey(self): def test_publickey(self):
for sk, pk in self.vectors: for sk, pk in self.vectors:
sk = hex(sk)[2:] sk = hex(sk)[2:]
if len(sk) < 64: if len(sk) < 64:
sk = '0' * (64 - len(sk)) + sk sk = "0" * (64 - len(sk)) + sk
pk = pk.lower() pk = pk.lower()
pk65 = hexlify(nist256p1.publickey(unhexlify(sk), False)).decode() # uncompressed pk65 = hexlify(
self.assertEqual(str(pk65), '04' + pk) nist256p1.publickey(unhexlify(sk), False)
).decode() # uncompressed
self.assertEqual(str(pk65), "04" + pk)
pk33 = hexlify(nist256p1.publickey(unhexlify(sk))).decode() pk33 = hexlify(nist256p1.publickey(unhexlify(sk))).decode()
if pk[-1] in '02468ace': if pk[-1] in "02468ace":
self.assertEqual(pk33, '02' + pk[:64]) self.assertEqual(pk33, "02" + pk[:64])
else: else:
self.assertEqual(pk33, '03' + pk[:64]) self.assertEqual(pk33, "03" + pk[:64])
def test_sign_verify_min_max(self): def test_sign_verify_min_max(self):
sk = nist256p1.generate_secret() sk = nist256p1.generate_secret()
@ -122,5 +283,5 @@ class TestCryptoNist256p1(unittest.TestCase):
self.assertEqual(pk, pk2) self.assertEqual(pk, pk2)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -7,73 +7,213 @@ from trezor.crypto.curve import secp256k1
class TestCryptoSecp256k1(unittest.TestCase): class TestCryptoSecp256k1(unittest.TestCase):
# vectors from https://crypto.stackexchange.com/questions/784/are-there-any-secp256k1-ecdsa-test-examples-available # vectors from https://crypto.stackexchange.com/questions/784/are-there-any-secp256k1-ecdsa-test-examples-available
vectors = [ vectors = [
(1, '79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8'), (
(2, 'C6047F9441ED7D6D3045406E95C07CD85C778E4B8CEF3CA7ABAC09B95C709EE51AE168FEA63DC339A3C58419466CEAEEF7F632653266D0E1236431A950CFE52A'), 1,
(3, 'F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9388F7B0F632DE8140FE337E62A37F3566500A99934C2231B6CB9FD7584B8E672'), "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8",
(4, 'E493DBF1C10D80F3581E4904930B1404CC6C13900EE0758474FA94ABE8C4CD1351ED993EA0D455B75642E2098EA51448D967AE33BFBDFE40CFE97BDC47739922'), ),
(5, '2F8BDE4D1A07209355B4A7250A5C5128E88B84BDDC619AB7CBA8D569B240EFE4D8AC222636E5E3D6D4DBA9DDA6C9C426F788271BAB0D6840DCA87D3AA6AC62D6'), (
(6, 'FFF97BD5755EEEA420453A14355235D382F6472F8568A18B2F057A1460297556AE12777AACFBB620F3BE96017F45C560DE80F0F6518FE4A03C870C36B075F297'), 2,
(7, '5CBDF0646E5DB4EAA398F365F2EA7A0E3D419B7E0330E39CE92BDDEDCAC4F9BC6AEBCA40BA255960A3178D6D861A54DBA813D0B813FDE7B5A5082628087264DA'), "C6047F9441ED7D6D3045406E95C07CD85C778E4B8CEF3CA7ABAC09B95C709EE51AE168FEA63DC339A3C58419466CEAEEF7F632653266D0E1236431A950CFE52A",
(8, '2F01E5E15CCA351DAFF3843FB70F3C2F0A1BDD05E5AF888A67784EF3E10A2A015C4DA8A741539949293D082A132D13B4C2E213D6BA5B7617B5DA2CB76CBDE904'), ),
(9, 'ACD484E2F0C7F65309AD178A9F559ABDE09796974C57E714C35F110DFC27CCBECC338921B0A7D9FD64380971763B61E9ADD888A4375F8E0F05CC262AC64F9C37'), (
(10, 'A0434D9E47F3C86235477C7B1AE6AE5D3442D49B1943C2B752A68E2A47E247C7893ABA425419BC27A3B6C7E693A24C696F794C2ED877A1593CBEE53B037368D7'), 3,
(11, '774AE7F858A9411E5EF4246B70C65AAC5649980BE5C17891BBEC17895DA008CBD984A032EB6B5E190243DD56D7B7B365372DB1E2DFF9D6A8301D74C9C953C61B'), "F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9388F7B0F632DE8140FE337E62A37F3566500A99934C2231B6CB9FD7584B8E672",
(12, 'D01115D548E7561B15C38F004D734633687CF4419620095BC5B0F47070AFE85AA9F34FFDC815E0D7A8B64537E17BD81579238C5DD9A86D526B051B13F4062327'), ),
(13, 'F28773C2D975288BC7D1D205C3748651B075FBC6610E58CDDEEDDF8F19405AA80AB0902E8D880A89758212EB65CDAF473A1A06DA521FA91F29B5CB52DB03ED81'), (
(14, '499FDF9E895E719CFD64E67F07D38E3226AA7B63678949E6E49B241A60E823E4CAC2F6C4B54E855190F044E4A7B3D464464279C27A3F95BCC65F40D403A13F5B'), 4,
(15, 'D7924D4F7D43EA965A465AE3095FF41131E5946F3C85F79E44ADBCF8E27E080E581E2872A86C72A683842EC228CC6DEFEA40AF2BD896D3A5C504DC9FF6A26B58'), "E493DBF1C10D80F3581E4904930B1404CC6C13900EE0758474FA94ABE8C4CD1351ED993EA0D455B75642E2098EA51448D967AE33BFBDFE40CFE97BDC47739922",
(16, 'E60FCE93B59E9EC53011AABC21C23E97B2A31369B87A5AE9C44EE89E2A6DEC0AF7E3507399E595929DB99F34F57937101296891E44D23F0BE1F32CCE69616821'), ),
(17, 'DEFDEA4CDB677750A420FEE807EACF21EB9898AE79B9768766E4FAA04A2D4A344211AB0694635168E997B0EAD2A93DAECED1F4A04A95C0F6CFB199F69E56EB77'), (
(18, '5601570CB47F238D2B0286DB4A990FA0F3BA28D1A319F5E7CF55C2A2444DA7CCC136C1DC0CBEB930E9E298043589351D81D8E0BC736AE2A1F5192E5E8B061D58'), 5,
(19, '2B4EA0A797A443D293EF5CFF444F4979F06ACFEBD7E86D277475656138385B6C85E89BC037945D93B343083B5A1C86131A01F60C50269763B570C854E5C09B7A'), "2F8BDE4D1A07209355B4A7250A5C5128E88B84BDDC619AB7CBA8D569B240EFE4D8AC222636E5E3D6D4DBA9DDA6C9C426F788271BAB0D6840DCA87D3AA6AC62D6",
(20, '4CE119C96E2FA357200B559B2F7DD5A5F02D5290AFF74B03F3E471B273211C9712BA26DCB10EC1625DA61FA10A844C676162948271D96967450288EE9233DC3A'), ),
(112233445566778899, 'A90CC3D3F3E146DAADFC74CA1372207CB4B725AE708CEF713A98EDD73D99EF295A79D6B289610C68BC3B47F3D72F9788A26A06868B4D8E433E1E2AD76FB7DC76'), (
(112233445566778899112233445566778899, 'E5A2636BCFD412EBF36EC45B19BFB68A1BC5F8632E678132B885F7DF99C5E9B3736C1CE161AE27B405CAFD2A7520370153C2C861AC51D6C1D5985D9606B45F39'), 6,
(28948022309329048855892746252171976963209391069768726095651290785379540373584, 'A6B594B38FB3E77C6EDF78161FADE2041F4E09FD8497DB776E546C41567FEB3C71444009192228730CD8237A490FEBA2AFE3D27D7CC1136BC97E439D13330D55'), "FFF97BD5755EEEA420453A14355235D382F6472F8568A18B2F057A1460297556AE12777AACFBB620F3BE96017F45C560DE80F0F6518FE4A03C870C36B075F297",
(57896044618658097711785492504343953926418782139537452191302581570759080747168, '00000000000000000000003B78CE563F89A0ED9414F5AA28AD0D96D6795F9C633F3979BF72AE8202983DC989AEC7F2FF2ED91BDD69CE02FC0700CA100E59DDF3'), ),
(86844066927987146567678238756515930889628173209306178286953872356138621120752, 'E24CE4BEEE294AA6350FAA67512B99D388693AE4E7F53D19882A6EA169FC1CE18B71E83545FC2B5872589F99D948C03108D36797C4DE363EBD3FF6A9E1A95B10'), (
(115792089237316195423570985008687907852837564279074904382605163141518161494317, '4CE119C96E2FA357200B559B2F7DD5A5F02D5290AFF74B03F3E471B273211C97ED45D9234EF13E9DA259E05EF57BB3989E9D6B7D8E269698BAFD77106DCC1FF5'), 7,
(115792089237316195423570985008687907852837564279074904382605163141518161494318, '2B4EA0A797A443D293EF5CFF444F4979F06ACFEBD7E86D277475656138385B6C7A17643FC86BA26C4CBCF7C4A5E379ECE5FE09F3AFD9689C4A8F37AA1A3F60B5'), "5CBDF0646E5DB4EAA398F365F2EA7A0E3D419B7E0330E39CE92BDDEDCAC4F9BC6AEBCA40BA255960A3178D6D861A54DBA813D0B813FDE7B5A5082628087264DA",
(115792089237316195423570985008687907852837564279074904382605163141518161494319, '5601570CB47F238D2B0286DB4A990FA0F3BA28D1A319F5E7CF55C2A2444DA7CC3EC93E23F34146CF161D67FBCA76CAE27E271F438C951D5E0AE6D1A074F9DED7'), ),
(115792089237316195423570985008687907852837564279074904382605163141518161494320, 'DEFDEA4CDB677750A420FEE807EACF21EB9898AE79B9768766E4FAA04A2D4A34BDEE54F96B9CAE9716684F152D56C251312E0B5FB56A3F09304E660861A910B8'), (
(115792089237316195423570985008687907852837564279074904382605163141518161494321, 'E60FCE93B59E9EC53011AABC21C23E97B2A31369B87A5AE9C44EE89E2A6DEC0A081CAF8C661A6A6D624660CB0A86C8EFED6976E1BB2DC0F41E0CD330969E940E'), 8,
(115792089237316195423570985008687907852837564279074904382605163141518161494322, 'D7924D4F7D43EA965A465AE3095FF41131E5946F3C85F79E44ADBCF8E27E080EA7E1D78D57938D597C7BD13DD733921015BF50D427692C5A3AFB235F095D90D7'), "2F01E5E15CCA351DAFF3843FB70F3C2F0A1BDD05E5AF888A67784EF3E10A2A015C4DA8A741539949293D082A132D13B4C2E213D6BA5B7617B5DA2CB76CBDE904",
(115792089237316195423570985008687907852837564279074904382605163141518161494323, '499FDF9E895E719CFD64E67F07D38E3226AA7B63678949E6E49B241A60E823E4353D093B4AB17AAE6F0FBB1B584C2B9BB9BD863D85C06A4339A0BF2AFC5EBCD4'), ),
(115792089237316195423570985008687907852837564279074904382605163141518161494324, 'F28773C2D975288BC7D1D205C3748651B075FBC6610E58CDDEEDDF8F19405AA8F54F6FD17277F5768A7DED149A3250B8C5E5F925ADE056E0D64A34AC24FC0EAE'), (
(115792089237316195423570985008687907852837564279074904382605163141518161494325, 'D01115D548E7561B15C38F004D734633687CF4419620095BC5B0F47070AFE85A560CB00237EA1F285749BAC81E8427EA86DC73A2265792AD94FAE4EB0BF9D908'), 9,
(115792089237316195423570985008687907852837564279074904382605163141518161494326, '774AE7F858A9411E5EF4246B70C65AAC5649980BE5C17891BBEC17895DA008CB267B5FCD1494A1E6FDBC22A928484C9AC8D24E1D20062957CFE28B3536AC3614'), "ACD484E2F0C7F65309AD178A9F559ABDE09796974C57E714C35F110DFC27CCBECC338921B0A7D9FD64380971763B61E9ADD888A4375F8E0F05CC262AC64F9C37",
(115792089237316195423570985008687907852837564279074904382605163141518161494327, 'A0434D9E47F3C86235477C7B1AE6AE5D3442D49B1943C2B752A68E2A47E247C776C545BDABE643D85C4938196C5DB3969086B3D127885EA6C3411AC3FC8C9358'), ),
(115792089237316195423570985008687907852837564279074904382605163141518161494328, 'ACD484E2F0C7F65309AD178A9F559ABDE09796974C57E714C35F110DFC27CCBE33CC76DE4F5826029BC7F68E89C49E165227775BC8A071F0FA33D9D439B05FF8'), (
(115792089237316195423570985008687907852837564279074904382605163141518161494329, '2F01E5E15CCA351DAFF3843FB70F3C2F0A1BDD05E5AF888A67784EF3E10A2A01A3B25758BEAC66B6D6C2F7D5ECD2EC4B3D1DEC2945A489E84A25D3479342132B'), 10,
(115792089237316195423570985008687907852837564279074904382605163141518161494330, '5CBDF0646E5DB4EAA398F365F2EA7A0E3D419B7E0330E39CE92BDDEDCAC4F9BC951435BF45DAA69F5CE8729279E5AB2457EC2F47EC02184A5AF7D9D6F78D9755'), "A0434D9E47F3C86235477C7B1AE6AE5D3442D49B1943C2B752A68E2A47E247C7893ABA425419BC27A3B6C7E693A24C696F794C2ED877A1593CBEE53B037368D7",
(115792089237316195423570985008687907852837564279074904382605163141518161494331, 'FFF97BD5755EEEA420453A14355235D382F6472F8568A18B2F057A146029755651ED8885530449DF0C4169FE80BA3A9F217F0F09AE701B5FC378F3C84F8A0998'), ),
(115792089237316195423570985008687907852837564279074904382605163141518161494332, '2F8BDE4D1A07209355B4A7250A5C5128E88B84BDDC619AB7CBA8D569B240EFE42753DDD9C91A1C292B24562259363BD90877D8E454F297BF235782C459539959'), (
(115792089237316195423570985008687907852837564279074904382605163141518161494333, 'E493DBF1C10D80F3581E4904930B1404CC6C13900EE0758474FA94ABE8C4CD13AE1266C15F2BAA48A9BD1DF6715AEBB7269851CC404201BF30168422B88C630D'), 11,
(115792089237316195423570985008687907852837564279074904382605163141518161494334, 'F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9C77084F09CD217EBF01CC819D5C80CA99AFF5666CB3DDCE4934602897B4715BD'), "774AE7F858A9411E5EF4246B70C65AAC5649980BE5C17891BBEC17895DA008CBD984A032EB6B5E190243DD56D7B7B365372DB1E2DFF9D6A8301D74C9C953C61B",
(115792089237316195423570985008687907852837564279074904382605163141518161494335, 'C6047F9441ED7D6D3045406E95C07CD85C778E4B8CEF3CA7ABAC09B95C709EE5E51E970159C23CC65C3A7BE6B99315110809CD9ACD992F1EDC9BCE55AF301705'), ),
(115792089237316195423570985008687907852837564279074904382605163141518161494336, '79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798B7C52588D95C3B9AA25B0403F1EEF75702E84BB7597AABE663B82F6F04EF2777'), (
12,
"D01115D548E7561B15C38F004D734633687CF4419620095BC5B0F47070AFE85AA9F34FFDC815E0D7A8B64537E17BD81579238C5DD9A86D526B051B13F4062327",
),
(
13,
"F28773C2D975288BC7D1D205C3748651B075FBC6610E58CDDEEDDF8F19405AA80AB0902E8D880A89758212EB65CDAF473A1A06DA521FA91F29B5CB52DB03ED81",
),
(
14,
"499FDF9E895E719CFD64E67F07D38E3226AA7B63678949E6E49B241A60E823E4CAC2F6C4B54E855190F044E4A7B3D464464279C27A3F95BCC65F40D403A13F5B",
),
(
15,
"D7924D4F7D43EA965A465AE3095FF41131E5946F3C85F79E44ADBCF8E27E080E581E2872A86C72A683842EC228CC6DEFEA40AF2BD896D3A5C504DC9FF6A26B58",
),
(
16,
"E60FCE93B59E9EC53011AABC21C23E97B2A31369B87A5AE9C44EE89E2A6DEC0AF7E3507399E595929DB99F34F57937101296891E44D23F0BE1F32CCE69616821",
),
(
17,
"DEFDEA4CDB677750A420FEE807EACF21EB9898AE79B9768766E4FAA04A2D4A344211AB0694635168E997B0EAD2A93DAECED1F4A04A95C0F6CFB199F69E56EB77",
),
(
18,
"5601570CB47F238D2B0286DB4A990FA0F3BA28D1A319F5E7CF55C2A2444DA7CCC136C1DC0CBEB930E9E298043589351D81D8E0BC736AE2A1F5192E5E8B061D58",
),
(
19,
"2B4EA0A797A443D293EF5CFF444F4979F06ACFEBD7E86D277475656138385B6C85E89BC037945D93B343083B5A1C86131A01F60C50269763B570C854E5C09B7A",
),
(
20,
"4CE119C96E2FA357200B559B2F7DD5A5F02D5290AFF74B03F3E471B273211C9712BA26DCB10EC1625DA61FA10A844C676162948271D96967450288EE9233DC3A",
),
(
112233445566778899,
"A90CC3D3F3E146DAADFC74CA1372207CB4B725AE708CEF713A98EDD73D99EF295A79D6B289610C68BC3B47F3D72F9788A26A06868B4D8E433E1E2AD76FB7DC76",
),
(
112233445566778899112233445566778899,
"E5A2636BCFD412EBF36EC45B19BFB68A1BC5F8632E678132B885F7DF99C5E9B3736C1CE161AE27B405CAFD2A7520370153C2C861AC51D6C1D5985D9606B45F39",
),
(
28948022309329048855892746252171976963209391069768726095651290785379540373584,
"A6B594B38FB3E77C6EDF78161FADE2041F4E09FD8497DB776E546C41567FEB3C71444009192228730CD8237A490FEBA2AFE3D27D7CC1136BC97E439D13330D55",
),
(
57896044618658097711785492504343953926418782139537452191302581570759080747168,
"00000000000000000000003B78CE563F89A0ED9414F5AA28AD0D96D6795F9C633F3979BF72AE8202983DC989AEC7F2FF2ED91BDD69CE02FC0700CA100E59DDF3",
),
(
86844066927987146567678238756515930889628173209306178286953872356138621120752,
"E24CE4BEEE294AA6350FAA67512B99D388693AE4E7F53D19882A6EA169FC1CE18B71E83545FC2B5872589F99D948C03108D36797C4DE363EBD3FF6A9E1A95B10",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494317,
"4CE119C96E2FA357200B559B2F7DD5A5F02D5290AFF74B03F3E471B273211C97ED45D9234EF13E9DA259E05EF57BB3989E9D6B7D8E269698BAFD77106DCC1FF5",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494318,
"2B4EA0A797A443D293EF5CFF444F4979F06ACFEBD7E86D277475656138385B6C7A17643FC86BA26C4CBCF7C4A5E379ECE5FE09F3AFD9689C4A8F37AA1A3F60B5",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494319,
"5601570CB47F238D2B0286DB4A990FA0F3BA28D1A319F5E7CF55C2A2444DA7CC3EC93E23F34146CF161D67FBCA76CAE27E271F438C951D5E0AE6D1A074F9DED7",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494320,
"DEFDEA4CDB677750A420FEE807EACF21EB9898AE79B9768766E4FAA04A2D4A34BDEE54F96B9CAE9716684F152D56C251312E0B5FB56A3F09304E660861A910B8",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494321,
"E60FCE93B59E9EC53011AABC21C23E97B2A31369B87A5AE9C44EE89E2A6DEC0A081CAF8C661A6A6D624660CB0A86C8EFED6976E1BB2DC0F41E0CD330969E940E",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494322,
"D7924D4F7D43EA965A465AE3095FF41131E5946F3C85F79E44ADBCF8E27E080EA7E1D78D57938D597C7BD13DD733921015BF50D427692C5A3AFB235F095D90D7",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494323,
"499FDF9E895E719CFD64E67F07D38E3226AA7B63678949E6E49B241A60E823E4353D093B4AB17AAE6F0FBB1B584C2B9BB9BD863D85C06A4339A0BF2AFC5EBCD4",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494324,
"F28773C2D975288BC7D1D205C3748651B075FBC6610E58CDDEEDDF8F19405AA8F54F6FD17277F5768A7DED149A3250B8C5E5F925ADE056E0D64A34AC24FC0EAE",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494325,
"D01115D548E7561B15C38F004D734633687CF4419620095BC5B0F47070AFE85A560CB00237EA1F285749BAC81E8427EA86DC73A2265792AD94FAE4EB0BF9D908",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494326,
"774AE7F858A9411E5EF4246B70C65AAC5649980BE5C17891BBEC17895DA008CB267B5FCD1494A1E6FDBC22A928484C9AC8D24E1D20062957CFE28B3536AC3614",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494327,
"A0434D9E47F3C86235477C7B1AE6AE5D3442D49B1943C2B752A68E2A47E247C776C545BDABE643D85C4938196C5DB3969086B3D127885EA6C3411AC3FC8C9358",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494328,
"ACD484E2F0C7F65309AD178A9F559ABDE09796974C57E714C35F110DFC27CCBE33CC76DE4F5826029BC7F68E89C49E165227775BC8A071F0FA33D9D439B05FF8",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494329,
"2F01E5E15CCA351DAFF3843FB70F3C2F0A1BDD05E5AF888A67784EF3E10A2A01A3B25758BEAC66B6D6C2F7D5ECD2EC4B3D1DEC2945A489E84A25D3479342132B",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494330,
"5CBDF0646E5DB4EAA398F365F2EA7A0E3D419B7E0330E39CE92BDDEDCAC4F9BC951435BF45DAA69F5CE8729279E5AB2457EC2F47EC02184A5AF7D9D6F78D9755",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494331,
"FFF97BD5755EEEA420453A14355235D382F6472F8568A18B2F057A146029755651ED8885530449DF0C4169FE80BA3A9F217F0F09AE701B5FC378F3C84F8A0998",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494332,
"2F8BDE4D1A07209355B4A7250A5C5128E88B84BDDC619AB7CBA8D569B240EFE42753DDD9C91A1C292B24562259363BD90877D8E454F297BF235782C459539959",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494333,
"E493DBF1C10D80F3581E4904930B1404CC6C13900EE0758474FA94ABE8C4CD13AE1266C15F2BAA48A9BD1DF6715AEBB7269851CC404201BF30168422B88C630D",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494334,
"F9308A019258C31049344F85F89D5229B531C845836F99B08601F113BCE036F9C77084F09CD217EBF01CC819D5C80CA99AFF5666CB3DDCE4934602897B4715BD",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494335,
"C6047F9441ED7D6D3045406E95C07CD85C778E4B8CEF3CA7ABAC09B95C709EE5E51E970159C23CC65C3A7BE6B99315110809CD9ACD992F1EDC9BCE55AF301705",
),
(
115792089237316195423570985008687907852837564279074904382605163141518161494336,
"79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798B7C52588D95C3B9AA25B0403F1EEF75702E84BB7597AABE663B82F6F04EF2777",
),
] ]
def test_generate_secret(self): def test_generate_secret(self):
for _ in range(100): for _ in range(100):
sk = secp256k1.generate_secret() sk = secp256k1.generate_secret()
self.assertTrue(len(sk) == 32) self.assertTrue(len(sk) == 32)
self.assertTrue(sk != b'\x00' * 32) self.assertTrue(sk != b"\x00" * 32)
self.assertTrue(sk < b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE\xBA\xAE\xDC\xE6\xAF\x48\xA0\x3B\xBF\xD2\x5E\x8C\xD0\x36\x41\x41') self.assertTrue(
sk
< b"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFE\xBA\xAE\xDC\xE6\xAF\x48\xA0\x3B\xBF\xD2\x5E\x8C\xD0\x36\x41\x41"
)
def test_publickey(self): def test_publickey(self):
for sk, pk in self.vectors: for sk, pk in self.vectors:
sk = hex(sk)[2:] sk = hex(sk)[2:]
if len(sk) < 64: if len(sk) < 64:
sk = '0' * (64 - len(sk)) + sk sk = "0" * (64 - len(sk)) + sk
pk = pk.lower() pk = pk.lower()
pk65 = hexlify(secp256k1.publickey(unhexlify(sk), False)).decode() # uncompressed pk65 = hexlify(
self.assertEqual(str(pk65), '04' + pk) secp256k1.publickey(unhexlify(sk), False)
).decode() # uncompressed
self.assertEqual(str(pk65), "04" + pk)
pk33 = hexlify(secp256k1.publickey(unhexlify(sk))).decode() pk33 = hexlify(secp256k1.publickey(unhexlify(sk))).decode()
if pk[-1] in '02468ace': if pk[-1] in "02468ace":
self.assertEqual(pk33, '02' + pk[:64]) self.assertEqual(pk33, "02" + pk[:64])
else: else:
self.assertEqual(pk33, '03' + pk[:64]) self.assertEqual(pk33, "03" + pk[:64])
def test_sign_verify_min_max(self): def test_sign_verify_min_max(self):
sk = secp256k1.generate_secret() sk = secp256k1.generate_secret()
@ -120,7 +260,7 @@ class TestCryptoSecp256k1(unittest.TestCase):
(sk, pk) = self.vectors[0] (sk, pk) = self.vectors[0]
sk = hex(sk)[2:] sk = hex(sk)[2:]
if len(sk) < 64: if len(sk) < 64:
sk = '0' * (64 - len(sk)) + sk sk = "0" * (64 - len(sk)) + sk
sk = unhexlify(sk) sk = unhexlify(sk)
pk = pk.lower() pk = pk.lower()
pk33 = secp256k1.publickey(sk) pk33 = secp256k1.publickey(sk)
@ -132,5 +272,6 @@ class TestCryptoSecp256k1(unittest.TestCase):
self.assertEqual(fixed_vector1, fixed_vector2) self.assertEqual(fixed_vector1, fixed_vector2)
self.assertEqual(hexlify(fixed_vector1), fixed_vector_hex) self.assertEqual(hexlify(fixed_vector1), fixed_vector_hex)
if __name__ == '__main__':
if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -6,41 +6,69 @@ from trezor.crypto import der
class TestCryptoDer(unittest.TestCase): class TestCryptoDer(unittest.TestCase):
vectors_seq = [ vectors_seq = [
(('9a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b70771', (
'2b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede781'), (
'30450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede781'), "9a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b70771",
"2b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede781",
(('6666666666666666666666666666666666666666666666666666666666666666', ),
'7777777777777777777777777777777777777777777777777777777777777777'), "30450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede781",
'30440220666666666666666666666666666666666666666666666666666666666666666602207777777777777777777777777777777777777777777777777777777777777777'), ),
(
(('6666666666666666666666666666666666666666666666666666666666666666', (
'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'), "6666666666666666666666666666666666666666666666666666666666666666",
'304502206666666666666666666666666666666666666666666666666666666666666666022100eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'), "7777777777777777777777777777777777777777777777777777777777777777",
),
(('eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', "30440220666666666666666666666666666666666666666666666666666666666666666602207777777777777777777777777777777777777777777777777777777777777777",
'7777777777777777777777777777777777777777777777777777777777777777'), ),
'3045022100eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee02207777777777777777777777777777777777777777777777777777777777777777'), (
(
(('eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', "6666666666666666666666666666666666666666666666666666666666666666",
'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'), "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
'3046022100eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee022100ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'), ),
"304502206666666666666666666666666666666666666666666666666666666666666666022100eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
(('0000000000000000000000000000000000000000000000000000000000000066', ),
'0000000000000000000000000000000000000000000000000000000000000077'), (
'3006020166020177'), (
"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
(('0000000000000000000000000000000000000000000000000000000000000066', "7777777777777777777777777777777777777777777777777777777777777777",
'00000000000000000000000000000000000000000000000000000000000000ee'), ),
'3007020166020200ee'), "3045022100eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee02207777777777777777777777777777777777777777777777777777777777777777",
),
(('00000000000000000000000000000000000000000000000000000000000000ee', (
'0000000000000000000000000000000000000000000000000000000000000077'), (
'3007020200ee020177'), "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
(('00000000000000000000000000000000000000000000000000000000000000ee', ),
'00000000000000000000000000000000000000000000000000000000000000ff'), "3046022100eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee022100ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
'3008020200ee020200ff'), ),
(
(
"0000000000000000000000000000000000000000000000000000000000000066",
"0000000000000000000000000000000000000000000000000000000000000077",
),
"3006020166020177",
),
(
(
"0000000000000000000000000000000000000000000000000000000000000066",
"00000000000000000000000000000000000000000000000000000000000000ee",
),
"3007020166020200ee",
),
(
(
"00000000000000000000000000000000000000000000000000000000000000ee",
"0000000000000000000000000000000000000000000000000000000000000077",
),
"3007020200ee020177",
),
(
(
"00000000000000000000000000000000000000000000000000000000000000ee",
"00000000000000000000000000000000000000000000000000000000000000ff",
),
"3008020200ee020200ff",
),
] ]
def test_der_encode_seq(self): def test_der_encode_seq(self):
@ -56,7 +84,7 @@ class TestCryptoDer(unittest.TestCase):
def test_der_encode_decode_long_seq(self): def test_der_encode_decode_long_seq(self):
for length in (1, 127, 128, 129, 255, 256, 257): for length in (1, 127, 128, 129, 255, 256, 257):
raw_int = bytes((i & 0xfe) + 1 for i in range(length)) raw_int = bytes((i & 0xFE) + 1 for i in range(length))
for leading_zeros in range(3): for leading_zeros in range(3):
encoded = der.encode_seq((b"\x00" * leading_zeros + raw_int,)) encoded = der.encode_seq((b"\x00" * leading_zeros + raw_int,))
decoded = der.decode_seq(encoded) decoded = der.decode_seq(encoded)
@ -67,5 +95,6 @@ class TestCryptoDer(unittest.TestCase):
decoded = der.decode_seq(encoded) decoded = der.decode_seq(encoded)
self.assertEqual(decoded, [b"\x00"]) self.assertEqual(decoded, [b"\x00"])
if __name__ == '__main__':
if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -8,26 +8,74 @@ class TestCryptoBlake256(unittest.TestCase):
# vectors from https://raw.githubusercontent.com/monero-project/monero/master/tests/hash/tests-extra-blake.txt # vectors from https://raw.githubusercontent.com/monero-project/monero/master/tests/hash/tests-extra-blake.txt
vectors = [ vectors = [
('', '716f6e863f744b9ac22c97ec7b76ea5f5908bc5b2f67c61510bfc4751384ea7a'), ("", "716f6e863f744b9ac22c97ec7b76ea5f5908bc5b2f67c61510bfc4751384ea7a"),
('cc', 'e104256a2bc501f459d03fac96b9014f593e22d30f4de525fa680c3aa189eb4f'), ("cc", "e104256a2bc501f459d03fac96b9014f593e22d30f4de525fa680c3aa189eb4f"),
('41fb', '8f341148be7e354fdf38b693d8c6b4e0bd57301a734f6fd35cd85b8491c3ddcd'), ("41fb", "8f341148be7e354fdf38b693d8c6b4e0bd57301a734f6fd35cd85b8491c3ddcd"),
('1f877c', 'bc334d1069099f10c601883ac6f3e7e9787c6aa53171f76a21923cc5ad3ab937'), ("1f877c", "bc334d1069099f10c601883ac6f3e7e9787c6aa53171f76a21923cc5ad3ab937"),
('c1ecfdfc', 'b672a16f53982bab1e77685b71c0a5f6703ffd46a1c834be69f614bd128d658e'), (
('21f134ac57', 'd9134b2899057a7d8d320cc99e3e116982bc99d3c69d260a7f1ed3da8be68d99'), "c1ecfdfc",
('c6f50bb74e29', '637923bd29a35aa3ecbbd2a50549fc32c14cf0fdcaf41c3194dd7414fd224815'), "b672a16f53982bab1e77685b71c0a5f6703ffd46a1c834be69f614bd128d658e",
('119713cc83eeef', '70c092fd5c8c21e9ef4bbc82a5c7819e262a530a748caf285ff0cba891954f1e'), ),
('4a4f202484512526', 'fdf092993edbb7a0dc7ca67f04051bbd14481639da0808947aff8bfab5abed4b'), (
('1f66ab4185ed9b6375', '6f6fc234bf35beae1a366c44c520c59ad5aa70351b5f5085e21e1fe2bfcee709'), "21f134ac57",
('eed7422227613b6f53c9', '4fdaf89e2a0e78c000061b59455e0ea93a4445b440e7562c8f0cfa165c93de2e'), "d9134b2899057a7d8d320cc99e3e116982bc99d3c69d260a7f1ed3da8be68d99",
('eaeed5cdffd89dece455f1', 'd6b780eee9c811f664393dc2c58b5a68c92b3c9fe9ceb70371d33ece63b5787e'), ),
('5be43c90f22902e4fe8ed2d3', 'd0015071d3e7ed048c764850d76406eceae52b8e2e6e5a2c3aa92ae880485b34'), (
('a746273228122f381c3b46e4f1', '9b0207902f9932f7a85c24722e93e31f6ed2c75c406509aa0f2f6d1cab046ce4'), "c6f50bb74e29",
('3c5871cd619c69a63b540eb5a625', '258020d5b04a814f2b72c1c661e1f5a5c395d9799e5eee8b8519cf7300e90cb1'), "637923bd29a35aa3ecbbd2a50549fc32c14cf0fdcaf41c3194dd7414fd224815",
('fa22874bcc068879e8ef11a69f0722', '4adae3b55baa907fefc253365fdd99d8398befd0551ed6bf9a2a2784d3c304d1'), ),
('52a608ab21ccdd8a4457a57ede782176', '6dd10d772f8d5b4a96c3c5d30878cd9a1073fa835bfe6d2b924fa64a1fab1711'), (
('82e192e4043ddcd12ecf52969d0f807eed', '0b8741ddf2259d3af2901eb1ae354f22836442c965556f5c1eb89501191cb46a'), "119713cc83eeef",
('75683dcb556140c522543bb6e9098b21a21e', 'f48a754ca8193a82643150ab94038b5dd170b4ebd1e0751b78cfb0a98fa5076a'), "70c092fd5c8c21e9ef4bbc82a5c7819e262a530a748caf285ff0cba891954f1e",
('06e4efe45035e61faaf4287b4d8d1f12ca97e5', '5698409ab856b74d9fa5e9b259dfa46001f89041752da424e56e491577b88c86'), ),
(
"4a4f202484512526",
"fdf092993edbb7a0dc7ca67f04051bbd14481639da0808947aff8bfab5abed4b",
),
(
"1f66ab4185ed9b6375",
"6f6fc234bf35beae1a366c44c520c59ad5aa70351b5f5085e21e1fe2bfcee709",
),
(
"eed7422227613b6f53c9",
"4fdaf89e2a0e78c000061b59455e0ea93a4445b440e7562c8f0cfa165c93de2e",
),
(
"eaeed5cdffd89dece455f1",
"d6b780eee9c811f664393dc2c58b5a68c92b3c9fe9ceb70371d33ece63b5787e",
),
(
"5be43c90f22902e4fe8ed2d3",
"d0015071d3e7ed048c764850d76406eceae52b8e2e6e5a2c3aa92ae880485b34",
),
(
"a746273228122f381c3b46e4f1",
"9b0207902f9932f7a85c24722e93e31f6ed2c75c406509aa0f2f6d1cab046ce4",
),
(
"3c5871cd619c69a63b540eb5a625",
"258020d5b04a814f2b72c1c661e1f5a5c395d9799e5eee8b8519cf7300e90cb1",
),
(
"fa22874bcc068879e8ef11a69f0722",
"4adae3b55baa907fefc253365fdd99d8398befd0551ed6bf9a2a2784d3c304d1",
),
(
"52a608ab21ccdd8a4457a57ede782176",
"6dd10d772f8d5b4a96c3c5d30878cd9a1073fa835bfe6d2b924fa64a1fab1711",
),
(
"82e192e4043ddcd12ecf52969d0f807eed",
"0b8741ddf2259d3af2901eb1ae354f22836442c965556f5c1eb89501191cb46a",
),
(
"75683dcb556140c522543bb6e9098b21a21e",
"f48a754ca8193a82643150ab94038b5dd170b4ebd1e0751b78cfb0a98fa5076a",
),
(
"06e4efe45035e61faaf4287b4d8d1f12ca97e5",
"5698409ab856b74d9fa5e9b259dfa46001f89041752da424e56e491577b88c86",
),
] ]
def test_digest(self): def test_digest(self):
@ -50,5 +98,5 @@ class TestCryptoBlake256(unittest.TestCase):
self.assertEqual(d0, d2) self.assertEqual(d0, d2)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -7,34 +7,88 @@ class TestCryptoBlake2b(unittest.TestCase):
# vectors from https://raw.githubusercontent.com/BLAKE2/BLAKE2/master/testvectors/blake2b-kat.txt # vectors from https://raw.githubusercontent.com/BLAKE2/BLAKE2/master/testvectors/blake2b-kat.txt
vectors = [ vectors = [
('', '10ebb67700b1868efb4417987acf4690ae9d972fb7a590c2f02871799aaa4786b5e996e8f0f4eb981fc214b005f42d2ff4233499391653df7aefcbc13fc51568'), (
('00', '961f6dd1e4dd30f63901690c512e78e4b45e4742ed197c3c5e45c549fd25f2e4187b0bc9fe30492b16b0d0bc4ef9b0f34c7003fac09a5ef1532e69430234cebd'), "",
('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e', 'eba51acffb4cea31db4b8d87e9bf7dd48fe97b0253ae67aa580f9ac4a9d941f2bea518ee286818cc9f633f2a3b9fb68e594b48cdd6d515bf1d52ba6c85a203a7'), "10ebb67700b1868efb4417987acf4690ae9d972fb7a590c2f02871799aaa4786b5e996e8f0f4eb981fc214b005f42d2ff4233499391653df7aefcbc13fc51568",
('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20', '5595e05c13a7ec4dc8f41fb70cb50a71bce17c024ff6de7af618d0cc4e9c32d9570d6d3ea45b86525491030c0d8f2b1836d5778c1ce735c17707df364d054347'), ),
('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041', 'c516541701863f91005f314108ceece3c643e04fc8c42fd2ff556220e616aaa6a48aeb97a84bad74782e8dff96a1a2fa949339d722edcaa32b57067041df88cc'), (
('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60', '31fc79738b8772b3f55cd8178813b3b52d0db5a419d30ba9495c4b9da0219fac6df8e7c23a811551a62b827f256ecdb8124ac8a6792ccfecc3b3012722e94463'), "00",
"961f6dd1e4dd30f63901690c512e78e4b45e4742ed197c3c5e45c549fd25f2e4187b0bc9fe30492b16b0d0bc4ef9b0f34c7003fac09a5ef1532e69430234cebd",
),
(
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e",
"eba51acffb4cea31db4b8d87e9bf7dd48fe97b0253ae67aa580f9ac4a9d941f2bea518ee286818cc9f633f2a3b9fb68e594b48cdd6d515bf1d52ba6c85a203a7",
),
(
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20",
"5595e05c13a7ec4dc8f41fb70cb50a71bce17c024ff6de7af618d0cc4e9c32d9570d6d3ea45b86525491030c0d8f2b1836d5778c1ce735c17707df364d054347",
),
(
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041",
"c516541701863f91005f314108ceece3c643e04fc8c42fd2ff556220e616aaa6a48aeb97a84bad74782e8dff96a1a2fa949339d722edcaa32b57067041df88cc",
),
(
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60",
"31fc79738b8772b3f55cd8178813b3b52d0db5a419d30ba9495c4b9da0219fac6df8e7c23a811551a62b827f256ecdb8124ac8a6792ccfecc3b3012722e94463",
),
] ]
def test_digest(self): def test_digest(self):
key = unhexlify('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f') key = unhexlify(
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f"
)
for d, h in self.vectors: for d, h in self.vectors:
self.assertEqual(hashlib.blake2b(data=unhexlify(d), key=key).digest(), unhexlify(h)) self.assertEqual(
hashlib.blake2b(data=unhexlify(d), key=key).digest(), unhexlify(h)
)
def test_update(self): def test_update(self):
key = unhexlify('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f') key = unhexlify(
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f"
)
x = hashlib.blake2b(key=key) x = hashlib.blake2b(key=key)
x.update(bytes(range(10))) x.update(bytes(range(10)))
self.assertEqual(x.digest(), unhexlify('4fe181f54ad63a2983feaaf77d1e7235c2beb17fa328b6d9505bda327df19fc37f02c4b6f0368ce23147313a8e5738b5fa2a95b29de1c7f8264eb77b69f585cd')) self.assertEqual(
x.digest(),
unhexlify(
"4fe181f54ad63a2983feaaf77d1e7235c2beb17fa328b6d9505bda327df19fc37f02c4b6f0368ce23147313a8e5738b5fa2a95b29de1c7f8264eb77b69f585cd"
),
)
x.update(bytes(range(10, 30))) x.update(bytes(range(10, 30)))
self.assertEqual(x.digest(), unhexlify('c6dbc61dec6eaeac81e3d5f755203c8e220551534a0b2fd105a91889945a638550204f44093dd998c076205dffad703a0e5cd3c7f438a7e634cd59fededb539e')) self.assertEqual(
x.digest(),
unhexlify(
"c6dbc61dec6eaeac81e3d5f755203c8e220551534a0b2fd105a91889945a638550204f44093dd998c076205dffad703a0e5cd3c7f438a7e634cd59fededb539e"
),
)
x.update(bytes(range(30, 80))) x.update(bytes(range(30, 80)))
self.assertEqual(x.digest(), unhexlify('fa1549c9796cd4d303dcf452c1fbd5744fd9b9b47003d920b92de34839d07ef2a29ded68f6fc9e6c45e071a2e48bd50c5084e96b657dd0404045a1ddefe282ed')) self.assertEqual(
x.digest(),
unhexlify(
"fa1549c9796cd4d303dcf452c1fbd5744fd9b9b47003d920b92de34839d07ef2a29ded68f6fc9e6c45e071a2e48bd50c5084e96b657dd0404045a1ddefe282ed"
),
)
x.update(bytes(range(80, 111))) x.update(bytes(range(80, 111)))
self.assertEqual(x.digest(), unhexlify('2620f687e8625f6a412460b42e2cef67634208ce10a0cbd4dff7044a41b7880077e9f8dc3b8d1216d3376a21e015b58fb279b521d83f9388c7382c8505590b9b')) self.assertEqual(
x.digest(),
unhexlify(
"2620f687e8625f6a412460b42e2cef67634208ce10a0cbd4dff7044a41b7880077e9f8dc3b8d1216d3376a21e015b58fb279b521d83f9388c7382c8505590b9b"
),
)
x.update(bytes(range(111, 127))) x.update(bytes(range(111, 127)))
self.assertEqual(x.digest(), unhexlify('76d2d819c92bce55fa8e092ab1bf9b9eab237a25267986cacf2b8ee14d214d730dc9a5aa2d7b596e86a1fd8fa0804c77402d2fcd45083688b218b1cdfa0dcbcb')) self.assertEqual(
x.digest(),
unhexlify(
"76d2d819c92bce55fa8e092ab1bf9b9eab237a25267986cacf2b8ee14d214d730dc9a5aa2d7b596e86a1fd8fa0804c77402d2fcd45083688b218b1cdfa0dcbcb"
),
)
x.update(bytes(range(127, 255))) x.update(bytes(range(127, 255)))
self.assertEqual(x.digest(), unhexlify('142709d62e28fcccd0af97fad0f8465b971e82201dc51070faa0372aa43e92484be1c1e73ba10906d5d1853db6a4106e0a7bf9800d373d6dee2d46d62ef2a461')) self.assertEqual(
x.digest(),
unhexlify(
"142709d62e28fcccd0af97fad0f8465b971e82201dc51070faa0372aa43e92484be1c1e73ba10906d5d1853db6a4106e0a7bf9800d373d6dee2d46d62ef2a461"
),
)
def test_digest_multi(self): def test_digest_multi(self):
x = hashlib.blake2b() x = hashlib.blake2b()
@ -45,5 +99,5 @@ class TestCryptoBlake2b(unittest.TestCase):
self.assertEqual(d0, d2) self.assertEqual(d0, d2)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -8,34 +8,82 @@ class TestCryptoBlake2s(unittest.TestCase):
# vectors from https://raw.githubusercontent.com/BLAKE2/BLAKE2/master/testvectors/blake2s-kat.txt # vectors from https://raw.githubusercontent.com/BLAKE2/BLAKE2/master/testvectors/blake2s-kat.txt
vectors = [ vectors = [
('', '48a8997da407876b3d79c0d92325ad3b89cbb754d86ab71aee047ad345fd2c49'), ("", "48a8997da407876b3d79c0d92325ad3b89cbb754d86ab71aee047ad345fd2c49"),
('00', '40d15fee7c328830166ac3f918650f807e7e01e177258cdc0a39b11f598066f1'), ("00", "40d15fee7c328830166ac3f918650f807e7e01e177258cdc0a39b11f598066f1"),
('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e', 'b6156f72d380ee9ea6acd190464f2307a5c179ef01fd71f99f2d0f7a57360aea'), (
('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20', '2c3e08176f760c6264c3a2cd66fec6c3d78de43fc192457b2a4a660a1e0eb22b'), "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e",
('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041', '2ef73f3c26f12d93889f3c78b6a66c1d52b649dc9e856e2c172ea7c58ac2b5e3'), "b6156f72d380ee9ea6acd190464f2307a5c179ef01fd71f99f2d0f7a57360aea",
('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60', '288c4ad9b9409762ea07c24a41f04f69a7d74bee2d95435374bde946d7241c7b'), ),
(
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20",
"2c3e08176f760c6264c3a2cd66fec6c3d78de43fc192457b2a4a660a1e0eb22b",
),
(
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041",
"2ef73f3c26f12d93889f3c78b6a66c1d52b649dc9e856e2c172ea7c58ac2b5e3",
),
(
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60",
"288c4ad9b9409762ea07c24a41f04f69a7d74bee2d95435374bde946d7241c7b",
),
] ]
def test_digest(self): def test_digest(self):
key = unhexlify('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f') key = unhexlify(
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"
)
for d, h in self.vectors: for d, h in self.vectors:
self.assertEqual(hashlib.blake2s(unhexlify(d), key=key).digest(), unhexlify(h)) self.assertEqual(
hashlib.blake2s(unhexlify(d), key=key).digest(), unhexlify(h)
)
def test_update(self): def test_update(self):
key = unhexlify('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f') key = unhexlify(
x = hashlib.blake2s(b'', key=key) "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"
)
x = hashlib.blake2s(b"", key=key)
x.update(bytes(range(10))) x.update(bytes(range(10)))
self.assertEqual(x.digest(), unhexlify('f5c4b2ba1a00781b13aba0425242c69cb1552f3f71a9a3bb22b4a6b4277b46dd')) self.assertEqual(
x.digest(),
unhexlify(
"f5c4b2ba1a00781b13aba0425242c69cb1552f3f71a9a3bb22b4a6b4277b46dd"
),
)
x.update(bytes(range(10, 30))) x.update(bytes(range(10, 30)))
self.assertEqual(x.digest(), unhexlify('3ca989de10cfe609909472c8d35610805b2f977734cf652cc64b3bfc882d5d89')) self.assertEqual(
x.digest(),
unhexlify(
"3ca989de10cfe609909472c8d35610805b2f977734cf652cc64b3bfc882d5d89"
),
)
x.update(bytes(range(30, 80))) x.update(bytes(range(30, 80)))
self.assertEqual(x.digest(), unhexlify('30f3548370cfdceda5c37b569b6175e799eef1a62aaa943245ae7669c227a7b5')) self.assertEqual(
x.digest(),
unhexlify(
"30f3548370cfdceda5c37b569b6175e799eef1a62aaa943245ae7669c227a7b5"
),
)
x.update(bytes(range(80, 111))) x.update(bytes(range(80, 111)))
self.assertEqual(x.digest(), unhexlify('9fe03bbe69ab1834f5219b0da88a08b30a66c5913f0151963c360560db0387b3')) self.assertEqual(
x.digest(),
unhexlify(
"9fe03bbe69ab1834f5219b0da88a08b30a66c5913f0151963c360560db0387b3"
),
)
x.update(bytes(range(111, 127))) x.update(bytes(range(111, 127)))
self.assertEqual(x.digest(), unhexlify('ddbfea75cc467882eb3483ce5e2e756a4f4701b76b445519e89f22d60fa86e06')) self.assertEqual(
x.digest(),
unhexlify(
"ddbfea75cc467882eb3483ce5e2e756a4f4701b76b445519e89f22d60fa86e06"
),
)
x.update(bytes(range(127, 255))) x.update(bytes(range(127, 255)))
self.assertEqual(x.digest(), unhexlify('3fb735061abc519dfe979e54c1ee5bfad0a9d858b3315bad34bde999efd724dd')) self.assertEqual(
x.digest(),
unhexlify(
"3fb735061abc519dfe979e54c1ee5bfad0a9d858b3315bad34bde999efd724dd"
),
)
def test_digest_multi(self): def test_digest_multi(self):
x = hashlib.blake2s() x = hashlib.blake2s()
@ -46,5 +94,5 @@ class TestCryptoBlake2s(unittest.TestCase):
self.assertEqual(d0, d2) self.assertEqual(d0, d2)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -7,20 +7,48 @@ class TestCryptoGroestl512(unittest.TestCase):
# vectors from www.groestl.info/Groestl.zip #/KAT_MCT/* # vectors from www.groestl.info/Groestl.zip #/KAT_MCT/*
vectors = [ vectors = [
(b'', '6D3AD29D279110EEF3ADBD66DE2A0345A77BAEDE1557F5D099FCE0C03D6DC2BA8E6D4A6633DFBD66053C20FAA87D1A11F39A7FBE4A6C2F009801370308FC4AD8'), (
(unhexlify('C1ECFDFC'), '4726D760203C1EAF847F6837C74C16ADCEF5B55EAD5768A7C13E21A33D0D7B740F52DE8C81356DA63DABA791DA6680AF015DEB81246550201F232822BB087CE5'), b"",
(unhexlify('82E192E4043DDCD12ECF52969D0F807EED'), "6D3AD29D279110EEF3ADBD66DE2A0345A77BAEDE1557F5D099FCE0C03D6DC2BA8E6D4A6633DFBD66053C20FAA87D1A11F39A7FBE4A6C2F009801370308FC4AD8",
'8CD831960FE9726055F7B3693CC5639DB7D01EDDA045AE41E877853111C4CF53D26D5B4E135118571721C247ACA6607979A4DF73849D1477365F7DB0149FBC9F'), ),
(unhexlify('F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB38467205F5DCFB34A2ACFE96C0'), (
'CE24486770D443B423274DD30AF746EA4080065393D13DF0535709E260CF14B033CCD190A9FA5F81705178EB656031A6F1465A5A993BE62BE8D43931950BD5DB'), unhexlify("C1ECFDFC"),
(unhexlify('2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C14129BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CAE275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF28198E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817'), "4726D760203C1EAF847F6837C74C16ADCEF5B55EAD5768A7C13E21A33D0D7B740F52DE8C81356DA63DABA791DA6680AF015DEB81246550201F232822BB087CE5",
'FF410B511135DBC0B8644C28EFA3EC632326FEB98E50EDC6390C441610D7C514ACDF0A61A0BF01AA9DC1F55D92E085248EBA1C24EE23978B4986AF41C13A6176'), ),
(unhexlify('EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89BF3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA21401E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F231590BF2C4062FD2AD58F906A2D0D'), (
'3AE2AABD659C5844C923FD171CA36431A7E606ECA52A21B96A0F5E8CD1FA24141BEDAADF58608781DFABC103FE929CD2EADE8D6FBD6185D4F4B855DCA610D7A0'), unhexlify("82E192E4043DDCD12ECF52969D0F807EED"),
(unhexlify('724627916C50338643E6996F07877EAFD96BDF01DA7E991D4155B9BE1295EA7D21C9391F4C4A41C75F77E5D27389253393725F1427F57914B273AB862B9E31DABCE506E558720520D33352D119F699E784F9E548FF91BC35CA147042128709820D69A8287EA3257857615EB0321270E94B84F446942765CE882B191FAEE7E1C87E0F0BD4E0CD8A927703524B559B769CA4ECE1F6DBF313FDCF67C572EC4185C1A88E86EC11B6454B371980020F19633B6B95BD280E4FBCB0161E1A82470320CEC6ECFA25AC73D09F1536F286D3F9DACAFB2CD1D0CE72D64D197F5C7520B3CCB2FD74EB72664BA93853EF41EABF52F015DD591500D018DD162815CC993595B195'), "8CD831960FE9726055F7B3693CC5639DB7D01EDDA045AE41E877853111C4CF53D26D5B4E135118571721C247ACA6607979A4DF73849D1477365F7DB0149FBC9F",
'F88E8E86FBE2200E90226A181E48348E06D1643270C079B8BDD3660E8D21CD0493C55051CBFA607B1CFACA2C5A2C9354CDD405C1D3AD1D8435B825884CC0559F'), ),
(unhexlify('D0FF6E045F4B636F75A389799F314066644854821B6E7AE4047ADFDE2D0C0E02C250F0BE582BEC94011189B964A8AF430F5921ED9D9F4446E4C788515B89CA69E5F7CDFCCC9E83E8F9460145B43DDC41C07CC512B7E6FDD0E1E7AABA29A6C016CCB7BD54B145F3951EAB9BC4908F623E5A9B0C5B36056292540B79FD15C53457DC74A65FD773A34D6B313A056F79BC29A3FAC15F6A1446BFAEEAAFBAC8ECF8168DDE5F6AE6B6E579BD3CE74E7ABFADF361D0FD32D56586A8D2D4FF4CFDF8A750FAFDE4C2E9EB32B06847FA30B13CC273532D1A23C8257F80C60B8FA94FA976F534145CD61C41C0A511B62CADD5848CEFF643F83CE43F8E6969C5A559AFAD60E310599A34B2E5E029FBDDF2988FCE59269C7128A1FC79A74B154D8AA2850DCFDBF594684E74099E37882B440367C1DD3003F61CAFB46AC75D30E677AF54559A5DAB70C506CF61A9C35E0E56E1430746916DDEEC8D89B0C10DAA02C5D7E9F42621D2B312EAFFC9FF306297952A32D26C2148570AEC90501CA739CE5E689E7066D9580A4FC25E2023897C74C6856273133E1275A0D275DC5B75DB724CD12C9C01BB95AB5A227B7850020630506096878D289923177183EA9282A4C78EC212D2E898CB99D81A3364DF20927EE34D4475A5CF5CDB24088ED75B60201922E9C972D8556CA75F8274D15F3FB88A6B42C766DEF6B21329DEE7C457446DDE8C26405FE5D0309A04229F449E8490CF9000EE8DF400CB7C7EE831BD7059D24088FB42D61681CDE45050FCA78FF64D9C8D1F58B55F802FA5D2F2E723F3E4EED4338B060D31C8ACC46D26870BD45D0DE0798D48E32AAD1A6D4322E69F5E72309B9D7FA1F24BB1D63FF09ED47391C232497BF222C542A70975C8292D275197A4CA'), (
'27AB9EA01D8FD80ED14990761ED6BC329DC842770F83FDD1CE95C0A074D6D7495C7C85297CC73F3A695377E4211F897F68C1A7F910F6BF440264FB63F120ABA2'), unhexlify(
"F5961DFD2B1FFFFDA4FFBF30560C165BFEDAB8CE0BE525845DEB8DC61004B7DB38467205F5DCFB34A2ACFE96C0"
),
"CE24486770D443B423274DD30AF746EA4080065393D13DF0535709E260CF14B033CCD190A9FA5F81705178EB656031A6F1465A5A993BE62BE8D43931950BD5DB",
),
(
unhexlify(
"2B6DB7CED8665EBE9DEB080295218426BDAA7C6DA9ADD2088932CDFFBAA1C14129BCCDD70F369EFB149285858D2B1D155D14DE2FDB680A8B027284055182A0CAE275234CC9C92863C1B4AB66F304CF0621CD54565F5BFF461D3B461BD40DF28198E3732501B4860EADD503D26D6E69338F4E0456E9E9BAF3D827AE685FB1D817"
),
"FF410B511135DBC0B8644C28EFA3EC632326FEB98E50EDC6390C441610D7C514ACDF0A61A0BF01AA9DC1F55D92E085248EBA1C24EE23978B4986AF41C13A6176",
),
(
unhexlify(
"EECBB8FDFA4DA62170FD06727F697D81F83F601FF61E478105D3CB7502F2C89BF3E8F56EDD469D049807A38882A7EEFBC85FC9A950952E9FA84B8AFEBD3CE782D4DA598002827B1EB98882EA1F0A8F7AA9CE013A6E9BC462FB66C8D4A18DA21401E1B93356EB12F3725B6DB1684F2300A98B9A119E5D27FF704AFFB618E12708E77E6E5F34139A5A41131FD1D6336C272A8FC37080F041C71341BEE6AB550CB4A20A6DDB6A8E0299F2B14BC730C54B8B1C1C487B494BDCCFD3A53535AB2F231590BF2C4062FD2AD58F906A2D0D"
),
"3AE2AABD659C5844C923FD171CA36431A7E606ECA52A21B96A0F5E8CD1FA24141BEDAADF58608781DFABC103FE929CD2EADE8D6FBD6185D4F4B855DCA610D7A0",
),
(
unhexlify(
"724627916C50338643E6996F07877EAFD96BDF01DA7E991D4155B9BE1295EA7D21C9391F4C4A41C75F77E5D27389253393725F1427F57914B273AB862B9E31DABCE506E558720520D33352D119F699E784F9E548FF91BC35CA147042128709820D69A8287EA3257857615EB0321270E94B84F446942765CE882B191FAEE7E1C87E0F0BD4E0CD8A927703524B559B769CA4ECE1F6DBF313FDCF67C572EC4185C1A88E86EC11B6454B371980020F19633B6B95BD280E4FBCB0161E1A82470320CEC6ECFA25AC73D09F1536F286D3F9DACAFB2CD1D0CE72D64D197F5C7520B3CCB2FD74EB72664BA93853EF41EABF52F015DD591500D018DD162815CC993595B195"
),
"F88E8E86FBE2200E90226A181E48348E06D1643270C079B8BDD3660E8D21CD0493C55051CBFA607B1CFACA2C5A2C9354CDD405C1D3AD1D8435B825884CC0559F",
),
(
unhexlify(
"D0FF6E045F4B636F75A389799F314066644854821B6E7AE4047ADFDE2D0C0E02C250F0BE582BEC94011189B964A8AF430F5921ED9D9F4446E4C788515B89CA69E5F7CDFCCC9E83E8F9460145B43DDC41C07CC512B7E6FDD0E1E7AABA29A6C016CCB7BD54B145F3951EAB9BC4908F623E5A9B0C5B36056292540B79FD15C53457DC74A65FD773A34D6B313A056F79BC29A3FAC15F6A1446BFAEEAAFBAC8ECF8168DDE5F6AE6B6E579BD3CE74E7ABFADF361D0FD32D56586A8D2D4FF4CFDF8A750FAFDE4C2E9EB32B06847FA30B13CC273532D1A23C8257F80C60B8FA94FA976F534145CD61C41C0A511B62CADD5848CEFF643F83CE43F8E6969C5A559AFAD60E310599A34B2E5E029FBDDF2988FCE59269C7128A1FC79A74B154D8AA2850DCFDBF594684E74099E37882B440367C1DD3003F61CAFB46AC75D30E677AF54559A5DAB70C506CF61A9C35E0E56E1430746916DDEEC8D89B0C10DAA02C5D7E9F42621D2B312EAFFC9FF306297952A32D26C2148570AEC90501CA739CE5E689E7066D9580A4FC25E2023897C74C6856273133E1275A0D275DC5B75DB724CD12C9C01BB95AB5A227B7850020630506096878D289923177183EA9282A4C78EC212D2E898CB99D81A3364DF20927EE34D4475A5CF5CDB24088ED75B60201922E9C972D8556CA75F8274D15F3FB88A6B42C766DEF6B21329DEE7C457446DDE8C26405FE5D0309A04229F449E8490CF9000EE8DF400CB7C7EE831BD7059D24088FB42D61681CDE45050FCA78FF64D9C8D1F58B55F802FA5D2F2E723F3E4EED4338B060D31C8ACC46D26870BD45D0DE0798D48E32AAD1A6D4322E69F5E72309B9D7FA1F24BB1D63FF09ED47391C232497BF222C542A70975C8292D275197A4CA"
),
"27AB9EA01D8FD80ED14990761ED6BC329DC842770F83FDD1CE95C0A074D6D7495C7C85297CC73F3A695377E4211F897F68C1A7F910F6BF440264FB63F120ABA2",
),
] ]
def test_digest(self): def test_digest(self):
@ -34,12 +62,12 @@ class TestCryptoGroestl512(unittest.TestCase):
self.assertEqual(x.digest(), unhexlify(d)) self.assertEqual(x.digest(), unhexlify(d))
# Test from ExtremelyLongMsgKAT_512.txt, disabled by default because it resource-expensive # Test from ExtremelyLongMsgKAT_512.txt, disabled by default because it resource-expensive
''' """
x = hashlib.groestl512() x = hashlib.groestl512()
for i in range(16777216): for i in range(16777216):
x.update(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno') x.update(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno')
self.assertEqual(x.digest(), unhexlify('787C88460E5D09ABD7A98C050F3422BBFDBD36A74B05DE04B57A13FA3F36A570B8561580AB9DA4096CCD5111B5DE948F769D9D61833A6CE2B2F223061E688994')) self.assertEqual(x.digest(), unhexlify('787C88460E5D09ABD7A98C050F3422BBFDBD36A74B05DE04B57A13FA3F36A570B8561580AB9DA4096CCD5111B5DE948F769D9D61833A6CE2B2F223061E688994'))
''' """
def test_digest_multi(self): def test_digest_multi(self):
x = hashlib.groestl512() x = hashlib.groestl512()
@ -50,5 +78,5 @@ class TestCryptoGroestl512(unittest.TestCase):
self.assertEqual(d0, d2) self.assertEqual(d0, d2)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -7,14 +7,23 @@ class TestCryptoRipemd160(unittest.TestCase):
# vectors from http://homes.esat.kuleuven.be/~bosselae/ripemd160.html # vectors from http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
vectors = [ vectors = [
(b'', '9c1185a5c5e9fc54612808977ee8f548b2258d31'), (b"", "9c1185a5c5e9fc54612808977ee8f548b2258d31"),
(b'a', '0bdc9d2d256b3ee9daae347be6f4dc835a467ffe'), (b"a", "0bdc9d2d256b3ee9daae347be6f4dc835a467ffe"),
(b'abc', '8eb208f7e05d987a9b044a8e98c6b087f15a0bfc'), (b"abc", "8eb208f7e05d987a9b044a8e98c6b087f15a0bfc"),
(b'message digest', '5d0689ef49d2fae572b881b123a85ffa21595f36'), (b"message digest", "5d0689ef49d2fae572b881b123a85ffa21595f36"),
(b'abcdefghijklmnopqrstuvwxyz', 'f71c27109c692c1b56bbdceb5b9d2865b3708dbc'), (b"abcdefghijklmnopqrstuvwxyz", "f71c27109c692c1b56bbdceb5b9d2865b3708dbc"),
(b'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq', '12a053384a9c0c88e405a06c27dcf49ada62eb2b'), (
(b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'b0e20b6e3116640286ed3a87a5713079b21f5189'), b"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
(b'12345678901234567890123456789012345678901234567890123456789012345678901234567890', '9b752e45573d4b39f4dbd3323cab82bf63326bfb'), "12a053384a9c0c88e405a06c27dcf49ada62eb2b",
),
(
b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
"b0e20b6e3116640286ed3a87a5713079b21f5189",
),
(
b"12345678901234567890123456789012345678901234567890123456789012345678901234567890",
"9b752e45573d4b39f4dbd3323cab82bf63326bfb",
),
] ]
def test_digest(self): def test_digest(self):
@ -29,8 +38,10 @@ class TestCryptoRipemd160(unittest.TestCase):
x = hashlib.ripemd160() x = hashlib.ripemd160()
for i in range(8): for i in range(8):
x.update(b'1234567890') x.update(b"1234567890")
self.assertEqual(x.digest(), unhexlify('9b752e45573d4b39f4dbd3323cab82bf63326bfb')) self.assertEqual(
x.digest(), unhexlify("9b752e45573d4b39f4dbd3323cab82bf63326bfb")
)
def test_digest_multi(self): def test_digest_multi(self):
x = hashlib.ripemd160() x = hashlib.ripemd160()
@ -41,5 +52,5 @@ class TestCryptoRipemd160(unittest.TestCase):
self.assertEqual(d0, d2) self.assertEqual(d0, d2)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -7,10 +7,16 @@ class TestCryptoSha1(unittest.TestCase):
# vectors from https://www.di-mgt.com.au/sha_testvectors.html # vectors from https://www.di-mgt.com.au/sha_testvectors.html
vectors = [ vectors = [
(b'', 'da39a3ee5e6b4b0d3255bfef95601890afd80709'), (b"", "da39a3ee5e6b4b0d3255bfef95601890afd80709"),
(b'abc', 'a9993e364706816aba3e25717850c26c9cd0d89d'), (b"abc", "a9993e364706816aba3e25717850c26c9cd0d89d"),
(b'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq', '84983e441c3bd26ebaae4aa1f95129e5e54670f1'), (
(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu', 'a49b2446a02c645bf419f995b67091253a04a259') b"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
"84983e441c3bd26ebaae4aa1f95129e5e54670f1",
),
(
b"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
"a49b2446a02c645bf419f995b67091253a04a259",
),
] ]
def test_digest(self): def test_digest(self):
@ -25,15 +31,17 @@ class TestCryptoSha1(unittest.TestCase):
x = hashlib.sha1() x = hashlib.sha1()
for i in range(1000000): for i in range(1000000):
x.update(b'a') x.update(b"a")
self.assertEqual(x.digest(), unhexlify('34aa973cd4c4daa4f61eeb2bdbad27316534016f')) self.assertEqual(
x.digest(), unhexlify("34aa973cd4c4daa4f61eeb2bdbad27316534016f")
)
''' """
x = hashlib.sha1() x = hashlib.sha1()
for i in range(16777216): for i in range(16777216):
x.update(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno') x.update(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno')
self.assertEqual(x.digest(), unhexlify('7789f0c9ef7bfc40d93311143dfbe69e2017f592')) self.assertEqual(x.digest(), unhexlify('7789f0c9ef7bfc40d93311143dfbe69e2017f592'))
''' """
def test_digest_multi(self): def test_digest_multi(self):
x = hashlib.sha1() x = hashlib.sha1()
@ -44,5 +52,5 @@ class TestCryptoSha1(unittest.TestCase):
self.assertEqual(d0, d2) self.assertEqual(d0, d2)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -7,10 +7,16 @@ class TestCryptoSha256(unittest.TestCase):
# vectors from http://www.di-mgt.com.au/sha_testvectors.html # vectors from http://www.di-mgt.com.au/sha_testvectors.html
vectors = [ vectors = [
(b'', 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'), (b"", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"),
(b'abc', 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad'), (b"abc", "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"),
(b'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq', '248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1'), (
(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu', 'cf5b16a778af8380036ce59e7b0492370b249b11e8f07a51afac45037afee9d1'), b"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
"248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1",
),
(
b"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
"cf5b16a778af8380036ce59e7b0492370b249b11e8f07a51afac45037afee9d1",
),
] ]
def test_digest(self): def test_digest(self):
@ -25,15 +31,20 @@ class TestCryptoSha256(unittest.TestCase):
x = hashlib.sha256() x = hashlib.sha256()
for i in range(1000000): for i in range(1000000):
x.update(b'a') x.update(b"a")
self.assertEqual(x.digest(), unhexlify('cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0')) self.assertEqual(
x.digest(),
unhexlify(
"cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0"
),
)
''' """
x = hashlib.sha256() x = hashlib.sha256()
for i in range(16777216): for i in range(16777216):
x.update(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno') x.update(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno')
self.assertEqual(x.digest(), unhexlify('50e72a0e26442fe2552dc3938ac58658228c0cbfb1d2ca872ae435266fcd055e')) self.assertEqual(x.digest(), unhexlify('50e72a0e26442fe2552dc3938ac58658228c0cbfb1d2ca872ae435266fcd055e'))
''' """
def test_digest_multi(self): def test_digest_multi(self):
x = hashlib.sha256() x = hashlib.sha256()
@ -44,5 +55,5 @@ class TestCryptoSha256(unittest.TestCase):
self.assertEqual(d0, d2) self.assertEqual(d0, d2)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -7,17 +7,29 @@ class TestCryptoSha3_256(unittest.TestCase):
# vectors from http://www.di-mgt.com.au/sha_testvectors.html # vectors from http://www.di-mgt.com.au/sha_testvectors.html
vectors = [ vectors = [
(b'', 'a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a'), (b"", "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a"),
(b'abc', '3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532'), (b"abc", "3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532"),
(b'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq', '41c0dba2a9d6240849100376a8235e2c82e1b9998a999e21db32dd97496d3376'), (
(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu', '916f6061fe879741ca6469b43971dfdb28b1a32dc36cb3254e812be27aad1d18'), b"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
"41c0dba2a9d6240849100376a8235e2c82e1b9998a999e21db32dd97496d3376",
),
(
b"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
"916f6061fe879741ca6469b43971dfdb28b1a32dc36cb3254e812be27aad1d18",
),
] ]
vectors_keccak = [ vectors_keccak = [
(b'', 'c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470'), (b"", "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"),
(b'abc', '4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45'), (b"abc", "4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45"),
(b'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq', '45d3b367a6904e6e8d502ee04999a7c27647f91fa845d456525fd352ae3d7371'), (
(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu', 'f519747ed599024f3882238e5ab43960132572b7345fbeb9a90769dafd21ad67'), b"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
"45d3b367a6904e6e8d502ee04999a7c27647f91fa845d456525fd352ae3d7371",
),
(
b"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
"f519747ed599024f3882238e5ab43960132572b7345fbeb9a90769dafd21ad67",
),
] ]
def test_digest(self): def test_digest(self):
@ -36,15 +48,20 @@ class TestCryptoSha3_256(unittest.TestCase):
x = hashlib.sha3_256() x = hashlib.sha3_256()
for i in range(1000000): for i in range(1000000):
x.update(b'a') x.update(b"a")
self.assertEqual(x.digest(), unhexlify('5c8875ae474a3634ba4fd55ec85bffd661f32aca75c6d699d0cdcb6c115891c1')) self.assertEqual(
x.digest(),
unhexlify(
"5c8875ae474a3634ba4fd55ec85bffd661f32aca75c6d699d0cdcb6c115891c1"
),
)
''' """
x = hashlib.sha3_256() x = hashlib.sha3_256()
for i in range(16777216): for i in range(16777216):
x.update(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno') x.update(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno')
self.assertEqual(x.digest(), unhexlify('ecbbc42cbf296603acb2c6bc0410ef4378bafb24b710357f12df607758b33e2b')) self.assertEqual(x.digest(), unhexlify('ecbbc42cbf296603acb2c6bc0410ef4378bafb24b710357f12df607758b33e2b'))
''' """
def test_update_keccak(self): def test_update_keccak(self):
for b, d in self.vectors_keccak: for b, d in self.vectors_keccak:
@ -69,5 +86,5 @@ class TestCryptoSha3_256(unittest.TestCase):
self.assertEqual(d0, d2) self.assertEqual(d0, d2)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -7,17 +7,41 @@ class TestCryptoSha3_512(unittest.TestCase):
# vectors from https://www.di-mgt.com.au/sha_testvectors.html # vectors from https://www.di-mgt.com.au/sha_testvectors.html
vectors = [ vectors = [
(b'', 'a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26'), (
(b'abc', 'b751850b1a57168a5693cd924b6b096e08f621827444f70d884f5d0240d2712e10e116e9192af3c91a7ec57647e3934057340b4cf408d5a56592f8274eec53f0'), b"",
(b'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq', '04a371e84ecfb5b8b77cb48610fca8182dd457ce6f326a0fd3d7ec2f1e91636dee691fbe0c985302ba1b0d8dc78c086346b533b49c030d99a27daf1139d6e75e'), "a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26",
(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu', 'afebb2ef542e6579c50cad06d2e578f9f8dd6881d7dc824d26360feebf18a4fa73e3261122948efcfd492e74e82e2189ed0fb440d187f382270cb455f21dd185'), ),
(
b"abc",
"b751850b1a57168a5693cd924b6b096e08f621827444f70d884f5d0240d2712e10e116e9192af3c91a7ec57647e3934057340b4cf408d5a56592f8274eec53f0",
),
(
b"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
"04a371e84ecfb5b8b77cb48610fca8182dd457ce6f326a0fd3d7ec2f1e91636dee691fbe0c985302ba1b0d8dc78c086346b533b49c030d99a27daf1139d6e75e",
),
(
b"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
"afebb2ef542e6579c50cad06d2e578f9f8dd6881d7dc824d26360feebf18a4fa73e3261122948efcfd492e74e82e2189ed0fb440d187f382270cb455f21dd185",
),
] ]
vectors_keccak = [ vectors_keccak = [
(b'', '0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e'), (
(b'abc', '18587dc2ea106b9a1563e32b3312421ca164c7f1f07bc922a9c83d77cea3a1e5d0c69910739025372dc14ac9642629379540c17e2a65b19d77aa511a9d00bb96'), b"",
(b'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq', '6aa6d3669597df6d5a007b00d09c20795b5c4218234e1698a944757a488ecdc09965435d97ca32c3cfed7201ff30e070cd947f1fc12b9d9214c467d342bcba5d'), "0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e",
(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu', 'ac2fb35251825d3aa48468a9948c0a91b8256f6d97d8fa4160faff2dd9dfcc24f3f1db7a983dad13d53439ccac0b37e24037e7b95f80f59f37a2f683c4ba4682'), ),
(
b"abc",
"18587dc2ea106b9a1563e32b3312421ca164c7f1f07bc922a9c83d77cea3a1e5d0c69910739025372dc14ac9642629379540c17e2a65b19d77aa511a9d00bb96",
),
(
b"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
"6aa6d3669597df6d5a007b00d09c20795b5c4218234e1698a944757a488ecdc09965435d97ca32c3cfed7201ff30e070cd947f1fc12b9d9214c467d342bcba5d",
),
(
b"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
"ac2fb35251825d3aa48468a9948c0a91b8256f6d97d8fa4160faff2dd9dfcc24f3f1db7a983dad13d53439ccac0b37e24037e7b95f80f59f37a2f683c4ba4682",
),
] ]
def test_digest(self): def test_digest(self):
@ -36,15 +60,20 @@ class TestCryptoSha3_512(unittest.TestCase):
x = hashlib.sha3_512() x = hashlib.sha3_512()
for i in range(1000000): for i in range(1000000):
x.update(b'a') x.update(b"a")
self.assertEqual(x.digest(), unhexlify('3c3a876da14034ab60627c077bb98f7e120a2a5370212dffb3385a18d4f38859ed311d0a9d5141ce9cc5c66ee689b266a8aa18ace8282a0e0db596c90b0a7b87')) self.assertEqual(
x.digest(),
unhexlify(
"3c3a876da14034ab60627c077bb98f7e120a2a5370212dffb3385a18d4f38859ed311d0a9d5141ce9cc5c66ee689b266a8aa18ace8282a0e0db596c90b0a7b87"
),
)
''' """
x = hashlib.sha3_512() x = hashlib.sha3_512()
for i in range(16777216): for i in range(16777216):
x.update(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno') x.update(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno')
self.assertEqual(x.digest(), unhexlify('235ffd53504ef836a1342b488f483b396eabbfe642cf78ee0d31feec788b23d0d18d5c339550dd5958a500d4b95363da1b5fa18affc1bab2292dc63b7d85097c')) self.assertEqual(x.digest(), unhexlify('235ffd53504ef836a1342b488f483b396eabbfe642cf78ee0d31feec788b23d0d18d5c339550dd5958a500d4b95363da1b5fa18affc1bab2292dc63b7d85097c'))
''' """
def test_update_keccak(self): def test_update_keccak(self):
for b, d in self.vectors_keccak: for b, d in self.vectors_keccak:
@ -69,5 +98,5 @@ class TestCryptoSha3_512(unittest.TestCase):
self.assertEqual(d0, d2) self.assertEqual(d0, d2)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -7,10 +7,22 @@ class TestCryptoSha512(unittest.TestCase):
# vectors from http://www.di-mgt.com.au/sha_testvectors.html # vectors from http://www.di-mgt.com.au/sha_testvectors.html
vectors = [ vectors = [
(b'', 'cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e'), (
(b'abc', 'ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f'), b"",
(b'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq', '204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445'), "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu', '8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909'), ),
(
b"abc",
"ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f",
),
(
b"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
"204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445",
),
(
b"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
"8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909",
),
] ]
def test_digest(self): def test_digest(self):
@ -25,15 +37,20 @@ class TestCryptoSha512(unittest.TestCase):
x = hashlib.sha512() x = hashlib.sha512()
for i in range(1000000): for i in range(1000000):
x.update(b'a') x.update(b"a")
self.assertEqual(x.digest(), unhexlify('e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b')) self.assertEqual(
x.digest(),
unhexlify(
"e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b"
),
)
''' """
x = hashlib.sha512() x = hashlib.sha512()
for i in range(16777216): for i in range(16777216):
x.update(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno') x.update(b'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno')
self.assertEqual(x.digest(), unhexlify('b47c933421ea2db149ad6e10fce6c7f93d0752380180ffd7f4629a712134831d77be6091b819ed352c2967a2e2d4fa5050723c9630691f1a05a7281dbe6c1086')) self.assertEqual(x.digest(), unhexlify('b47c933421ea2db149ad6e10fce6c7f93d0752380180ffd7f4629a712134831d77be6091b819ed352c2967a2e2d4fa5050723c9630691f1a05a7281dbe6c1086'))
''' """
def test_digest_multi(self): def test_digest_multi(self):
x = hashlib.sha512() x = hashlib.sha512()
@ -44,5 +61,5 @@ class TestCryptoSha512(unittest.TestCase):
self.assertEqual(d0, d2) self.assertEqual(d0, d2)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -10,67 +10,147 @@ class TestCryptoHmac(unittest.TestCase):
def test_digest(self): def test_digest(self):
# case 1 # case 1
key = b'\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b' key = b"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
msg = b'Hi There' msg = b"Hi There"
self.assertEqual(hmac(hmac.SHA256, key, msg).digest(), unhexlify('b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7')) self.assertEqual(
self.assertEqual(hmac(hmac.SHA512, key, msg).digest(), unhexlify('87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854')) hmac(hmac.SHA256, key, msg).digest(),
unhexlify(
"b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7"
),
)
self.assertEqual(
hmac(hmac.SHA512, key, msg).digest(),
unhexlify(
"87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854"
),
)
# case 2 # case 2
key = b'Jefe' key = b"Jefe"
msg = b'what do ya want for nothing?' msg = b"what do ya want for nothing?"
self.assertEqual(hmac(hmac.SHA256, key, msg).digest(), unhexlify('5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843')) self.assertEqual(
self.assertEqual(hmac(hmac.SHA512, key, msg).digest(), unhexlify('164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737')) hmac(hmac.SHA256, key, msg).digest(),
unhexlify(
"5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843"
),
)
self.assertEqual(
hmac(hmac.SHA512, key, msg).digest(),
unhexlify(
"164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737"
),
)
# case 3 # case 3
key = b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa' key = b"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
msg = b'\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd' msg = b"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
self.assertEqual(hmac(hmac.SHA256, key, msg).digest(), unhexlify('773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe')) self.assertEqual(
self.assertEqual(hmac(hmac.SHA512, key, msg).digest(), unhexlify('fa73b0089d56a284efb0f0756c890be9b1b5dbdd8ee81a3655f83e33b2279d39bf3e848279a722c806b485a47e67c807b946a337bee8942674278859e13292fb')) hmac(hmac.SHA256, key, msg).digest(),
unhexlify(
"773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe"
),
)
self.assertEqual(
hmac(hmac.SHA512, key, msg).digest(),
unhexlify(
"fa73b0089d56a284efb0f0756c890be9b1b5dbdd8ee81a3655f83e33b2279d39bf3e848279a722c806b485a47e67c807b946a337bee8942674278859e13292fb"
),
)
# case 4 # case 4
key = b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19' key = b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19"
msg = b'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd' msg = b"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
self.assertEqual(hmac(hmac.SHA256, key, msg).digest(), unhexlify('82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b')) self.assertEqual(
self.assertEqual(hmac(hmac.SHA512, key, msg).digest(), unhexlify('b0ba465637458c6990e5a8c5f61d4af7e576d97ff94b872de76f8050361ee3dba91ca5c11aa25eb4d679275cc5788063a5f19741120c4f2de2adebeb10a298dd')) hmac(hmac.SHA256, key, msg).digest(),
unhexlify(
"82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b"
),
)
self.assertEqual(
hmac(hmac.SHA512, key, msg).digest(),
unhexlify(
"b0ba465637458c6990e5a8c5f61d4af7e576d97ff94b872de76f8050361ee3dba91ca5c11aa25eb4d679275cc5788063a5f19741120c4f2de2adebeb10a298dd"
),
)
# case 6 # case 6
key = bytes([0xAA] * 131) key = bytes([0xAA] * 131)
msg = b'Test Using Larger Than Block-Size Key - Hash Key First' msg = b"Test Using Larger Than Block-Size Key - Hash Key First"
self.assertEqual(hmac(hmac.SHA256, key, msg).digest(), unhexlify('60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f0ee37f54')) self.assertEqual(
self.assertEqual(hmac(hmac.SHA512, key, msg).digest(), unhexlify('80b24263c7c1a3ebb71493c1dd7be8b49b46d1f41b4aeec1121b013783f8f3526b56d037e05f2598bd0fd2215d6a1e5295e64f73f63f0aec8b915a985d786598')) hmac(hmac.SHA256, key, msg).digest(),
unhexlify(
"60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f0ee37f54"
),
)
self.assertEqual(
hmac(hmac.SHA512, key, msg).digest(),
unhexlify(
"80b24263c7c1a3ebb71493c1dd7be8b49b46d1f41b4aeec1121b013783f8f3526b56d037e05f2598bd0fd2215d6a1e5295e64f73f63f0aec8b915a985d786598"
),
)
# case 7 # case 7
key = bytes([0xAA] * 131) key = bytes([0xAA] * 131)
msg = b'This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.' msg = b"This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm."
self.assertEqual(hmac(hmac.SHA256, key, msg).digest(), unhexlify('9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2')) self.assertEqual(
self.assertEqual(hmac(hmac.SHA512, key, msg).digest(), unhexlify('e37b6a775dc87dbaa4dfa9f96e5e3ffddebd71f8867289865df5a32d20cdc944b6022cac3c4982b10d5eeb55c3e4de15134676fb6de0446065c97440fa8c6a58')) hmac(hmac.SHA256, key, msg).digest(),
unhexlify(
"9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f51535c3a35e2"
),
)
self.assertEqual(
hmac(hmac.SHA512, key, msg).digest(),
unhexlify(
"e37b6a775dc87dbaa4dfa9f96e5e3ffddebd71f8867289865df5a32d20cdc944b6022cac3c4982b10d5eeb55c3e4de15134676fb6de0446065c97440fa8c6a58"
),
)
def test_update(self): def test_update(self):
# case 3 # case 3
key = b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa' key = b"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
x = hmac(hmac.SHA256, key) x = hmac(hmac.SHA256, key)
for i in range(50): for i in range(50):
x.update(b'\xdd') x.update(b"\xdd")
self.assertEqual(x.digest(), unhexlify('773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe')) self.assertEqual(
x.digest(),
unhexlify(
"773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514ced565fe"
),
)
x = hmac(hmac.SHA512, key) x = hmac(hmac.SHA512, key)
for i in range(50): for i in range(50):
x.update(b'\xdd') x.update(b"\xdd")
self.assertEqual(x.digest(), unhexlify('fa73b0089d56a284efb0f0756c890be9b1b5dbdd8ee81a3655f83e33b2279d39bf3e848279a722c806b485a47e67c807b946a337bee8942674278859e13292fb')) self.assertEqual(
x.digest(),
unhexlify(
"fa73b0089d56a284efb0f0756c890be9b1b5dbdd8ee81a3655f83e33b2279d39bf3e848279a722c806b485a47e67c807b946a337bee8942674278859e13292fb"
),
)
# case 4 # case 4
key = b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19' key = b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19"
x = hmac(hmac.SHA256, key) x = hmac(hmac.SHA256, key)
for i in range(50): for i in range(50):
x.update(b'\xcd') x.update(b"\xcd")
self.assertEqual(x.digest(), unhexlify('82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b')) self.assertEqual(
x.digest(),
unhexlify(
"82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff46729665b"
),
)
x = hmac(hmac.SHA512, key) x = hmac(hmac.SHA512, key)
for i in range(50): for i in range(50):
x.update(b'\xcd') x.update(b"\xcd")
self.assertEqual(x.digest(), unhexlify('b0ba465637458c6990e5a8c5f61d4af7e576d97ff94b872de76f8050361ee3dba91ca5c11aa25eb4d679275cc5788063a5f19741120c4f2de2adebeb10a298dd')) self.assertEqual(
x.digest(),
unhexlify(
"b0ba465637458c6990e5a8c5f61d4af7e576d97ff94b872de76f8050361ee3dba91ca5c11aa25eb4d679275cc5788063a5f19741120c4f2de2adebeb10a298dd"
),
)
def test_digest_multi(self): def test_digest_multi(self):
x = hmac(hmac.SHA256, b'') x = hmac(hmac.SHA256, b"")
d0 = x.digest() d0 = x.digest()
d1 = x.digest() d1 = x.digest()
d2 = x.digest() d2 = x.digest()
@ -78,5 +158,5 @@ class TestCryptoHmac(unittest.TestCase):
self.assertEqual(d0, d2) self.assertEqual(d0, d2)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -8,88 +8,168 @@ class TestCryptoPbkdf2(unittest.TestCase):
# vectors from https://stackoverflow.com/questions/5130513/pbkdf2-hmac-sha2-test-vectors # vectors from https://stackoverflow.com/questions/5130513/pbkdf2-hmac-sha2-test-vectors
def test_pbkdf2_hmac_sha256(self): def test_pbkdf2_hmac_sha256(self):
P = b'password' P = b"password"
S = b'salt' S = b"salt"
dk = pbkdf2(pbkdf2.HMAC_SHA256, P, S, 1).key() dk = pbkdf2(pbkdf2.HMAC_SHA256, P, S, 1).key()
self.assertEqual(dk, unhexlify('120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b')) self.assertEqual(
dk,
unhexlify(
"120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b"
),
)
dk = pbkdf2(pbkdf2.HMAC_SHA256, P, S, 2).key() dk = pbkdf2(pbkdf2.HMAC_SHA256, P, S, 2).key()
self.assertEqual(dk, unhexlify('ae4d0c95af6b46d32d0adff928f06dd02a303f8ef3c251dfd6e2d85a95474c43')) self.assertEqual(
dk,
unhexlify(
"ae4d0c95af6b46d32d0adff928f06dd02a303f8ef3c251dfd6e2d85a95474c43"
),
)
dk = pbkdf2(pbkdf2.HMAC_SHA256, P, S, 4096).key() dk = pbkdf2(pbkdf2.HMAC_SHA256, P, S, 4096).key()
self.assertEqual(dk, unhexlify('c5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134a')) self.assertEqual(
P = b'passwordPASSWORDpassword' dk,
S = b'saltSALTsaltSALTsaltSALTsaltSALTsalt' unhexlify(
"c5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134a"
),
)
P = b"passwordPASSWORDpassword"
S = b"saltSALTsaltSALTsaltSALTsaltSALTsalt"
dk = pbkdf2(pbkdf2.HMAC_SHA256, P, S, 4096).key() dk = pbkdf2(pbkdf2.HMAC_SHA256, P, S, 4096).key()
self.assertEqual(dk, unhexlify('348c89dbcbd32b2f32d814b8116e84cf2b17347ebc1800181c4e2a1fb8dd53e1')) self.assertEqual(
dk,
unhexlify(
"348c89dbcbd32b2f32d814b8116e84cf2b17347ebc1800181c4e2a1fb8dd53e1"
),
)
def test_pbkdf2_hmac_sha256_update(self): def test_pbkdf2_hmac_sha256_update(self):
P = b'password' P = b"password"
S = b'salt' S = b"salt"
p = pbkdf2(pbkdf2.HMAC_SHA256, P, S) p = pbkdf2(pbkdf2.HMAC_SHA256, P, S)
p.update(1) p.update(1)
dk = p.key() dk = p.key()
self.assertEqual(dk, unhexlify('120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b')) self.assertEqual(
dk,
unhexlify(
"120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b"
),
)
p = pbkdf2(pbkdf2.HMAC_SHA256, P, S) p = pbkdf2(pbkdf2.HMAC_SHA256, P, S)
p.update(1) p.update(1)
p.update(1) p.update(1)
dk = p.key() dk = p.key()
self.assertEqual(dk, unhexlify('ae4d0c95af6b46d32d0adff928f06dd02a303f8ef3c251dfd6e2d85a95474c43')) self.assertEqual(
dk,
unhexlify(
"ae4d0c95af6b46d32d0adff928f06dd02a303f8ef3c251dfd6e2d85a95474c43"
),
)
p = pbkdf2(pbkdf2.HMAC_SHA256, P, S) p = pbkdf2(pbkdf2.HMAC_SHA256, P, S)
for i in range(32): for i in range(32):
p.update(128) p.update(128)
dk = p.key() dk = p.key()
self.assertEqual(dk, unhexlify('c5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134a')) self.assertEqual(
P = b'passwordPASSWORDpassword' dk,
S = b'saltSALTsaltSALTsaltSALTsaltSALTsalt' unhexlify(
"c5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134a"
),
)
P = b"passwordPASSWORDpassword"
S = b"saltSALTsaltSALTsaltSALTsaltSALTsalt"
p = pbkdf2(pbkdf2.HMAC_SHA256, P, S) p = pbkdf2(pbkdf2.HMAC_SHA256, P, S)
for i in range(64): for i in range(64):
p.update(64) p.update(64)
dk = p.key() dk = p.key()
self.assertEqual(dk, unhexlify('348c89dbcbd32b2f32d814b8116e84cf2b17347ebc1800181c4e2a1fb8dd53e1')) self.assertEqual(
dk,
unhexlify(
"348c89dbcbd32b2f32d814b8116e84cf2b17347ebc1800181c4e2a1fb8dd53e1"
),
)
# vectors from https://stackoverflow.com/questions/15593184/pbkdf2-hmac-sha-512-test-vectors # vectors from https://stackoverflow.com/questions/15593184/pbkdf2-hmac-sha-512-test-vectors
def test_pbkdf2_hmac_sha512(self): def test_pbkdf2_hmac_sha512(self):
P = b'password' P = b"password"
S = b'salt' S = b"salt"
dk = pbkdf2(pbkdf2.HMAC_SHA512, P, S, 1).key() dk = pbkdf2(pbkdf2.HMAC_SHA512, P, S, 1).key()
self.assertEqual(dk, unhexlify('867f70cf1ade02cff3752599a3a53dc4af34c7a669815ae5d513554e1c8cf252c02d470a285a0501bad999bfe943c08f050235d7d68b1da55e63f73b60a57fce')) self.assertEqual(
dk,
unhexlify(
"867f70cf1ade02cff3752599a3a53dc4af34c7a669815ae5d513554e1c8cf252c02d470a285a0501bad999bfe943c08f050235d7d68b1da55e63f73b60a57fce"
),
)
dk = pbkdf2(pbkdf2.HMAC_SHA512, P, S, 2).key() dk = pbkdf2(pbkdf2.HMAC_SHA512, P, S, 2).key()
self.assertEqual(dk, unhexlify('e1d9c16aa681708a45f5c7c4e215ceb66e011a2e9f0040713f18aefdb866d53cf76cab2868a39b9f7840edce4fef5a82be67335c77a6068e04112754f27ccf4e')) self.assertEqual(
dk,
unhexlify(
"e1d9c16aa681708a45f5c7c4e215ceb66e011a2e9f0040713f18aefdb866d53cf76cab2868a39b9f7840edce4fef5a82be67335c77a6068e04112754f27ccf4e"
),
)
dk = pbkdf2(pbkdf2.HMAC_SHA512, P, S, 4096).key() dk = pbkdf2(pbkdf2.HMAC_SHA512, P, S, 4096).key()
self.assertEqual(dk, unhexlify('d197b1b33db0143e018b12f3d1d1479e6cdebdcc97c5c0f87f6902e072f457b5143f30602641b3d55cd335988cb36b84376060ecd532e039b742a239434af2d5')) self.assertEqual(
P = b'passwordPASSWORDpassword' dk,
S = b'saltSALTsaltSALTsaltSALTsaltSALTsalt' unhexlify(
"d197b1b33db0143e018b12f3d1d1479e6cdebdcc97c5c0f87f6902e072f457b5143f30602641b3d55cd335988cb36b84376060ecd532e039b742a239434af2d5"
),
)
P = b"passwordPASSWORDpassword"
S = b"saltSALTsaltSALTsaltSALTsaltSALTsalt"
dk = pbkdf2(pbkdf2.HMAC_SHA512, P, S, 4096).key() dk = pbkdf2(pbkdf2.HMAC_SHA512, P, S, 4096).key()
self.assertEqual(dk, unhexlify('8c0511f4c6e597c6ac6315d8f0362e225f3c501495ba23b868c005174dc4ee71115b59f9e60cd9532fa33e0f75aefe30225c583a186cd82bd4daea9724a3d3b8')) self.assertEqual(
dk,
unhexlify(
"8c0511f4c6e597c6ac6315d8f0362e225f3c501495ba23b868c005174dc4ee71115b59f9e60cd9532fa33e0f75aefe30225c583a186cd82bd4daea9724a3d3b8"
),
)
def test_pbkdf2_hmac_sha512_update(self): def test_pbkdf2_hmac_sha512_update(self):
P = b'password' P = b"password"
S = b'salt' S = b"salt"
p = pbkdf2(pbkdf2.HMAC_SHA512, P, S) p = pbkdf2(pbkdf2.HMAC_SHA512, P, S)
p.update(1) p.update(1)
dk = p.key() dk = p.key()
self.assertEqual(dk, unhexlify('867f70cf1ade02cff3752599a3a53dc4af34c7a669815ae5d513554e1c8cf252c02d470a285a0501bad999bfe943c08f050235d7d68b1da55e63f73b60a57fce')) self.assertEqual(
dk,
unhexlify(
"867f70cf1ade02cff3752599a3a53dc4af34c7a669815ae5d513554e1c8cf252c02d470a285a0501bad999bfe943c08f050235d7d68b1da55e63f73b60a57fce"
),
)
p = pbkdf2(pbkdf2.HMAC_SHA512, P, S) p = pbkdf2(pbkdf2.HMAC_SHA512, P, S)
p.update(1) p.update(1)
p.update(1) p.update(1)
dk = p.key() dk = p.key()
self.assertEqual(dk, unhexlify('e1d9c16aa681708a45f5c7c4e215ceb66e011a2e9f0040713f18aefdb866d53cf76cab2868a39b9f7840edce4fef5a82be67335c77a6068e04112754f27ccf4e')) self.assertEqual(
dk,
unhexlify(
"e1d9c16aa681708a45f5c7c4e215ceb66e011a2e9f0040713f18aefdb866d53cf76cab2868a39b9f7840edce4fef5a82be67335c77a6068e04112754f27ccf4e"
),
)
p = pbkdf2(pbkdf2.HMAC_SHA512, P, S) p = pbkdf2(pbkdf2.HMAC_SHA512, P, S)
for i in range(32): for i in range(32):
p.update(128) p.update(128)
dk = p.key() dk = p.key()
self.assertEqual(dk, unhexlify('d197b1b33db0143e018b12f3d1d1479e6cdebdcc97c5c0f87f6902e072f457b5143f30602641b3d55cd335988cb36b84376060ecd532e039b742a239434af2d5')) self.assertEqual(
P = b'passwordPASSWORDpassword' dk,
S = b'saltSALTsaltSALTsaltSALTsaltSALTsalt' unhexlify(
"d197b1b33db0143e018b12f3d1d1479e6cdebdcc97c5c0f87f6902e072f457b5143f30602641b3d55cd335988cb36b84376060ecd532e039b742a239434af2d5"
),
)
P = b"passwordPASSWORDpassword"
S = b"saltSALTsaltSALTsaltSALTsaltSALTsalt"
p = pbkdf2(pbkdf2.HMAC_SHA512, P, S) p = pbkdf2(pbkdf2.HMAC_SHA512, P, S)
for i in range(64): for i in range(64):
p.update(64) p.update(64)
dk = p.key() dk = p.key()
self.assertEqual(dk, unhexlify('8c0511f4c6e597c6ac6315d8f0362e225f3c501495ba23b868c005174dc4ee71115b59f9e60cd9532fa33e0f75aefe30225c583a186cd82bd4daea9724a3d3b8')) self.assertEqual(
dk,
unhexlify(
"8c0511f4c6e597c6ac6315d8f0362e225f3c501495ba23b868c005174dc4ee71115b59f9e60cd9532fa33e0f75aefe30225c583a186cd82bd4daea9724a3d3b8"
),
)
def test_key_multi(self): def test_key_multi(self):
P = b'password' P = b"password"
S = b'salt' S = b"salt"
p = pbkdf2(pbkdf2.HMAC_SHA256, P, S, 16) p = pbkdf2(pbkdf2.HMAC_SHA256, P, S, 16)
k0 = p.key() k0 = p.key()
k1 = p.key() k1 = p.key()
@ -104,5 +184,5 @@ class TestCryptoPbkdf2(unittest.TestCase):
self.assertEqual(k0, k2) self.assertEqual(k0, k2)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -4,7 +4,6 @@ from trezor.crypto import random
class TestCryptoRandom(unittest.TestCase): class TestCryptoRandom(unittest.TestCase):
def test_uniform(self): def test_uniform(self):
c = {} c = {}
for i in range(15): for i in range(15):
@ -27,13 +26,13 @@ class TestCryptoRandom(unittest.TestCase):
def test_bytes_uniform(self): def test_bytes_uniform(self):
for _ in range(100): for _ in range(100):
c = {} c = {}
for h in '0123456789abcdef': for h in "0123456789abcdef":
c[h] = 0 c[h] = 0
for _ in range(8): for _ in range(8):
b = random.bytes(1000) b = random.bytes(1000)
for h in hexlify(b): for h in hexlify(b):
c[chr(h)] += 1 c[chr(h)] += 1
for h in '0123456789abcdef': for h in "0123456789abcdef":
self.assertAlmostEqual(c[h], 1000, delta=200) self.assertAlmostEqual(c[h], 1000, delta=200)
def test_shuffle(self): def test_shuffle(self):
@ -44,5 +43,5 @@ class TestCryptoRandom(unittest.TestCase):
self.assertEqual(sorted(lst), list(range(l))) self.assertEqual(sorted(lst), list(range(l)))
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -7,74 +7,122 @@ class TestCryptoRlp(unittest.TestCase):
# from https://raw.githubusercontent.com/ethereum/pyrlp/develop/tests/rlptest.json # from https://raw.githubusercontent.com/ethereum/pyrlp/develop/tests/rlptest.json
vectors = [ vectors = [
(b'', (b"", "80"),
'80'), (b"dog", "83646f67"),
(b'dog', (
'83646f67'), b"Lorem ipsum dolor sit amet, consectetur adipisicing eli",
(b'Lorem ipsum dolor sit amet, consectetur adipisicing eli', "b74c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7365637465747572206164697069736963696e6720656c69",
'b74c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7365637465747572206164697069736963696e6720656c69'), ),
(b'Lorem ipsum dolor sit amet, consectetur adipisicing elit', (
'b8384c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7365637465747572206164697069736963696e6720656c6974'), b"Lorem ipsum dolor sit amet, consectetur adipisicing elit",
(b'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur mauris magna, suscipit sed vehicula non, iaculis faucibus tortor. Proin suscipit ultricies malesuada. Duis tortor elit, dictum quis tristique eu, ultrices at risus. Morbi a est imperdiet mi ullamcorper aliquet suscipit nec lorem. Aenean quis leo mollis, vulputate elit varius, consequat enim. Nulla ultrices turpis justo, et posuere urna consectetur nec. Proin non convallis metus. Donec tempor ipsum in mauris congue sollicitudin. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse convallis sem vel massa faucibus, eget lacinia lacus tempor. Nulla quis ultricies purus. Proin auctor rhoncus nibh condimentum mollis. Aliquam consequat enim at metus luctus, a eleifend purus egestas. Curabitur at nibh metus. Nam bibendum, neque at auctor tristique, lorem libero aliquet arcu, non interdum tellus lectus sit amet eros. Cras rhoncus, metus ac ornare cursus, dolor justo ultrices metus, at ullamcorper volutpat', "b8384c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7365637465747572206164697069736963696e6720656c6974",
'b904004c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c69742e20437572616269747572206d6175726973206d61676e612c20737573636970697420736564207665686963756c61206e6f6e2c20696163756c697320666175636962757320746f72746f722e2050726f696e20737573636970697420756c74726963696573206d616c6573756164612e204475697320746f72746f7220656c69742c2064696374756d2071756973207472697374697175652065752c20756c7472696365732061742072697375732e204d6f72626920612065737420696d70657264696574206d6920756c6c616d636f7270657220616c6971756574207375736369706974206e6563206c6f72656d2e2041656e65616e2071756973206c656f206d6f6c6c69732c2076756c70757461746520656c6974207661726975732c20636f6e73657175617420656e696d2e204e756c6c6120756c74726963657320747572706973206a7573746f2c20657420706f73756572652075726e6120636f6e7365637465747572206e65632e2050726f696e206e6f6e20636f6e76616c6c6973206d657475732e20446f6e65632074656d706f7220697073756d20696e206d617572697320636f6e67756520736f6c6c696369747564696e2e20566573746962756c756d20616e746520697073756d207072696d697320696e206661756369627573206f726369206c756374757320657420756c74726963657320706f737565726520637562696c69612043757261653b2053757370656e646973736520636f6e76616c6c69732073656d2076656c206d617373612066617563696275732c2065676574206c6163696e6961206c616375732074656d706f722e204e756c6c61207175697320756c747269636965732070757275732e2050726f696e20617563746f722072686f6e637573206e69626820636f6e64696d656e74756d206d6f6c6c69732e20416c697175616d20636f6e73657175617420656e696d206174206d65747573206c75637475732c206120656c656966656e6420707572757320656765737461732e20437572616269747572206174206e696268206d657475732e204e616d20626962656e64756d2c206e6571756520617420617563746f72207472697374697175652c206c6f72656d206c696265726f20616c697175657420617263752c206e6f6e20696e74657264756d2074656c6c7573206c65637475732073697420616d65742065726f732e20437261732072686f6e6375732c206d65747573206163206f726e617265206375727375732c20646f6c6f72206a7573746f20756c747269636573206d657475732c20617420756c6c616d636f7270657220766f6c7574706174'), ),
(0, (
'80'), b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur mauris magna, suscipit sed vehicula non, iaculis faucibus tortor. Proin suscipit ultricies malesuada. Duis tortor elit, dictum quis tristique eu, ultrices at risus. Morbi a est imperdiet mi ullamcorper aliquet suscipit nec lorem. Aenean quis leo mollis, vulputate elit varius, consequat enim. Nulla ultrices turpis justo, et posuere urna consectetur nec. Proin non convallis metus. Donec tempor ipsum in mauris congue sollicitudin. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse convallis sem vel massa faucibus, eget lacinia lacus tempor. Nulla quis ultricies purus. Proin auctor rhoncus nibh condimentum mollis. Aliquam consequat enim at metus luctus, a eleifend purus egestas. Curabitur at nibh metus. Nam bibendum, neque at auctor tristique, lorem libero aliquet arcu, non interdum tellus lectus sit amet eros. Cras rhoncus, metus ac ornare cursus, dolor justo ultrices metus, at ullamcorper volutpat",
(1, "b904004c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e73656374657475722061646970697363696e6720656c69742e20437572616269747572206d6175726973206d61676e612c20737573636970697420736564207665686963756c61206e6f6e2c20696163756c697320666175636962757320746f72746f722e2050726f696e20737573636970697420756c74726963696573206d616c6573756164612e204475697320746f72746f7220656c69742c2064696374756d2071756973207472697374697175652065752c20756c7472696365732061742072697375732e204d6f72626920612065737420696d70657264696574206d6920756c6c616d636f7270657220616c6971756574207375736369706974206e6563206c6f72656d2e2041656e65616e2071756973206c656f206d6f6c6c69732c2076756c70757461746520656c6974207661726975732c20636f6e73657175617420656e696d2e204e756c6c6120756c74726963657320747572706973206a7573746f2c20657420706f73756572652075726e6120636f6e7365637465747572206e65632e2050726f696e206e6f6e20636f6e76616c6c6973206d657475732e20446f6e65632074656d706f7220697073756d20696e206d617572697320636f6e67756520736f6c6c696369747564696e2e20566573746962756c756d20616e746520697073756d207072696d697320696e206661756369627573206f726369206c756374757320657420756c74726963657320706f737565726520637562696c69612043757261653b2053757370656e646973736520636f6e76616c6c69732073656d2076656c206d617373612066617563696275732c2065676574206c6163696e6961206c616375732074656d706f722e204e756c6c61207175697320756c747269636965732070757275732e2050726f696e20617563746f722072686f6e637573206e69626820636f6e64696d656e74756d206d6f6c6c69732e20416c697175616d20636f6e73657175617420656e696d206174206d65747573206c75637475732c206120656c656966656e6420707572757320656765737461732e20437572616269747572206174206e696268206d657475732e204e616d20626962656e64756d2c206e6571756520617420617563746f72207472697374697175652c206c6f72656d206c696265726f20616c697175657420617263752c206e6f6e20696e74657264756d2074656c6c7573206c65637475732073697420616d65742065726f732e20437261732072686f6e6375732c206d65747573206163206f726e617265206375727375732c20646f6c6f72206a7573746f20756c747269636573206d657475732c20617420756c6c616d636f7270657220766f6c7574706174",
'01'), ),
(16, (0, "80"),
'10'), (1, "01"),
(79, (16, "10"),
'4f'), (79, "4f"),
(127, (127, "7f"),
'7f'), (128, "8180"),
(128, (254, "81fe"),
'8180'), (255, "81ff"),
(254, (256, "820100"),
'81fe'), (1000, "8203e8"),
(255, (100000, "830186a0"),
'81ff'), (0xFFFF, "82ffff"),
(256, (0x1_0000, "83010000"),
'820100'), (0xFF_FFFF, "83ffffff"),
(1000, (0x100_0000, "8401000000"),
'8203e8'), (0xFFFF_FFFF, "84ffffffff"),
(100000, (0x1_0000_0000, "850100000000"),
'830186a0'), (83729609699884896815286331701780722, "8f102030405060708090a0b0c0d0e0f2"),
(0xffff, (
'82ffff'), 105315505618206987246253880190783558935785933862974822347068935681,
(0x1_0000, "9c0100020003000400050006000700080009000a000b000c000d000e01",
'83010000'), ),
(0xff_ffff, ([], "c0"),
'83ffffff'), ([b"dog", b"god", b"cat"], "cc83646f6783676f6483636174"),
(0x100_0000, ([b"zw", [4], 1], "c6827a77c10401"),
'8401000000'), (
(0xffff_ffff, [
'84ffffffff'), b"asdf",
(0x1_0000_0000, b"qwer",
'850100000000'), b"zxcv",
(83729609699884896815286331701780722, b"asdf",
'8f102030405060708090a0b0c0d0e0f2'), b"qwer",
(105315505618206987246253880190783558935785933862974822347068935681, b"zxcv",
'9c0100020003000400050006000700080009000a000b000c000d000e01'), b"asdf",
([], b"qwer",
'c0'), b"zxcv",
([b'dog', b'god', b'cat'], b"asdf",
'cc83646f6783676f6483636174'), b"qwer",
([b'zw', [4], 1], ],
'c6827a77c10401'), "f784617364668471776572847a78637684617364668471776572847a78637684617364668471776572847a78637684617364668471776572",
([b'asdf', b'qwer', b'zxcv', b'asdf', b'qwer', b'zxcv', b'asdf', b'qwer', b'zxcv', b'asdf', b'qwer'], ),
'f784617364668471776572847a78637684617364668471776572847a78637684617364668471776572847a78637684617364668471776572'), (
([[b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv']], [
'f840cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376'), [b"asdf", b"qwer", b"zxcv"],
([[b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv'], [b'asdf', b'qwer', b'zxcv']], [b"asdf", b"qwer", b"zxcv"],
'f90200cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376'), [b"asdf", b"qwer", b"zxcv"],
([[[], []], []], [b"asdf", b"qwer", b"zxcv"],
'c4c2c0c0c0'), ],
([[], [[]], [[], [[]]]], "f840cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376",
'c7c0c1c0c3c0c1c0'), ),
([[b'key1', b'val1'], [b'key2', b'val2'], [b'key3', b'val3'], [b'key4', b'val4']], (
'ecca846b6579318476616c31ca846b6579328476616c32ca846b6579338476616c33ca846b6579348476616c34'), [
(115792089237316195423570985008687907853269984665640564039457584007913129639936, [b"asdf", b"qwer", b"zxcv"],
'a1010000000000000000000000000000000000000000000000000000000000000000'), [b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
[b"asdf", b"qwer", b"zxcv"],
],
"f90200cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376cf84617364668471776572847a786376",
),
([[[], []], []], "c4c2c0c0c0"),
([[], [[]], [[], [[]]]], "c7c0c1c0c3c0c1c0"),
(
[
[b"key1", b"val1"],
[b"key2", b"val2"],
[b"key3", b"val3"],
[b"key4", b"val4"],
],
"ecca846b6579318476616c31ca846b6579328476616c32ca846b6579338476616c33ca846b6579348476616c34",
),
(
115792089237316195423570985008687907853269984665640564039457584007913129639936,
"a1010000000000000000000000000000000000000000000000000000000000000000",
),
] ]
def test_rlp_write(self): def test_rlp_write(self):
@ -84,13 +132,11 @@ class TestCryptoRlp(unittest.TestCase):
rlp.write(w, i) rlp.write(w, i)
self.assertEqual(w, o) self.assertEqual(w, o)
def test_rlp_length(self): def test_rlp_length(self):
for i, o in self.vectors: for i, o in self.vectors:
length = rlp.length(i) length = rlp.length(i)
self.assertEqual(length, len(o) // 2) self.assertEqual(length, len(o) // 2)
if __name__ == "__main__":
if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -18,10 +18,11 @@ def combinations(iterable, r):
else: else:
return return
indices[i] += 1 indices[i] += 1
for j in range(i+1, r): for j in range(i + 1, r):
indices[j] = indices[j-1] + 1 indices[j] = indices[j - 1] + 1
yield tuple(pool[i] for i in indices) yield tuple(pool[i] for i in indices)
class TestCryptoSlip39(unittest.TestCase): class TestCryptoSlip39(unittest.TestCase):
EMS = b"ABCDEFGHIJKLMNOP" EMS = b"ABCDEFGHIJKLMNOP"
@ -30,8 +31,9 @@ class TestCryptoSlip39(unittest.TestCase):
identifier = slip39.generate_random_identifier() identifier = slip39.generate_random_identifier()
mnemonics = slip39.split_ems(1, [(3, 5)], identifier, 1, ems) mnemonics = slip39.split_ems(1, [(3, 5)], identifier, 1, ems)
mnemonics = mnemonics[0] mnemonics = mnemonics[0]
self.assertEqual(slip39.recover_ems(mnemonics[:3]), slip39.recover_ems(mnemonics[2:])) self.assertEqual(
slip39.recover_ems(mnemonics[:3]), slip39.recover_ems(mnemonics[2:])
)
def test_basic_sharing_fixed(self): def test_basic_sharing_fixed(self):
generated_identifier = slip39.generate_random_identifier() generated_identifier = slip39.generate_random_identifier()
@ -44,7 +46,6 @@ class TestCryptoSlip39(unittest.TestCase):
with self.assertRaises(slip39.MnemonicError): with self.assertRaises(slip39.MnemonicError):
slip39.recover_ems(mnemonics[1:3]) slip39.recover_ems(mnemonics[1:3])
def test_iteration_exponent(self): def test_iteration_exponent(self):
identifier = slip39.generate_random_identifier() identifier = slip39.generate_random_identifier()
mnemonics = slip39.split_ems(1, [(3, 5)], identifier, 1, self.EMS) mnemonics = slip39.split_ems(1, [(3, 5)], identifier, 1, self.EMS)
@ -58,14 +59,17 @@ class TestCryptoSlip39(unittest.TestCase):
identifier, exponent, ems = slip39.recover_ems(mnemonics[1:4]) identifier, exponent, ems = slip39.recover_ems(mnemonics[1:4])
self.assertEqual(ems, self.EMS) self.assertEqual(ems, self.EMS)
def test_group_sharing(self): def test_group_sharing(self):
group_threshold = 2 group_threshold = 2
group_sizes = (5, 3, 5, 1) group_sizes = (5, 3, 5, 1)
member_thresholds = (3, 2, 2, 1) member_thresholds = (3, 2, 2, 1)
identifier = slip39.generate_random_identifier() identifier = slip39.generate_random_identifier()
mnemonics = slip39.split_ems( mnemonics = slip39.split_ems(
group_threshold, list(zip(member_thresholds, group_sizes)), identifier, 1, self.EMS group_threshold,
list(zip(member_thresholds, group_sizes)),
identifier,
1,
self.EMS,
) )
# Test all valid combinations of mnemonics. # Test all valid combinations of mnemonics.
@ -77,11 +81,15 @@ class TestCryptoSlip39(unittest.TestCase):
identifier, exponent, ems = slip39.recover_ems(mnemonic_subset) identifier, exponent, ems = slip39.recover_ems(mnemonic_subset)
self.assertEqual(ems, self.EMS) self.assertEqual(ems, self.EMS)
# Minimal sets of mnemonics. # Minimal sets of mnemonics.
identifier, exponent, ems = slip39.recover_ems([mnemonics[2][0], mnemonics[2][2], mnemonics[3][0]]) identifier, exponent, ems = slip39.recover_ems(
[mnemonics[2][0], mnemonics[2][2], mnemonics[3][0]]
)
self.assertEqual(ems, self.EMS) self.assertEqual(ems, self.EMS)
self.assertEqual(slip39.recover_ems([mnemonics[2][3], mnemonics[3][0], mnemonics[2][4]])[2], ems) self.assertEqual(
slip39.recover_ems([mnemonics[2][3], mnemonics[3][0], mnemonics[2][4]])[2],
ems,
)
# One complete group and one incomplete group out of two groups required. # One complete group and one incomplete group out of two groups required.
with self.assertRaises(slip39.MnemonicError): with self.assertRaises(slip39.MnemonicError):
@ -91,14 +99,17 @@ class TestCryptoSlip39(unittest.TestCase):
with self.assertRaises(slip39.MnemonicError): with self.assertRaises(slip39.MnemonicError):
slip39.recover_ems(mnemonics[0][1:4]) slip39.recover_ems(mnemonics[0][1:4])
def test_group_sharing_threshold_1(self): def test_group_sharing_threshold_1(self):
group_threshold = 1 group_threshold = 1
group_sizes = (5, 3, 5, 1) group_sizes = (5, 3, 5, 1)
member_thresholds = (3, 2, 2, 1) member_thresholds = (3, 2, 2, 1)
identifier = slip39.generate_random_identifier() identifier = slip39.generate_random_identifier()
mnemonics = slip39.split_ems( mnemonics = slip39.split_ems(
group_threshold, list(zip(member_thresholds, group_sizes)), identifier, 1, self.EMS group_threshold,
list(zip(member_thresholds, group_sizes)),
identifier,
1,
self.EMS,
) )
# Test all valid combinations of mnemonics. # Test all valid combinations of mnemonics.
@ -109,17 +120,19 @@ class TestCryptoSlip39(unittest.TestCase):
identifier, exponent, ems = slip39.recover_ems(mnemonic_subset) identifier, exponent, ems = slip39.recover_ems(mnemonic_subset)
self.assertEqual(ems, self.EMS) self.assertEqual(ems, self.EMS)
def test_all_groups_exist(self): def test_all_groups_exist(self):
for group_threshold in (1, 2, 5): for group_threshold in (1, 2, 5):
identifier = slip39.generate_random_identifier() identifier = slip39.generate_random_identifier()
mnemonics = slip39.split_ems( mnemonics = slip39.split_ems(
group_threshold, [(3, 5), (1, 1), (2, 3), (2, 5), (3, 5)], identifier, 1, self.EMS group_threshold,
[(3, 5), (1, 1), (2, 3), (2, 5), (3, 5)],
identifier,
1,
self.EMS,
) )
self.assertEqual(len(mnemonics), 5) self.assertEqual(len(mnemonics), 5)
self.assertEqual(len(sum(mnemonics, [])), 19) self.assertEqual(len(sum(mnemonics, [])), 19)
def test_invalid_sharing(self): def test_invalid_sharing(self):
identifier = slip39.generate_random_identifier() identifier = slip39.generate_random_identifier()
@ -143,16 +156,18 @@ class TestCryptoSlip39(unittest.TestCase):
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
slip39.split_ems(2, [(3, 5), (1, 3), (2, 5)], identifier, 1, self.EMS) slip39.split_ems(2, [(3, 5), (1, 3), (2, 5)], identifier, 1, self.EMS)
def test_vectors(self): def test_vectors(self):
for mnemonics, secret in vectors: for mnemonics, secret in vectors:
if secret: if secret:
identifier, exponent, ems = slip39.recover_ems(mnemonics) identifier, exponent, ems = slip39.recover_ems(mnemonics)
self.assertEqual(slip39.decrypt(ems, b"TREZOR", exponent, identifier), unhexlify(secret)) self.assertEqual(
slip39.decrypt(ems, b"TREZOR", exponent, identifier),
unhexlify(secret),
)
else: else:
with self.assertRaises(slip39.MnemonicError): with self.assertRaises(slip39.MnemonicError):
slip39.recover_ems(mnemonics) slip39.recover_ems(mnemonics)
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -4,7 +4,6 @@ from trezor import io
class TestTrezorIoSdcard(unittest.TestCase): class TestTrezorIoSdcard(unittest.TestCase):
def test_start(self): def test_start(self):
self.assertTrue(io.sdcard.is_present()) self.assertTrue(io.sdcard.is_present())
@ -31,8 +30,8 @@ class TestTrezorIoSdcard(unittest.TestCase):
def test_read_write(self): def test_read_write(self):
r = bytearray(8 * 512) r = bytearray(8 * 512)
w0 = bytearray(b'0' * (8 * 512)) w0 = bytearray(b"0" * (8 * 512))
w1 = bytearray(b'1' * (8 * 512)) w1 = bytearray(b"1" * (8 * 512))
io.sdcard.power_on() io.sdcard.power_on()
io.sdcard.write(0, w0) io.sdcard.write(0, w0)
io.sdcard.read(0, r) io.sdcard.read(0, r)
@ -43,5 +42,5 @@ class TestTrezorIoSdcard(unittest.TestCase):
io.sdcard.power_off() io.sdcard.power_off()
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -1,7 +1,12 @@
from common import * from common import *
from trezor import protobuf from trezor import protobuf
from trezor.messages import WebAuthnCredential, Failure, SignMessage, DebugLinkMemoryRead from trezor.messages import (
WebAuthnCredential,
Failure,
SignMessage,
DebugLinkMemoryRead,
)
def load_uvarint32(data: bytes) -> int: def load_uvarint32(data: bytes) -> int:
@ -49,7 +54,9 @@ def dump_message(msg: protobuf.MessageType) -> bytearray:
return buffer return buffer
def load_message(msg_type: Type[protobuf.MessageType], buffer: bytes) -> protobuf.MessageType: def load_message(
msg_type: Type[protobuf.MessageType], buffer: bytes
) -> protobuf.MessageType:
return protobuf.decode(buffer, msg_type, False) return protobuf.decode(buffer, msg_type, False)
@ -110,6 +117,5 @@ class TestProtobuf(unittest.TestCase):
self.assertEqual(nmsg.coin_name, "Bitcoin") self.assertEqual(nmsg.coin_name, "Bitcoin")
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -4,6 +4,7 @@ from trezor import io, sdcard
fatfs = io.fatfs fatfs = io.fatfs
class TestTrezorSdcard(unittest.TestCase): class TestTrezorSdcard(unittest.TestCase):
def test_power(self): def test_power(self):
# sdcard.capacity() will return 0 if the card is not powered, # sdcard.capacity() will return 0 if the card is not powered,

View File

@ -26,5 +26,5 @@ class TestDisplay(unittest.TestCase):
pass pass
if __name__ == '__main__': if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -4,7 +4,6 @@ from trezor import utils
class TestUtils(unittest.TestCase): class TestUtils(unittest.TestCase):
def test_chunks(self): def test_chunks(self):
c = list(utils.chunks(range(100), 7)) c = list(utils.chunks(range(100), 7))
for i in range(15): for i in range(15):
@ -25,25 +24,44 @@ class TestUtils(unittest.TestCase):
self.assertEqual(utils.truncate_utf8("ab\u0123", 3), "ab") # b'ab\xc4\xa3' self.assertEqual(utils.truncate_utf8("ab\u0123", 3), "ab") # b'ab\xc4\xa3'
self.assertEqual(utils.truncate_utf8("ab\u1234", 3), "ab") # b'ab\xe1\x88\xb4' self.assertEqual(utils.truncate_utf8("ab\u1234", 3), "ab") # b'ab\xe1\x88\xb4'
self.assertEqual(utils.truncate_utf8("abc\u0123", 3), "abc") # b'abc\xc4\xa3' self.assertEqual(utils.truncate_utf8("abc\u0123", 3), "abc") # b'abc\xc4\xa3'
self.assertEqual(utils.truncate_utf8("abc\u1234", 3), "abc") # b'abc\xe1\x88\xb4' self.assertEqual(
self.assertEqual(utils.truncate_utf8("\u1234\u5678", 0), "") # b'\xe1\x88\xb4\xe5\x99\xb8 utils.truncate_utf8("abc\u1234", 3), "abc"
self.assertEqual(utils.truncate_utf8("\u1234\u5678", 1), "") # b'\xe1\x88\xb4\xe5\x99\xb8 ) # b'abc\xe1\x88\xb4'
self.assertEqual(utils.truncate_utf8("\u1234\u5678", 2), "") # b'\xe1\x88\xb4\xe5\x99\xb8 self.assertEqual(
self.assertEqual(utils.truncate_utf8("\u1234\u5678", 3), "\u1234") # b'\xe1\x88\xb4\xe5\x99\xb8 utils.truncate_utf8("\u1234\u5678", 0), ""
self.assertEqual(utils.truncate_utf8("\u1234\u5678", 4), "\u1234") # b'\xe1\x88\xb4\xe5\x99\xb8 ) # b'\xe1\x88\xb4\xe5\x99\xb8
self.assertEqual(utils.truncate_utf8("\u1234\u5678", 5), "\u1234") # b'\xe1\x88\xb4\xe5\x99\xb8 self.assertEqual(
self.assertEqual(utils.truncate_utf8("\u1234\u5678", 6), "\u1234\u5678") # b'\xe1\x88\xb4\xe5\x99\xb8 utils.truncate_utf8("\u1234\u5678", 1), ""
self.assertEqual(utils.truncate_utf8("\u1234\u5678", 7), "\u1234\u5678") # b'\xe1\x88\xb4\xe5\x99\xb8 ) # b'\xe1\x88\xb4\xe5\x99\xb8
self.assertEqual(
utils.truncate_utf8("\u1234\u5678", 2), ""
) # b'\xe1\x88\xb4\xe5\x99\xb8
self.assertEqual(
utils.truncate_utf8("\u1234\u5678", 3), "\u1234"
) # b'\xe1\x88\xb4\xe5\x99\xb8
self.assertEqual(
utils.truncate_utf8("\u1234\u5678", 4), "\u1234"
) # b'\xe1\x88\xb4\xe5\x99\xb8
self.assertEqual(
utils.truncate_utf8("\u1234\u5678", 5), "\u1234"
) # b'\xe1\x88\xb4\xe5\x99\xb8
self.assertEqual(
utils.truncate_utf8("\u1234\u5678", 6), "\u1234\u5678"
) # b'\xe1\x88\xb4\xe5\x99\xb8
self.assertEqual(
utils.truncate_utf8("\u1234\u5678", 7), "\u1234\u5678"
) # b'\xe1\x88\xb4\xe5\x99\xb8
def test_firmware_hash(self): def test_firmware_hash(self):
self.assertEqual( self.assertEqual(
utils.firmware_hash(), utils.firmware_hash(),
b'\xd2\xdb\x90\xa7jV6\xa7\x00N\xc3\xb4\x8eq\xa9U\xe0\xcb\xb2\xcbZo\xd7\xae\x9f\xbe\xf8F\xbc\x16l\x8c', b"\xd2\xdb\x90\xa7jV6\xa7\x00N\xc3\xb4\x8eq\xa9U\xe0\xcb\xb2\xcbZo\xd7\xae\x9f\xbe\xf8F\xbc\x16l\x8c",
) )
self.assertEqual( self.assertEqual(
utils.firmware_hash(b"0123456789abcdef"), utils.firmware_hash(b"0123456789abcdef"),
b"\xa0\x93@\x98\xa6\x80\xdb\x07m\xdf~\xe2'E\xf1\x19\xd8\xfd\xa4`\x10H\xf0_\xdbf\xa6N\xdd\xc0\xcf\xed", b"\xa0\x93@\x98\xa6\x80\xdb\x07m\xdf~\xe2'E\xf1\x19\xd8\xfd\xa4`\x10H\xf0_\xdbf\xa6N\xdd\xc0\xcf\xed",
) )
if __name__ == '__main__':
if __name__ == "__main__":
unittest.main() unittest.main()

View File

@ -2,7 +2,6 @@ from common import *
class TestUnittest(unittest.TestCase): class TestUnittest(unittest.TestCase):
def test_debug(self): def test_debug(self):
if not __debug__: if not __debug__:
# Fail the test if debug is turned off, because `assert` is not executed then. # Fail the test if debug is turned off, because `assert` is not executed then.

View File

@ -8,7 +8,6 @@ class SkipTest(Exception):
class AssertRaisesContext: class AssertRaisesContext:
def __init__(self, exc): def __init__(self, exc):
self.expected = exc self.expected = exc
self.value = None self.value = None
@ -29,14 +28,14 @@ class TestCase:
def __init__(self) -> None: def __init__(self) -> None:
self.__equality_functions = {} self.__equality_functions = {}
def fail(self, msg=''): def fail(self, msg=""):
ensure(False, msg) ensure(False, msg)
def addTypeEqualityFunc(self, typeobj, function): def addTypeEqualityFunc(self, typeobj, function):
ensure(callable(function)) ensure(callable(function))
self.__equality_functions[typeobj.__name__] = function self.__equality_functions[typeobj.__name__] = function
def assertEqual(self, x, y, msg=''): def assertEqual(self, x, y, msg=""):
if not msg: if not msg:
msg = f"{repr(x)} vs (expected) {repr(y)}" msg = f"{repr(x)} vs (expected) {repr(y)}"
@ -47,12 +46,12 @@ class TestCase:
else: else:
ensure(x == y, msg) ensure(x == y, msg)
def assertNotEqual(self, x, y, msg=''): def assertNotEqual(self, x, y, msg=""):
if not msg: if not msg:
msg = f"{repr(x)} not expected to be equal {repr(y)}" msg = f"{repr(x)} not expected to be equal {repr(y)}"
ensure(x != y, msg) ensure(x != y, msg)
def assertAlmostEqual(self, x, y, places=None, msg='', delta=None): def assertAlmostEqual(self, x, y, places=None, msg="", delta=None):
if x == y: if x == y:
return return
if delta is not None and places is not None: if delta is not None and places is not None:
@ -62,18 +61,18 @@ class TestCase:
if abs(x - y) <= delta: if abs(x - y) <= delta:
return return
if not msg: if not msg:
msg = f'{repr(x)} != {repr(y)} within {repr(delta)} delta' msg = f"{repr(x)} != {repr(y)} within {repr(delta)} delta"
else: else:
if places is None: if places is None:
places = 7 places = 7
if round(abs(y - x), places) == 0: if round(abs(y - x), places) == 0:
return return
if not msg: if not msg:
msg = f'{repr(x)} != {repr(y)} within {repr(places)} places' msg = f"{repr(x)} != {repr(y)} within {repr(places)} places"
ensure(False, msg) ensure(False, msg)
def assertNotAlmostEqual(self, x, y, places=None, msg='', delta=None): def assertNotAlmostEqual(self, x, y, places=None, msg="", delta=None):
if delta is not None and places is not None: if delta is not None and places is not None:
raise TypeError("specify delta or places not both") raise TypeError("specify delta or places not both")
@ -81,53 +80,53 @@ class TestCase:
if not (x == y) and abs(x - y) > delta: if not (x == y) and abs(x - y) > delta:
return return
if not msg: if not msg:
msg = f'{repr(x)} == {repr(y)} within {repr(delta)} delta' msg = f"{repr(x)} == {repr(y)} within {repr(delta)} delta"
else: else:
if places is None: if places is None:
places = 7 places = 7
if not (x == y) and round(abs(y - x), places) != 0: if not (x == y) and round(abs(y - x), places) != 0:
return return
if not msg: if not msg:
msg = f'{repr(x)} == {repr(y)} within {repr(places)} places' msg = f"{repr(x)} == {repr(y)} within {repr(places)} places"
ensure(False, msg) ensure(False, msg)
def assertIs(self, x, y, msg=''): def assertIs(self, x, y, msg=""):
if not msg: if not msg:
msg = f"{repr(x)} is not {repr(y)}" msg = f"{repr(x)} is not {repr(y)}"
ensure(x is y, msg) ensure(x is y, msg)
def assertIsNot(self, x, y, msg=''): def assertIsNot(self, x, y, msg=""):
if not msg: if not msg:
msg = f"{repr(x)} is {repr(y)}" msg = f"{repr(x)} is {repr(y)}"
ensure(x is not y, msg) ensure(x is not y, msg)
def assertIsNone(self, x, msg=''): def assertIsNone(self, x, msg=""):
if not msg: if not msg:
msg = f"{repr(x)} is not None" msg = f"{repr(x)} is not None"
ensure(x is None, msg) ensure(x is None, msg)
def assertIsNotNone(self, x, msg=''): def assertIsNotNone(self, x, msg=""):
if not msg: if not msg:
msg = f"{repr(x)} is None" msg = f"{repr(x)} is None"
ensure(x is not None, msg) ensure(x is not None, msg)
def assertTrue(self, x, msg=''): def assertTrue(self, x, msg=""):
if not msg: if not msg:
msg = f"Expected {repr(x)} to be True" msg = f"Expected {repr(x)} to be True"
ensure(x, msg) ensure(x, msg)
def assertFalse(self, x, msg=''): def assertFalse(self, x, msg=""):
if not msg: if not msg:
msg = f"Expected {repr(x)} to be False" msg = f"Expected {repr(x)} to be False"
ensure(not x, msg) ensure(not x, msg)
def assertIn(self, x, y, msg=''): def assertIn(self, x, y, msg=""):
if not msg: if not msg:
msg = f"Expected {repr(x)} to be in {repr(y)}" msg = f"Expected {repr(x)} to be in {repr(y)}"
ensure(x in y, msg) ensure(x in y, msg)
def assertIsInstance(self, x, y, msg=''): def assertIsInstance(self, x, y, msg=""):
ensure(isinstance(x, y), msg) ensure(isinstance(x, y), msg)
def assertRaises(self, exc, func=None, *args, **kwargs): def assertRaises(self, exc, func=None, *args, **kwargs):
@ -142,7 +141,7 @@ class TestCase:
else: else:
ensure(False, f"{repr(exc)} not raised") ensure(False, f"{repr(exc)} not raised")
def assertListEqual(self, x, y, msg=''): def assertListEqual(self, x, y, msg=""):
if len(x) != len(y): if len(x) != len(y):
if not msg: if not msg:
msg = "List lengths not equal" msg = "List lengths not equal"
@ -160,34 +159,26 @@ class TestCase:
syscall = task.send(prev_result) syscall = task.send(prev_result)
self.assertObjectEqual(syscall, expected) self.assertObjectEqual(syscall, expected)
def assertObjectEqual(self, a, b, msg=''): def assertObjectEqual(self, a, b, msg=""):
self.assertIsInstance(a, b.__class__, msg) self.assertIsInstance(a, b.__class__, msg)
self.assertEqual(a.__dict__, b.__dict__, msg) self.assertEqual(a.__dict__, b.__dict__, msg)
def assertDictEqual(self, x, y): def assertDictEqual(self, x, y):
self.assertEqual( self.assertEqual(
len(x), len(x), len(y), f"Dict lengths not equal - {len(x)} vs {len(y)}"
len(y),
f"Dict lengths not equal - {len(x)} vs {len(y)}"
) )
for key in x: for key in x:
self.assertIn( self.assertIn(key, y, f"Key {key} not found in second dict.")
key,
y,
f"Key {key} not found in second dict."
)
self.assertEqual( self.assertEqual(
x[key], x[key], y[key], f"At key {key} expected {x[key]}, found {y[key]}"
y[key],
f"At key {key} expected {x[key]}, found {y[key]}"
) )
def assertMessageEqual(self, x, y): def assertMessageEqual(self, x, y):
self.assertEqual( self.assertEqual(
x.MESSAGE_NAME, x.MESSAGE_NAME,
y.MESSAGE_NAME, y.MESSAGE_NAME,
f"Expected {x.MESSAGE_NAME}, found {y.MESSAGE_NAME}" f"Expected {x.MESSAGE_NAME}, found {y.MESSAGE_NAME}",
) )
self.assertDictEqual(x.__dict__, y.__dict__) self.assertDictEqual(x.__dict__, y.__dict__)
@ -197,7 +188,9 @@ def skip(msg):
# We just replace original fun with _inner # We just replace original fun with _inner
def _inner(self): def _inner(self):
raise SkipTest(msg) raise SkipTest(msg)
return _inner return _inner
return _decor return _decor
@ -208,7 +201,6 @@ def skipUnless(cond, msg):
class TestSuite: class TestSuite:
def __init__(self): def __init__(self):
self.tests = [] self.tests = []
@ -217,7 +209,6 @@ class TestSuite:
class TestRunner: class TestRunner:
def run(self, suite): def run(self, suite):
res = TestResult() res = TestResult()
for c in suite.tests: for c in suite.tests:
@ -226,7 +217,6 @@ class TestRunner:
class TestResult: class TestResult:
def __init__(self): def __init__(self):
self.errorsNum = 0 self.errorsNum = 0
self.failuresNum = 0 self.failuresNum = 0
@ -244,10 +234,10 @@ def run_class(c, test_result):
o = c() o = c()
set_up = getattr(o, "setUp", lambda: None) set_up = getattr(o, "setUp", lambda: None)
tear_down = getattr(o, "tearDown", lambda: None) tear_down = getattr(o, "tearDown", lambda: None)
print('class', c.__qualname__) print("class", c.__qualname__)
for name in dir(o): for name in dir(o):
if name.startswith("test"): if name.startswith("test"):
print(' ', name, end=' ...') print(" ", name, end=" ...")
m = getattr(o, name) m = getattr(o, name)
try: try:
try: try:
@ -255,7 +245,9 @@ def run_class(c, test_result):
test_result.testsRun += 1 test_result.testsRun += 1
retval = m() retval = m()
if isinstance(retval, generator_type): if isinstance(retval, generator_type):
raise RuntimeError(f"{name} must not be a generator (it is async, uses yield or await).") raise RuntimeError(
f"{name} must not be a generator (it is async, uses yield or await)."
)
elif retval is not None: elif retval is not None:
raise RuntimeError(f"{name} should not return a result.") raise RuntimeError(f"{name} should not return a result.")
finally: finally:
@ -278,7 +270,11 @@ def main(module="__main__"):
def test_cases(m): def test_cases(m):
for tn in dir(m): for tn in dir(m):
c = getattr(m, tn) c = getattr(m, tn)
if isinstance(c, object) and isinstance(c, type) and issubclass(c, TestCase): if (
isinstance(c, object)
and isinstance(c, type)
and issubclass(c, TestCase)
):
yield c yield c
m = __import__(module) m = __import__(module)