slip39: Add support for group count in the mnemonics.

pull/85/head
Andrew Kozlik 6 years ago
parent db03e2e000
commit f5b3ade799

@ -28,7 +28,13 @@
/// def interpolate(shares, x) -> bytes:
/// '''
/// Interpolate
/// Returns f(x) given the Shamir shares (x_1, f(x_1)), ... , (x_k, f(x_k)).
/// :param shares: The Shamir shares.
/// :type shares: A list of pairs (x_i, y_i), where x_i is an integer and y_i is an array of
/// bytes representing the evaluations of the polynomials in x_i.
/// :param int x: The x coordinate of the result.
/// :return: Evaluations of the polynomials in x.
/// :rtype: Array of bytes.
/// '''
mp_obj_t mod_trezorcrypto_shamir_interpolate(mp_obj_t shares, mp_obj_t x) {
size_t share_count;

@ -30,10 +30,6 @@ class ConfigurationError(Exception):
pass
class InterpolationError(Exception):
pass
class MnemonicError(Exception):
pass
@ -54,7 +50,7 @@ class ShamirMnemonic(object):
ID_EXP_LENGTH_WORDS = (ID_LENGTH_BITS + ITERATION_EXP_LENGTH_BITS) // RADIX_BITS
"""The length of the random identifier and iteration exponent in words."""
MAX_SHARE_COUNT = 2 ** (RADIX_BITS // 2)
MAX_SHARE_COUNT = 16
"""The maximum number of shares that can be created."""
CHECKSUM_LENGTH_WORDS = 3
@ -101,37 +97,6 @@ class ShamirMnemonic(object):
self.word_index_map = {word: i for i, word in enumerate(wordlist)}
def _interpolate(self, shares, x):
"""
Returns f(x) given the Shamir shares (x_1, f(x_1)), ... , (x_k, f(x_k)).
:param shares: The Shamir shares.
:type shares: A list of pairs (x_i, y_i), where x_i is an integer and y_i is an array of
bytes representing the evaluations of the polynomials in x_i.
:param int x: The x coordinate of the result.
:return: Evaluations of the polynomials in x.
:rtype: Array of bytes.
"""
x_coordinates = set(share[0] for share in shares)
if len(x_coordinates) != len(shares):
raise InterpolationError(
"Invalid set of shares. Share indices must be unique."
)
share_value_lengths = set(len(share[1]) for share in shares)
if len(share_value_lengths) != 1:
raise InterpolationError(
"Invalid set of shares. All share values must have the same length."
)
if x in x_coordinates:
for share in shares:
if share[0] == x:
return share[1]
return shamir.interpolate(shares, x)
@classmethod
def _rs1024_polymod(cls, values):
GEN = (
@ -181,11 +146,12 @@ class ShamirMnemonic(object):
value = (value << cls.RADIX_BITS) + index
return value
@classmethod
def _int_to_indices(cls, value, length):
"""Converts an integer value to base 1024 indices in big endian order."""
@staticmethod
def _int_to_indices(value, length, bits):
"""Converts an integer value to indices in big endian order."""
mask = (1 << bits) - 1
return (
(value >> (i * cls.RADIX_BITS)) % cls.RADIX for i in reversed(range(length))
(value >> (i * bits)) & mask for i in reversed(range(length))
)
def mnemonic_from_indices(self, indices):
@ -274,16 +240,16 @@ class ShamirMnemonic(object):
]
for i in range(random_share_count, share_count):
shares.append((i, self._interpolate(base_shares, i)))
shares.append((i, shamir.interpolate(base_shares, i)))
return shares
def _recover_secret(self, threshold, shares):
shared_secret = self._interpolate(shares, self.SECRET_INDEX)
shared_secret = shamir.interpolate(shares, self.SECRET_INDEX)
# If the threshold is 1, then the digest of the shared secret is not used.
if threshold != 1:
digest_share = self._interpolate(shares, self.DIGEST_INDEX)
digest_share = shamir.interpolate(shares, self.DIGEST_INDEX)
digest = digest_share[: self.DIGEST_LENGTH_BYTES]
random_part = digest_share[self.DIGEST_LENGTH_BYTES :]
@ -294,11 +260,11 @@ class ShamirMnemonic(object):
@classmethod
def _group_prefix(
cls, identifier, iteration_exponent, group_index, group_threshold
cls, identifier, iteration_exponent, group_index, group_threshold, group_count
):
id_exp_int = (identifier << cls.ITERATION_EXP_LENGTH_BITS) + iteration_exponent
return tuple(cls._int_to_indices(id_exp_int, cls.ID_EXP_LENGTH_WORDS)) + (
group_index * cls.MAX_SHARE_COUNT + (group_threshold - 1),
return tuple(cls._int_to_indices(id_exp_int, cls.ID_EXP_LENGTH_WORDS, cls.RADIX_BITS)) + (
(group_index << 6) + ((group_threshold - 1) << 2) + ((group_count - 1) >> 2),
)
def encode_mnemonic(
@ -307,6 +273,7 @@ class ShamirMnemonic(object):
iteration_exponent,
group_index,
group_threshold,
group_count,
member_index,
member_threshold,
value,
@ -317,6 +284,7 @@ class ShamirMnemonic(object):
:param int iteration_exponent: The iteration exponent.
:param int group_index: The x coordinate of the group share.
:param int group_threshold: The number of group shares needed to reconstruct the encrypted master secret.
:param int group_count: The total number of groups in existence.
:param int member_index: The x coordinate of the member share in the given group.
:param int member_threshold: The number of member shares needed to reconstruct the group share.
:param value: The share value representing the y coordinates of the share.
@ -331,10 +299,10 @@ class ShamirMnemonic(object):
share_data = (
self._group_prefix(
identifier, iteration_exponent, group_index, group_threshold
identifier, iteration_exponent, group_index, group_threshold, group_count
)
+ (member_index * self.MAX_SHARE_COUNT + (member_threshold - 1),)
+ tuple(self._int_to_indices(value_int, value_word_count))
+ ((((group_count - 1) & 3) << 8) + (member_index << 4) + (member_threshold - 1),)
+ tuple(self._int_to_indices(value_int, value_word_count, self.RADIX_BITS))
)
checksum = self.rs1024_create_checksum(share_data)
@ -366,33 +334,33 @@ class ShamirMnemonic(object):
id_exp_int = self._int_from_indices(mnemonic_data[: self.ID_EXP_LENGTH_WORDS])
identifier = id_exp_int >> self.ITERATION_EXP_LENGTH_BITS
iteration_exponent = id_exp_int & ((1 << self.ITERATION_EXP_LENGTH_BITS) - 1)
group_index = mnemonic_data[self.ID_EXP_LENGTH_WORDS] // self.MAX_SHARE_COUNT
group_threshold = (
mnemonic_data[self.ID_EXP_LENGTH_WORDS] % self.MAX_SHARE_COUNT
) + 1
member_index = (
mnemonic_data[self.ID_EXP_LENGTH_WORDS + 1] // self.MAX_SHARE_COUNT
)
member_threshold = (
mnemonic_data[self.ID_EXP_LENGTH_WORDS + 1] % self.MAX_SHARE_COUNT
) + 1
tmp = self._int_from_indices(mnemonic_data[self.ID_EXP_LENGTH_WORDS: self.ID_EXP_LENGTH_WORDS + 2])
group_index, group_threshold, group_count, member_index, member_threshold = self._int_to_indices(tmp, 5, 4)
value_data = mnemonic_data[
self.ID_EXP_LENGTH_WORDS + 2 : -self.CHECKSUM_LENGTH_WORDS
]
if group_count < group_threshold:
raise MnemonicError(
'Invalid mnemonic "{} ...". Group threshold cannot be greater than group count.'.format(
" ".join(mnemonic.split()[: self.ID_EXP_LENGTH_WORDS + 2])
)
)
value_byte_count = (10 * len(value_data) - padding_len) // 8
value_int = self._int_from_indices(value_data)
if value_data[0] >= 1 << (10 - padding_len):
raise MnemonicError("Invalid mnemonic padding.")
raise MnemonicError('Invalid mnemonic padding for "{} ...".'.format(" ".join(mnemonic.split()[: self.ID_EXP_LENGTH_WORDS + 2])))
value = value_int.to_bytes(value_byte_count, "big")
return (
identifier,
iteration_exponent,
group_index,
group_threshold,
group_threshold + 1,
group_count + 1,
member_index,
member_threshold,
member_threshold + 1,
value,
)
@ -400,14 +368,16 @@ class ShamirMnemonic(object):
identifiers = set()
iteration_exponents = set()
group_thresholds = set()
group_counts = set()
groups = {} # { group_index : [member_threshold, set_of_member_shares] }
for mnemonic in mnemonics:
identifier, iteration_exponent, group_index, group_threshold, member_index, member_threshold, share_value = self.decode_mnemonic(
identifier, iteration_exponent, group_index, group_threshold, group_count, member_index, member_threshold, share_value = self.decode_mnemonic(
mnemonic
)
identifiers.add(identifier)
iteration_exponents.add(iteration_exponent)
group_thresholds.add(group_threshold)
group_counts.add(group_count)
group = groups.setdefault(group_index, [member_threshold, set()])
if group[0] != member_threshold:
raise MnemonicError(
@ -427,10 +397,22 @@ class ShamirMnemonic(object):
"Invalid set of mnemonics. All mnemonics must have the same group threshold."
)
if len(group_counts) != 1:
raise MnemonicError(
"Invalid set of mnemonics. All mnemonics must have the same group count."
)
for group_index, group in groups.items():
if len(set(share[0] for share in group[1])) != len(group[1]):
raise MnemonicError(
"Invalid set of shares. Member indices in each group must be unique."
)
return (
identifiers.pop(),
iteration_exponents.pop(),
group_thresholds.pop(),
group_counts.pop(),
groups,
)
@ -502,6 +484,7 @@ class ShamirMnemonic(object):
iteration_exponent,
group_index,
group_threshold,
len(groups),
member_index,
member_threshold,
value,
@ -576,7 +559,7 @@ class ShamirMnemonic(object):
if not mnemonics:
raise MnemonicError("The list of mnemonics is empty.")
identifier, iteration_exponent, group_threshold, groups = self._decode_mnemonics(
identifier, iteration_exponent, group_threshold, group_count, groups = self._decode_mnemonics(
mnemonics
)
@ -599,7 +582,7 @@ class ShamirMnemonic(object):
if len(groups) < group_threshold:
group_index, group = next(iter(bad_groups.items()))
prefix = self._group_prefix(
identifier, iteration_exponent, group_index, group_threshold
identifier, iteration_exponent, group_index, group_threshold, group_count
)
raise MnemonicError(
'Insufficient number of mnemonics. At least {} mnemonics starting with "{} ..." are required.'.format(

@ -19,255 +19,301 @@ vectors = [
],
[
[
"shadow pistol academic axis adequate wildlife fancy gross oasis cylinder mustang wrist rescue view short owner flip usual wolf desktop",
"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 always acid license obtain preach firefly permit flavor library learn tension flea unusual nylon funding civil armed"
"shadow pistol academic agency acid license obtain preach firefly permit flavor library learn tension flea unusual nylon terminal exercise become"
],
"b43ceb7e57a0ea8766221624d01b0864"
],
[
[
"shadow pistol academic axis adequate wildlife fancy gross oasis cylinder mustang wrist rescue view short owner flip usual wolf desktop",
"shadow pistol academic always acid license obtain preach firefly permit flavor library learn tension flea unusual nylon funding civil armed"
"shadow pistol academic always adequate wildlife fancy gross oasis cylinder mustang wrist rescue view short owner flip making coding armed",
"shadow pistol academic agency acid license obtain preach firefly permit flavor library learn tension flea unusual nylon terminal exercise become"
],
"b43ceb7e57a0ea8766221624d01b0864"
],
[
[
"shadow pistol academic axis adequate wildlife fancy gross oasis cylinder mustang wrist rescue view short owner flip usual wolf desktop"
"shadow pistol academic always adequate wildlife fancy gross oasis cylinder mustang wrist rescue view short owner flip making coding armed"
],
""
],
[
[
"numb stay academic acid aide deny bulge romp kernel rumor flavor estate traffic video email living grief move corner laundry",
"numb smoking academic always cleanup false acne luxury withdraw swing ceramic adjust forget editor remind bedroom practice forget dynamic yelp"
"numb smoking academic agency cleanup false acne luxury withdraw swing ceramic adjust forget editor remind bedroom practice ting fancy theory"
],
""
],
[
[
"enlarge pants academic acid alien become warmth exclude unfold yield square unusual increase chest wireless rainbow duration cause wrote taste",
"enlarge painting academic always anatomy infant carve platform nail already flavor mailman iris video beam rapids smoking frequent animal exclude"
"enlarge painting academic agency anatomy infant carve platform nail already flavor mailman iris video beam rapids smoking teacher gross failure"
],
""
],
[
[
"script smoking academic away diet theater twin guard already image increase trash lend pink general crowd chest mailman dough wavy",
"script smoking always acid blimp diminish pencil curious vampire devote valuable skin mama starting tension explain elegant formal maximum uncover",
"script smoking always always charity clock join peasant acquire tidy dress drove width depend smart trust guitar coding eyebrow realize"
"script smoking academic enlarge diet theater twin guard already image increase trash lend pink general crowd chest remind faint literary",
"script smoking beard echo blimp diminish pencil curious vampire devote valuable skin mama starting tension explain elegant surface venture judicial",
"script smoking beard email charity clock join peasant acquire tidy dress drove width depend smart trust guitar bulb echo duration"
],
""
],
[
[
"scroll leader academic academic become alcohol adapt tactics born orange eraser mobile fragment playoff easel nail edge climate exotic sack",
"scroll leader academic always alcohol rhyme excuse image wolf sidewalk index yoga upgrade flip inmate blue relate fitness tension desktop"
"scroll leader academic leaf become alcohol adapt tactics born orange eraser mobile fragment playoff easel nail edge sympathy liberty closet",
"scroll leader academic agency alcohol rhyme excuse image wolf sidewalk index yoga upgrade flip inmate blue relate twin mental corner"
],
""
],
[
[
"client isolate academic acid destroy advance depart legs behavior drug spirit aquatic cultural explain arena debut metric round slavery engage",
"client isolate academic always campus verdict wine lunch rapids born warn spend patent surface elevator satoshi upgrade identify calcium salary"
"client isolate acrobat acid chew both garlic holy artist gums already package spray story remind tricycle texture trouble amazing evil",
"client isolate acrobat agency daisy retreat slush genuine trip overall burden beyond enforce shaft decrease loud crazy exact round answer",
"client isolate beard academic campus verdict wine lunch rapids born warn spend patent surface elevator satoshi upgrade general echo legs"
],
""
],
[
[
"fancy merchant always academic blimp primary adorn hormone display pencil laundry olympic midst omit wits pink frequent single blind taxi"
"involve deal academic always boundary formal answer genius science civil envy thunder duckling trip tracks exceed response grin humidity wolf",
"involve deal academic agency civil revenue program sharp merchant false ending credit wrote slush simple gather fiber justice emphasis hand",
"involve deal academic always display memory damage center promise rumor drove subject large payment spelling alpha twin browser dilemma revenue"
],
""
],
[
[
"fancy merchant brave cause cinema category game include vintage withdraw hush loud aluminum spark garbage ranked priest reaction piece threaten",
"fancy merchant brave brave cricket starting employer corner slap alien username grief artist timber golden famous unusual march terminal skin"
"patrol necklace academic academic dream empty advance artist hush prayer galaxy adequate camera presence patrol entrance excuse quantity gesture cradle",
"patrol necklace academic agency duckling kidney prize desire forecast imply moisture envy express beyond that profile involve dance much auction"
],
""
],
[
[
"fancy merchant brave axis depict equip display friendly pumps vanish fraction traffic multiple unusual jump lunch ruin quantity lamp volume",
"fancy merchant always academic blimp primary adorn hormone display pencil laundry olympic midst omit wits pink frequent single blind taxi"
"drift deal academic acid acquire busy elephant crucial thumb jewelry lift agency amazing laden isolate negative smoking campus march teaspoon",
"drift deal academic agency adequate pants adjust cards champion aunt strategy fatigue observe aircraft valuable primary dominant webcam bike wits"
],
""
],
[
[
"fancy merchant brave axis depict equip display friendly pumps vanish fraction traffic multiple unusual jump lunch ruin quantity lamp volume",
"fancy merchant axis axle ajar depart gross hearing rich arena favorite calcium verdict mild teacher parking pile activity flavor agree",
"fancy merchant brave brave cricket starting employer corner slap alien username grief artist timber golden famous unusual march terminal skin",
"fancy merchant axis acne adult regular petition that advance carve dilemma pulse venture academic fantasy union escape expand meaning fused",
"fancy merchant axis ceiling acne manager ceiling credit easy ocean maiden manual unkind guilt length solution sugar deploy improve weapon"
"memory stay beard romp depend idle unfold stilt thorn obesity alarm slap thumb says python ordinary mineral insect square cards"
],
"dfd7cbf25806fe5e6125d9602d50d571"
""
],
[
[
"memory stay decision spew duckling carve single profile frozen result forbid pecan game greatest shaped advance craft golden visitor fangs",
"memory stay decision roster deliver organize olympic quantity clogs gather goat energy literary library pupal exotic season index yelp vexed"
],
""
],
[
[
"memory stay decision shadow always sheriff rich wine wrote raspy vintage boring careful recover overall reaction bishop writing blessing corner",
"memory stay beard romp depend idle unfold stilt thorn obesity alarm slap thumb says python ordinary mineral insect square cards"
],
""
],
[
[
"memory stay decision smug acid device switch likely fatal starting cluster fiction puny view trust program painting paper recover luxury",
"memory stay ceramic snake clothes loan company credit phantom blessing jewelry welcome smith legs unknown paid moisture unwrap become lobe",
"memory stay decision spew duckling carve single profile frozen result forbid pecan game greatest shaped advance craft golden visitor fangs",
"memory stay ceramic shaft cause receiver geology space ancient shelter tension universe radar learn round shrimp deal fragment desire hormone",
"memory stay ceramic round duration snapshot orbit cage debris script herald item have election adequate pink artist profile born eclipse"
],
"97a292a5941682d7a4ae2d898d11a519"
],
[
[
"fancy merchant always academic blimp primary adorn hormone display pencil laundry olympic midst omit wits pink frequent single blind taxi",
"fancy merchant acid academic aluminum march plains friendly belong civil formal check shrimp arena wits texture smell detailed exclude sympathy"
"memory stay beard romp depend idle unfold stilt thorn obesity alarm slap thumb says python ordinary mineral insect square cards",
"memory stay acrobat romp dilemma echo ruler process vintage leaves detailed speak tolerate timber lunch damage strategy junior element prevent"
],
"dfd7cbf25806fe5e6125d9602d50d571"
"97a292a5941682d7a4ae2d898d11a519"
],
[
[
"fancy merchant brave always breathe upgrade response salon income view slim task welcome valid freshman ending desert usher general emerald",
"fancy merchant axis axle ajar depart gross hearing rich arena favorite calcium verdict mild teacher parking pile activity flavor agree",
"fancy merchant brave cause cinema category game include vintage withdraw hush loud aluminum spark garbage ranked priest reaction piece threaten",
"fancy merchant always academic blimp primary adorn hormone display pencil laundry olympic midst omit wits pink frequent single blind taxi",
"fancy merchant axis ceiling acne manager ceiling credit easy ocean maiden manual unkind guilt length solution sugar deploy improve weapon",
"fancy merchant brave acid actress hormone royal receiver average adapt gray family genuine wildlife elegant oral bulge smell wrap laser",
"fancy merchant axis breathe clay repeat greatest making liquid flame verify trash champion realize floral golden fatal news plains advocate",
"fancy merchant acid academic aluminum march plains friendly belong civil formal check shrimp arena wits texture smell detailed exclude sympathy",
"fancy merchant brave axis depict equip display friendly pumps vanish fraction traffic multiple unusual jump lunch ruin quantity lamp volume",
"fancy merchant brave brave cricket starting employer corner slap alien username grief artist timber golden famous unusual march terminal skin",
"fancy merchant axis acne adult regular petition that advance carve dilemma pulse venture academic fantasy union escape expand meaning fused",
"fancy merchant axis amazing chew decision physics adjust dismiss email method emperor ceramic column trouble critical rival standard hush flea",
"fancy merchant brave costume document rhythm cinema album lyrics amazing suitable angry moisture story educate human likely lyrics dough talent"
"memory stay ceramic snake clothes loan company credit phantom blessing jewelry welcome smith legs unknown paid moisture unwrap become lobe",
"memory stay decision scared aquatic receiver mason package corner animal cage receiver hazard beyond merit tension exotic reaction pulse deadline",
"memory stay acrobat romp dilemma echo ruler process vintage leaves detailed speak tolerate timber lunch damage strategy junior element prevent",
"memory stay beard romp depend idle unfold stilt thorn obesity alarm slap thumb says python ordinary mineral insect square cards",
"memory stay ceramic round duration snapshot orbit cage debris script herald item have election adequate pink artist profile born eclipse",
"memory stay decision spew duckling carve single profile frozen result forbid pecan game greatest shaped advance craft golden visitor fangs",
"memory stay decision roster deliver organize olympic quantity clogs gather goat energy literary library pupal exotic season index yelp vexed",
"memory stay decision sister devote theory promise staff venture symbolic mailman timely valid counter retreat building order dominant forward verify",
"memory stay ceramic skin crowd building glimpse space angry early language mortgage burden grumpy class deadline wildlife unhappy gums thorn",
"memory stay decision smug acid device switch likely fatal starting cluster fiction puny view trust program painting paper recover luxury",
"memory stay decision shadow always sheriff rich wine wrote raspy vintage boring careful recover overall reaction bishop writing blessing corner",
"memory stay ceramic shaft cause receiver geology space ancient shelter tension universe radar learn round shrimp deal fragment desire hormone",
"memory stay ceramic scatter detailed knit oral cage decent debut upstairs adequate science petition temple exchange scroll camera evaluate shrimp"
],
"dfd7cbf25806fe5e6125d9602d50d571"
"97a292a5941682d7a4ae2d898d11a519"
],
[
[
"wrap walnut academic academic acrobat duration expand loan premium lend inside prepare tricycle admit boundary visitor manual national skunk distance math admit curious involve width judicial excuse talent tension guest isolate switch research"
"spark leader academic academic artwork crazy pacific friar holy preach trust empty remember syndrome mineral aviation medical dive cluster scroll organize painting helpful critical spend smug tackle cowboy identify pitch unfair flavor percent"
],
"9e6620d8c1ce2e665eb86e1d7c3397a292a5941682d7a4ae2d898d11a51947db"
"33dfd8cc75e42477025dce88ae83e75a230086a0e00e9271f4c938b319067687"
],
[
[
"wrap walnut academic academic acrobat duration expand loan premium lend inside prepare tricycle admit boundary visitor manual national skunk distance math admit curious involve width judicial excuse talent tension guest isolate switch resident"
"spark leader academic academic artwork crazy pacific friar holy preach trust empty remember syndrome mineral aviation medical dive cluster scroll organize painting helpful critical spend smug tackle cowboy identify pitch unfair flavor pencil"
],
""
],
[
[
"wrap walnut academic academic beard duration expand loan premium lend inside prepare tricycle admit boundary visitor manual national skunk distance math admit curious involve width judicial excuse talent tension guest debut increase upstairs"
"spark leader academic academic capacity crazy pacific friar holy preach trust empty remember syndrome mineral aviation medical dive cluster scroll organize painting helpful critical spend smug tackle cowboy identify pitch permit wavy unkind"
],
""
],
[
[
"kind husky academic axis aspect segment scholar true dress dream evening snake unfold traveler peaceful domestic body jump purchase frozen away alcohol ultimate task lamp huge pulse literary pharmacy gather stay alarm fangs",
"kind husky academic always activity body adapt damage evening seafood brother join ceramic writing earth benefit busy luck pumps garden benefit have axis busy golden pulse maiden aspect identify improve dilemma enlarge prospect",
"kind husky academic acid animal client racism ranked alarm umbrella tactics scroll veteran smart evidence always literary prize provide inside mason sister emission jewelry orbit require guitar invasion saver edge stay space avoid"
"seafood learn academic always adult harvest inform custody space ending frequent coding lamp amazing museum year argue mandate should minister jacket float duke client survive large entrance unknown rhythm angel genuine safari talent",
"seafood learn academic agency ancient clay execute browser railroad system brother anxiety focus elephant merit standard slap numerous insect hush hospital emphasis depend nail morning epidemic lawsuit aluminum buyer drift metric meaning burning",
"seafood learn academic acid armed survive flip soul analysis crucial species similar rescue regret mixture twin marvel pleasure trend soul afraid depict rumor champion skunk bumpy obtain impulse texture fantasy year maiden kidney"
],
"af56c00ae12561c49e6afad0e741c8c1c65b2785a942808a8036335f42b2d342"
"e05e0da0ecce1278f75ff58d9853f19dcaeed5de104aae37c7af367d74bc8756"
],
[
[
"kind husky academic axis aspect segment scholar true dress dream evening snake unfold traveler peaceful domestic body jump purchase frozen away alcohol ultimate task lamp huge pulse literary pharmacy gather stay alarm fangs",
"kind husky academic acid animal client racism ranked alarm umbrella tactics scroll veteran smart evidence always literary prize provide inside mason sister emission jewelry orbit require guitar invasion saver edge stay space avoid"
"seafood learn academic acid armed survive flip soul analysis crucial species similar rescue regret mixture twin marvel pleasure trend soul afraid depict rumor champion skunk bumpy obtain impulse texture fantasy year maiden kidney",
"seafood learn academic agency ancient clay execute browser railroad system brother anxiety focus elephant merit standard slap numerous insect hush hospital emphasis depend nail morning epidemic lawsuit aluminum buyer drift metric meaning burning"
],
"af56c00ae12561c49e6afad0e741c8c1c65b2785a942808a8036335f42b2d342"
"e05e0da0ecce1278f75ff58d9853f19dcaeed5de104aae37c7af367d74bc8756"
],
[
[
"seafood learn academic agency ancient clay execute browser railroad system brother anxiety focus elephant merit standard slap numerous insect hush hospital emphasis depend nail morning epidemic lawsuit aluminum buyer drift metric meaning burning"
],
""
],
[
[
"practice enlarge academic acid born verdict dominant cylinder earth bracelet dining resident public garden desktop course fact exact vanish branch",
"practice easy academic agency advance broken firm elder exact axle plunge dream glance depict username flexible airline station include priority"
],
""
],
[
[
"expand ecology academic acid drug coastal forbid sister blanket salary unusual fridge phrase amuse hesitate repair much findings practice slavery",
"expand easy academic agency column lungs dilemma chest depict trial member intimate gums rich mayor grin husband reward western debris"
],
""
],
[
[
"kind husky academic acid animal client racism ranked alarm umbrella tactics scroll veteran smart evidence always literary prize provide inside mason sister emission jewelry orbit require guitar invasion saver edge stay space avoid"
"depart branch academic enlarge august moisture snapshot smear genuine sister order crisis gums afraid dress romantic imply corner justice center",
"depart branch beard echo dilemma likely building hand treat trial pumps writing photo fragment lunar ranked sympathy wrap alien debris",
"depart branch beard email darkness tracks national discuss fluff merit gesture order mule firefly evaluate both element adult walnut stick"
],
""
],
[
[
"racism away academic acid dough home taxi merchant research library huge problem playoff vegan velvet union slim silent walnut adapt",
"racism branch academic always crush budget grin traffic decent regret bike divorce cinema humidity dining therapy pajamas teammate birthday market"
"race flea academic leaf crazy carpet item lyrics galaxy remind lungs distance thank lunch cowboy emission fridge center music costume",
"race flea academic agency cricket response sack geology maiden spray salon enforce fishing junction oven repair video phrase pumps duration"
],
""
],
[
[
"bumpy royal academic acid downtown smear pregnant smith modern helpful explain welfare should ocean goat prayer rocky bike license either",
"bumpy romp academic always document task modify havoc sharp memory intend threaten much prayer adapt civil legal work morning trouble"
"cleanup garden acrobat acid branch idle season upstairs mountain energy aspect intimate black exchange purchase arcade making tricycle primary thunder",
"cleanup garden acrobat agency clay that finger phantom solution forward evil rival item much mansion lecture device decrease advocate ounce",
"cleanup garden beard academic cowboy desktop submit liquid branch olympic smith render category grumpy group campus impulse drift society starting"
],
""
],
[
[
"sugar pink academic away dilemma bulb task bolt kitchen dive stadium step verdict stay easel valid station animal railroad raspy",
"sugar pink always acid document sprinkle emperor decision climate presence hanger member unknown crazy center bundle filter criminal sniff taste",
"sugar pink always always depend crystal require ounce physics away fake smirk costume apart teacher unwrap resident ruler herald gather"
"paper branch academic always bolt secret senior starting society artwork ocean marathon parcel large revenue hush jerky sympathy indicate therapy",
"paper branch academic agency auction plan charity identify yelp glad webcam provide evaluate response hunting belong veteran unknown speak twin",
"paper branch academic always coastal bumpy burning nylon silent speak forward findings velvet terminal busy aircraft glasses firm extra mandate"
],
""
],
[
[
"practice easy academic academic born verdict dominant cylinder earth bracelet dining resident public garden desktop course fact ecology screw fangs",
"practice easy academic always advance broken firm elder exact axle plunge dream glance depict username flexible airline hazard cards pulse"
"payroll guest academic academic being holiday relate alive wrist shadow intimate inmate ocean method system repeat capital dress iris zero",
"payroll guest academic agency body type agree single amuse charity jump building medical omit fancy losing obtain again flash mandate"
],
""
],
[
[
"expand easy academic acid dryer coastal forbid sister blanket salary unusual fridge phrase amuse hesitate repair much taught zero deploy",
"expand easy academic always column lungs dilemma chest depict trial member intimate gums rich mayor grin husband acrobat mustang crystal"
"triumph necklace academic acid campus deadline estate corner result dress main debris research stick fawn freshman alarm obtain keyboard standard",
"triumph necklace academic agency decorate cradle charity ajar multiple station tidy cricket fiction slice midst mobile writing company chest jewelry"
],
""
],
[
[
"pencil recover always academic adequate aluminum acquire party various diet strategy ounce problem check category knit terminal hazard calcium response daisy edge extra exact snapshot warmth chemical permit faint revenue diagnose syndrome luxury"
"grumpy upgrade beard romp academic owner package lawsuit industry auction market install acrobat blimp pregnant trial agency dismiss species wildlife briefing painting mailman spine angel mental violence rainbow cowboy kidney industry friendly sled"
],
""
],
[
[
"pencil recover brave acid acrobat impact weapon credit legend velvet black trouble slim merit cubic marathon group failure alien slap aquatic software lift clothes shrimp overall black zero goat cinema duration response emission",
"pencil recover brave brave acne hairy exhaust leaf aide easy piece decrease jury enjoy year black identify therapy national boundary typical advocate that pants velvet prospect legend identify evening dance merit nuclear vintage"
"grumpy upgrade decision shadow aspect transfer mailman intimate payroll raspy mother sack unfair soul famous ladybug leaf width evaluate acrobat envy mailman crystal rich spark forbid revenue findings permit formal sled twice unknown",
"grumpy upgrade decision spew advance column ladybug hanger ancestor cinema require material dwarf laden peanut teacher market parking typical space quantity mayor dynamic radar paid leaves swimming writing flip style fishing yield award"
],
""
],
[
[
"pencil recover brave axis academic garden cinema drug lunar type early fused invasion invasion prospect regular license escape bedroom froth survive exclude satisfy tackle inherit national vegan voice dream credit desert peanut example",
"pencil recover always academic adequate aluminum acquire party various diet strategy ounce problem check category knit terminal hazard calcium response daisy edge extra exact snapshot warmth chemical permit faint revenue diagnose syndrome luxury"
"grumpy upgrade decision shadow aspect transfer mailman intimate payroll raspy mother sack unfair soul famous ladybug leaf width evaluate acrobat envy mailman crystal rich spark forbid revenue findings permit formal sled twice unknown",
"grumpy upgrade beard romp academic owner package lawsuit industry auction market install acrobat blimp pregnant trial agency dismiss species wildlife briefing painting mailman spine angel mental violence rainbow cowboy kidney industry friendly sled"
],
""
],
[
[
"pencil recover brave costume advocate fused dragon smug rhyme glen subject likely parcel trash educate closet frost shadow prize phrase olympic piece civil scholar class hearing provide guest repeat viral submit satisfy boundary",
"pencil recover axis acne argue decent puny round easel parking deploy slush wildlife alarm impulse pacific fantasy single crisis valuable smear velvet toxic numerous subject grant crystal mental fitness says fraction moisture upgrade",
"pencil recover axis axle artwork transfer obesity surface aircraft evidence pile papa forward machine hanger fiction garbage coastal space aluminum acid senior receiver reaction benefit findings lily nuclear paper royal video lair hazard",
"pencil recover axis breathe agency camera modern pupal august suitable mental dough multiple crazy picture silent guest wealthy force rocky drove nylon moment luck width fused decision express smug nail shadow ugly luxury",
"pencil recover brave acid acrobat impact weapon credit legend velvet black trouble slim merit cubic marathon group failure alien slap aquatic software lift clothes shrimp overall black zero goat cinema duration response emission"
"grumpy upgrade decision scared aviation echo mama junk mama robin finance industry piece rapids leader slush swimming insect holiday document ancient tofu exotic square shaped artist easel diet thorn railroad fridge hobo dictate",
"grumpy upgrade ceramic round acrobat blue enemy admit wildlife exotic inform mustang symbolic pickup salary insect plunge miracle retailer clogs shelter focus privacy bolt carbon rebound cinema tidy lying born pregnant divorce payroll",
"grumpy upgrade decision shadow aspect transfer mailman intimate payroll raspy mother sack unfair soul famous ladybug leaf width evaluate acrobat envy mailman crystal rich spark forbid revenue findings permit formal sled twice unknown",
"grumpy upgrade ceramic skin august review medical dynamic year tackle juice percent profile magazine violence arena gums anxiety move election paper withdraw petition fangs tension segment junk pickup ranked alto animal snapshot spider",
"grumpy upgrade ceramic shaft acrobat fitness much slow vintage scout agree dismiss mustang remove violence reunion kidney campus moment quarter rocky hairy calcium machine editor living floral evidence trash tracks fridge believe transfer"
],
"bee676abf5d1764175b683684999f5cf198397a70d57a33da71a4d2e6bff61bf"
"cde0a3318493262591e78b8c14c6686167123b7d868483aa5b67e2fb45294834"
],
[
[
"pencil recover always academic adequate aluminum acquire party various diet strategy ounce problem check category knit terminal hazard calcium response daisy edge extra exact snapshot warmth chemical permit faint revenue diagnose syndrome luxury",
"pencil recover acid academic album devote market modern plastic huge thunder deploy timely roster earth tracks plastic emperor radar oral leaf lyrics switch prune lair luck dictate tidy index theory junk blind unfair"
"grumpy upgrade beard romp academic owner package lawsuit industry auction market install acrobat blimp pregnant trial agency dismiss species wildlife briefing painting mailman spine angel mental violence rainbow cowboy kidney industry friendly sled",
"grumpy upgrade acrobat romp album herald epidemic rebuild alcohol rapids element receiver belong wrap liquid large script magazine pregnant election estate vegan density beard duckling counter grill island screw humidity engage wireless detect"
],
"bee676abf5d1764175b683684999f5cf198397a70d57a33da71a4d2e6bff61bf"
"cde0a3318493262591e78b8c14c6686167123b7d868483aa5b67e2fb45294834"
],
[
[
"pencil recover always academic adequate aluminum acquire party various diet strategy ounce problem check category knit terminal hazard calcium response daisy edge extra exact snapshot warmth chemical permit faint revenue diagnose syndrome luxury",
"pencil recover axis ceiling agency orbit afraid spirit cowboy orbit drug analysis museum pencil adequate bedroom physics lilac coastal orbit glance withdraw careful voice flavor capacity damage dive founder duke regular trouble single",
"pencil recover axis axle artwork transfer obesity surface aircraft evidence pile papa forward machine hanger fiction garbage coastal space aluminum acid senior receiver reaction benefit findings lily nuclear paper royal video lair hazard",
"pencil recover acid academic album devote market modern plastic huge thunder deploy timely roster earth tracks plastic emperor radar oral leaf lyrics switch prune lair luck dictate tidy index theory junk blind unfair",
"pencil recover brave costume advocate fused dragon smug rhyme glen subject likely parcel trash educate closet frost shadow prize phrase olympic piece civil scholar class hearing provide guest repeat viral submit satisfy boundary",
"pencil recover axis breathe agency camera modern pupal august suitable mental dough multiple crazy picture silent guest wealthy force rocky drove nylon moment luck width fused decision express smug nail shadow ugly luxury",
"pencil recover axis amazing agree science recover plan desert decision burning fiction devote permit result acne grant being peasant ending vanish pants scared pitch depict home numerous fluff clothes mortgage grownup acrobat beyond",
"pencil recover brave axis academic garden cinema drug lunar type early fused invasion invasion prospect regular license escape bedroom froth survive exclude satisfy tackle inherit national vegan voice dream credit desert peanut example",
"pencil recover brave always actress junk morning nail admit furl manual lilac salary pancake geology category mountain zero leaves loyalty dream package peasant flexible exchange remember guard join biology company obesity losing work",
"pencil recover brave acid acrobat impact weapon credit legend velvet black trouble slim merit cubic marathon group failure alien slap aquatic software lift clothes shrimp overall black zero goat cinema duration response emission",
"pencil recover brave brave acne hairy exhaust leaf aide easy piece decrease jury enjoy year black identify therapy national boundary typical advocate that pants velvet prospect legend identify evening dance merit nuclear vintage",
"pencil recover axis acne argue decent puny round easel parking deploy slush wildlife alarm impulse pacific fantasy single crisis valuable smear velvet toxic numerous subject grant crystal mental fitness says fraction moisture upgrade",
"pencil recover brave cause adult firefly firefly holiday drink smell election umbrella priority stay aviation magazine program gross counter ultimate pregnant trend afraid rescue pecan evil satoshi unhappy slavery valid lamp webcam prisoner"
"grumpy upgrade decision spew advance column ladybug hanger ancestor cinema require material dwarf laden peanut teacher market parking typical space quantity mayor dynamic radar paid leaves swimming writing flip style fishing yield award",
"grumpy upgrade decision roster acquire necklace knife laundry glimpse warmth theory dynamic valuable flash slow fridge ivory usher loan volume scatter knife numerous artwork pajamas response editor deploy crucial problem material fatal various",
"grumpy upgrade beard romp academic owner package lawsuit industry auction market install acrobat blimp pregnant trial agency dismiss species wildlife briefing painting mailman spine angel mental violence rainbow cowboy kidney industry friendly sled",
"grumpy upgrade decision scared aviation echo mama junk mama robin finance industry piece rapids leader slush swimming insect holiday document ancient tofu exotic square shaped artist easel diet thorn railroad fridge hobo dictate",
"grumpy upgrade acrobat romp album herald epidemic rebuild alcohol rapids element receiver belong wrap liquid large script magazine pregnant election estate vegan density beard duckling counter grill island screw humidity engage wireless detect",
"grumpy upgrade ceramic snake ambition strike estate dance multiple clothes mixture cubic staff very husband valid burning sheriff emission raisin huge snake merchant omit firm security deadline home cleanup chubby airport forget taxi",
"grumpy upgrade ceramic skin august review medical dynamic year tackle juice percent profile magazine violence arena gums anxiety move election paper withdraw petition fangs tension segment junk pickup ranked alto animal snapshot spider",
"grumpy upgrade decision smug arena zero lunch hobo testify graduate artist seafood gums olympic unfair include counter climate alto carve ladle blind traffic huge vitamins declare patent window music romp lobe rumor silent",
"grumpy upgrade decision shadow aspect transfer mailman intimate payroll raspy mother sack unfair soul famous ladybug leaf width evaluate acrobat envy mailman crystal rich spark forbid revenue findings permit formal sled twice unknown",
"grumpy upgrade ceramic shaft acrobat fitness much slow vintage scout agree dismiss mustang remove violence reunion kidney campus moment quarter rocky hairy calcium machine editor living floral evidence trash tracks fridge believe transfer",
"grumpy upgrade decision sister actress decent keyboard imply evening valid chemical makeup resident deploy calcium undergo clay lawsuit pants single loan become wine gravity repair training says eyebrow hawk ecology camera spirit crowd",
"grumpy upgrade ceramic scatter august wits fragment very username finger ancient angel tidy mustang salary scandal rhythm liquid reunion spew standard skunk born skunk reward vintage activity amuse spray voice welcome warmth paces",
"grumpy upgrade ceramic round acrobat blue enemy admit wildlife exotic inform mustang symbolic pickup salary insect plunge miracle retailer clogs shelter focus privacy bolt carbon rebound cinema tidy lying born pregnant divorce payroll"
],
"bee676abf5d1764175b683684999f5cf198397a70d57a33da71a4d2e6bff61bf"
"cde0a3318493262591e78b8c14c6686167123b7d868483aa5b67e2fb45294834"
],
[
[
"lobe walnut academic academic acid rich both twin award sniff group category credit daisy mortgage island ocean likely ending"
"home aluminum academic academic acid member verdict purchase blind camera duration email fortune forbid obtain birthday mountain distance agree"
],
""
],
[
[
"march taught academic academic award vexed worthy surprise texture facility idea capacity wisdom agree injury execute finance tadpole artist dramatic bracelet"
"regular guest academic academic award saver tidy filter destroy infant luxury pants member boundary valid hesitate mama hairy avoid insect acrobat"
],
""
]

Loading…
Cancel
Save