diff --git a/src/trezor/crypto/slip39.py b/src/trezor/crypto/slip39.py index 2e12d41a2a..5f6cd8b947 100644 --- a/src/trezor/crypto/slip39.py +++ b/src/trezor/crypto/slip39.py @@ -18,14 +18,13 @@ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # -from trezor.crypto import pbkdf2 -from trezor.crypto import hmac -from trezor.crypto import hashlib import math + +from trezor.crypto import hashlib, hmac, pbkdf2, random from trezor.crypto.slip39_wordlist import wordlist -from trezor.crypto import random from trezorcrypto import shamir + class ConfigurationError(Exception): pass @@ -150,9 +149,7 @@ class ShamirMnemonic(object): def _int_to_indices(value, length, bits): """Converts an integer value to indices in big endian order.""" mask = (1 << bits) - 1 - return ( - (value >> (i * bits)) & mask for i in reversed(range(length)) - ) + return ((value >> (i * bits)) & mask for i in reversed(range(length))) def mnemonic_from_indices(self, indices): return " ".join(wordlist[i] for i in indices) @@ -166,7 +163,12 @@ class ShamirMnemonic(object): @classmethod def _round_function(cls, i, passphrase, e, salt, r): """The round function used internally by the Feistel cipher.""" - return pbkdf2(pbkdf2.HMAC_SHA256, bytes([i]) + passphrase, salt + r, (cls.MIN_ITERATION_COUNT << e) // cls.ROUND_COUNT).key()[:len(r)] + return pbkdf2( + pbkdf2.HMAC_SHA256, + bytes([i]) + passphrase, + salt + r, + (cls.MIN_ITERATION_COUNT << e) // cls.ROUND_COUNT, + ).key()[: len(r)] @classmethod def _get_salt(cls, identifier): @@ -227,8 +229,7 @@ class ShamirMnemonic(object): ) shares = [ - (i, random.bytes(len(shared_secret))) - for i in range(random_share_count) + (i, random.bytes(len(shared_secret))) for i in range(random_share_count) ] random_part = random.bytes(len(shared_secret) - self.DIGEST_LENGTH_BYTES) @@ -263,8 +264,12 @@ class ShamirMnemonic(object): 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, cls.RADIX_BITS)) + ( - (group_index << 6) + ((group_threshold - 1) << 2) + ((group_count - 1) >> 2), + 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( @@ -299,9 +304,17 @@ class ShamirMnemonic(object): share_data = ( self._group_prefix( - identifier, iteration_exponent, group_index, group_threshold, group_count + identifier, + iteration_exponent, + group_index, + group_threshold, + group_count, + ) + + ( + (((group_count - 1) & 3) << 8) + + (member_index << 4) + + (member_threshold - 1), ) - + ((((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) @@ -334,8 +347,12 @@ 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) - 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) + 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 ] @@ -350,7 +367,11 @@ class ShamirMnemonic(object): 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 for "{} ...".'.format(" ".join(mnemonic.split()[: self.ID_EXP_LENGTH_WORDS + 2]))) + 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 ( @@ -582,7 +603,11 @@ 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, group_count + identifier, + iteration_exponent, + group_index, + group_threshold, + group_count, ) raise MnemonicError( 'Insufficient number of mnemonics. At least {} mnemonics starting with "{} ..." are required.'.format( diff --git a/src/trezor/crypto/slip39_wordlist.py b/src/trezor/crypto/slip39_wordlist.py index 548bf833b8..2382137ab0 100644 --- a/src/trezor/crypto/slip39_wordlist.py +++ b/src/trezor/crypto/slip39_wordlist.py @@ -1,1026 +1,1026 @@ wordlist = ( -"academic", -"acid", -"acne", -"acquire", -"acrobat", -"activity", -"actress", -"adapt", -"adequate", -"adjust", -"admit", -"adorn", -"adult", -"advance", -"advocate", -"afraid", -"again", -"agency", -"agree", -"aide", -"aircraft", -"airline", -"airport", -"ajar", -"alarm", -"album", -"alcohol", -"alien", -"alive", -"alpha", -"already", -"alto", -"aluminum", -"always", -"amazing", -"ambition", -"amount", -"amuse", -"analysis", -"anatomy", -"ancestor", -"ancient", -"angel", -"angry", -"animal", -"answer", -"antenna", -"anxiety", -"apart", -"aquatic", -"arcade", -"arena", -"argue", -"armed", -"artist", -"artwork", -"aspect", -"auction", -"august", -"aunt", -"average", -"aviation", -"avoid", -"award", -"away", -"axis", -"axle", -"beam", -"beard", -"beaver", -"become", -"bedroom", -"behavior", -"being", -"believe", -"belong", -"benefit", -"best", -"beyond", -"bike", -"biology", -"birthday", -"bishop", -"black", -"blanket", -"blessing", -"blimp", -"blind", -"blue", -"body", -"bolt", -"boring", -"born", -"both", -"boundary", -"bracelet", -"branch", -"brave", -"breathe", -"briefing", -"broken", -"brother", -"browser", -"bucket", -"budget", -"building", -"bulb", -"bulge", -"bumpy", -"bundle", -"burden", -"burning", -"busy", -"buyer", -"cage", -"calcium", -"camera", -"campus", -"canyon", -"capacity", -"capital", -"capture", -"carbon", -"cards", -"careful", -"cargo", -"carpet", -"carve", -"category", -"cause", -"ceiling", -"center", -"ceramic", -"champion", -"change", -"charity", -"check", -"chemical", -"chest", -"chew", -"chubby", -"cinema", -"civil", -"class", -"clay", -"cleanup", -"client", -"climate", -"clinic", -"clock", -"clogs", -"closet", -"clothes", -"club", -"cluster", -"coal", -"coastal", -"coding", -"column", -"company", -"corner", -"costume", -"counter", -"course", -"cover", -"cowboy", -"cradle", -"craft", -"crazy", -"credit", -"cricket", -"criminal", -"crisis", -"critical", -"crowd", -"crucial", -"crunch", -"crush", -"crystal", -"cubic", -"cultural", -"curious", -"curly", -"custody", -"cylinder", -"daisy", -"damage", -"dance", -"darkness", -"database", -"daughter", -"deadline", -"deal", -"debris", -"debut", -"decent", -"decision", -"declare", -"decorate", -"decrease", -"deliver", -"demand", -"density", -"deny", -"depart", -"depend", -"depict", -"deploy", -"describe", -"desert", -"desire", -"desktop", -"destroy", -"detailed", -"detect", -"device", -"devote", -"diagnose", -"dictate", -"diet", -"dilemma", -"diminish", -"dining", -"diploma", -"disaster", -"discuss", -"disease", -"dish", -"dismiss", -"display", -"distance", -"dive", -"divorce", -"document", -"domain", -"domestic", -"dominant", -"dough", -"downtown", -"dragon", -"dramatic", -"dream", -"dress", -"drift", -"drink", -"drove", -"drug", -"dryer", -"duckling", -"duke", -"duration", -"dwarf", -"dynamic", -"early", -"earth", -"easel", -"easy", -"echo", -"eclipse", -"ecology", -"edge", -"editor", -"educate", -"either", -"elbow", -"elder", -"election", -"elegant", -"element", -"elephant", -"elevator", -"elite", -"else", -"email", -"emerald", -"emission", -"emperor", -"emphasis", -"employer", -"empty", -"ending", -"endless", -"endorse", -"enemy", -"energy", -"enforce", -"engage", -"enjoy", -"enlarge", -"entrance", -"envelope", -"envy", -"epidemic", -"episode", -"equation", -"equip", -"eraser", -"erode", -"escape", -"estate", -"estimate", -"evaluate", -"evening", -"evidence", -"evil", -"evoke", -"exact", -"example", -"exceed", -"exchange", -"exclude", -"excuse", -"execute", -"exercise", -"exhaust", -"exotic", -"expand", -"expect", -"explain", -"express", -"extend", -"extra", -"eyebrow", -"facility", -"fact", -"failure", -"faint", -"fake", -"false", -"family", -"famous", -"fancy", -"fangs", -"fantasy", -"fatal", -"fatigue", -"favorite", -"fawn", -"fiber", -"fiction", -"filter", -"finance", -"findings", -"finger", -"firefly", -"firm", -"fiscal", -"fishing", -"fitness", -"flame", -"flash", -"flavor", -"flea", -"flexible", -"flip", -"float", -"floral", -"fluff", -"focus", -"forbid", -"force", -"forecast", -"forget", -"formal", -"fortune", -"forward", -"founder", -"fraction", -"fragment", -"frequent", -"freshman", -"friar", -"fridge", -"friendly", -"frost", -"froth", -"frozen", -"fumes", -"funding", -"furl", -"fused", -"galaxy", -"game", -"garbage", -"garden", -"garlic", -"gasoline", -"gather", -"general", -"genius", -"genre", -"genuine", -"geology", -"gesture", -"glad", -"glance", -"glasses", -"glen", -"glimpse", -"goat", -"golden", -"graduate", -"grant", -"grasp", -"gravity", -"gray", -"greatest", -"grief", -"grill", -"grin", -"grocery", -"gross", -"group", -"grownup", -"grumpy", -"guard", -"guest", -"guilt", -"guitar", -"gums", -"hairy", -"hamster", -"hand", -"hanger", -"harvest", -"have", -"havoc", -"hawk", -"hazard", -"headset", -"health", -"hearing", -"heat", -"helpful", -"herald", -"herd", -"hesitate", -"hobo", -"holiday", -"holy", -"home", -"hormone", -"hospital", -"hour", -"huge", -"human", -"humidity", -"hunting", -"husband", -"hush", -"husky", -"hybrid", -"idea", -"identify", -"idle", -"image", -"impact", -"imply", -"improve", -"impulse", -"include", -"income", -"increase", -"index", -"indicate", -"industry", -"infant", -"inform", -"inherit", -"injury", -"inmate", -"insect", -"inside", -"install", -"intend", -"intimate", -"invasion", -"involve", -"iris", -"island", -"isolate", -"item", -"ivory", -"jacket", -"jerky", -"jewelry", -"join", -"judicial", -"juice", -"jump", -"junction", -"junior", -"junk", -"jury", -"justice", -"kernel", -"keyboard", -"kidney", -"kind", -"kitchen", -"knife", -"knit", -"laden", -"ladle", -"ladybug", -"lair", -"lamp", -"language", -"large", -"laser", -"laundry", -"lawsuit", -"leader", -"leaf", -"learn", -"leaves", -"lecture", -"legal", -"legend", -"legs", -"lend", -"length", -"level", -"liberty", -"library", -"license", -"lift", -"likely", -"lilac", -"lily", -"lips", -"liquid", -"listen", -"literary", -"living", -"lizard", -"loan", -"lobe", -"location", -"losing", -"loud", -"loyalty", -"luck", -"lunar", -"lunch", -"lungs", -"luxury", -"lying", -"lyrics", -"machine", -"magazine", -"maiden", -"mailman", -"main", -"makeup", -"making", -"mama", -"manager", -"mandate", -"mansion", -"manual", -"marathon", -"march", -"market", -"marvel", -"mason", -"material", -"math", -"maximum", -"mayor", -"meaning", -"medal", -"medical", -"member", -"memory", -"mental", -"merchant", -"merit", -"method", -"metric", -"midst", -"mild", -"military", -"mineral", -"minister", -"miracle", -"mixed", -"mixture", -"mobile", -"modern", -"modify", -"moisture", -"moment", -"morning", -"mortgage", -"mother", -"mountain", -"mouse", -"move", -"much", -"mule", -"multiple", -"muscle", -"museum", -"music", -"mustang", -"nail", -"national", -"necklace", -"negative", -"nervous", -"network", -"news", -"nuclear", -"numb", -"numerous", -"nylon", -"oasis", -"obesity", -"object", -"observe", -"obtain", -"ocean", -"often", -"olympic", -"omit", -"oral", -"orange", -"orbit", -"order", -"ordinary", -"organize", -"ounce", -"oven", -"overall", -"owner", -"paces", -"pacific", -"package", -"paid", -"painting", -"pajamas", -"pancake", -"pants", -"papa", -"paper", -"parcel", -"parking", -"party", -"patent", -"patrol", -"payment", -"payroll", -"peaceful", -"peanut", -"peasant", -"pecan", -"penalty", -"pencil", -"percent", -"perfect", -"permit", -"petition", -"phantom", -"pharmacy", -"photo", -"phrase", -"physics", -"pickup", -"picture", -"piece", -"pile", -"pink", -"pipeline", -"pistol", -"pitch", -"plains", -"plan", -"plastic", -"platform", -"playoff", -"pleasure", -"plot", -"plunge", -"practice", -"prayer", -"preach", -"predator", -"pregnant", -"premium", -"prepare", -"presence", -"prevent", -"priest", -"primary", -"priority", -"prisoner", -"privacy", -"prize", -"problem", -"process", -"profile", -"program", -"promise", -"prospect", -"provide", -"prune", -"public", -"pulse", -"pumps", -"punish", -"puny", -"pupal", -"purchase", -"purple", -"python", -"quantity", -"quarter", -"quick", -"quiet", -"race", -"racism", -"radar", -"railroad", -"rainbow", -"raisin", -"random", -"ranked", -"rapids", -"raspy", -"reaction", -"realize", -"rebound", -"rebuild", -"recall", -"receiver", -"recover", -"regret", -"regular", -"reject", -"relate", -"remember", -"remind", -"remove", -"render", -"repair", -"repeat", -"replace", -"require", -"rescue", -"research", -"resident", -"response", -"result", -"retailer", -"retreat", -"reunion", -"revenue", -"review", -"reward", -"rhyme", -"rhythm", -"rich", -"rival", -"river", -"robin", -"rocky", -"romantic", -"romp", -"roster", -"round", -"royal", -"ruin", -"ruler", -"rumor", -"sack", -"safari", -"salary", -"salon", -"salt", -"satisfy", -"satoshi", -"saver", -"says", -"scandal", -"scared", -"scatter", -"scene", -"scholar", -"science", -"scout", -"scramble", -"screw", -"script", -"scroll", -"seafood", -"season", -"secret", -"security", -"segment", -"senior", -"shadow", -"shaft", -"shame", -"shaped", -"sharp", -"shelter", -"sheriff", -"short", -"should", -"shrimp", -"sidewalk", -"silent", -"silver", -"similar", -"simple", -"single", -"sister", -"skin", -"skunk", -"slap", -"slavery", -"sled", -"slice", -"slim", -"slow", -"slush", -"smart", -"smear", -"smell", -"smirk", -"smith", -"smoking", -"smug", -"snake", -"snapshot", -"sniff", -"society", -"software", -"soldier", -"solution", -"soul", -"source", -"space", -"spark", -"speak", -"species", -"spelling", -"spend", -"spew", -"spider", -"spill", -"spine", -"spirit", -"spit", -"spray", -"sprinkle", -"square", -"squeeze", -"stadium", -"staff", -"standard", -"starting", -"station", -"stay", -"steady", -"step", -"stick", -"stilt", -"story", -"strategy", -"strike", -"style", -"subject", -"submit", -"sugar", -"suitable", -"sunlight", -"superior", -"surface", -"surprise", -"survive", -"sweater", -"swimming", -"swing", -"switch", -"symbolic", -"sympathy", -"syndrome", -"system", -"tackle", -"tactics", -"tadpole", -"talent", -"task", -"taste", -"taught", -"taxi", -"teacher", -"teammate", -"teaspoon", -"temple", -"tenant", -"tendency", -"tension", -"terminal", -"testify", -"texture", -"thank", -"that", -"theater", -"theory", -"therapy", -"thorn", -"threaten", -"thumb", -"thunder", -"ticket", -"tidy", -"timber", -"timely", -"ting", -"tofu", -"together", -"tolerate", -"total", -"toxic", -"tracks", -"traffic", -"training", -"transfer", -"trash", -"traveler", -"treat", -"trend", -"trial", -"tricycle", -"trip", -"triumph", -"trouble", -"true", -"trust", -"twice", -"twin", -"type", -"typical", -"ugly", -"ultimate", -"umbrella", -"uncover", -"undergo", -"unfair", -"unfold", -"unhappy", -"union", -"universe", -"unkind", -"unknown", -"unusual", -"unwrap", -"upgrade", -"upstairs", -"username", -"usher", -"usual", -"valid", -"valuable", -"vampire", -"vanish", -"various", -"vegan", -"velvet", -"venture", -"verdict", -"verify", -"very", -"veteran", -"vexed", -"victim", -"video", -"view", -"vintage", -"violence", -"viral", -"visitor", -"visual", -"vitamins", -"vocal", -"voice", -"volume", -"voter", -"voting", -"walnut", -"warmth", -"warn", -"watch", -"wavy", -"wealthy", -"weapon", -"webcam", -"welcome", -"welfare", -"western", -"width", -"wildlife", -"window", -"wine", -"wireless", -"wisdom", -"withdraw", -"wits", -"wolf", -"woman", -"work", -"worthy", -"wrap", -"wrist", -"writing", -"wrote", -"year", -"yelp", -"yield", -"yoga", -"zero" + "academic", + "acid", + "acne", + "acquire", + "acrobat", + "activity", + "actress", + "adapt", + "adequate", + "adjust", + "admit", + "adorn", + "adult", + "advance", + "advocate", + "afraid", + "again", + "agency", + "agree", + "aide", + "aircraft", + "airline", + "airport", + "ajar", + "alarm", + "album", + "alcohol", + "alien", + "alive", + "alpha", + "already", + "alto", + "aluminum", + "always", + "amazing", + "ambition", + "amount", + "amuse", + "analysis", + "anatomy", + "ancestor", + "ancient", + "angel", + "angry", + "animal", + "answer", + "antenna", + "anxiety", + "apart", + "aquatic", + "arcade", + "arena", + "argue", + "armed", + "artist", + "artwork", + "aspect", + "auction", + "august", + "aunt", + "average", + "aviation", + "avoid", + "award", + "away", + "axis", + "axle", + "beam", + "beard", + "beaver", + "become", + "bedroom", + "behavior", + "being", + "believe", + "belong", + "benefit", + "best", + "beyond", + "bike", + "biology", + "birthday", + "bishop", + "black", + "blanket", + "blessing", + "blimp", + "blind", + "blue", + "body", + "bolt", + "boring", + "born", + "both", + "boundary", + "bracelet", + "branch", + "brave", + "breathe", + "briefing", + "broken", + "brother", + "browser", + "bucket", + "budget", + "building", + "bulb", + "bulge", + "bumpy", + "bundle", + "burden", + "burning", + "busy", + "buyer", + "cage", + "calcium", + "camera", + "campus", + "canyon", + "capacity", + "capital", + "capture", + "carbon", + "cards", + "careful", + "cargo", + "carpet", + "carve", + "category", + "cause", + "ceiling", + "center", + "ceramic", + "champion", + "change", + "charity", + "check", + "chemical", + "chest", + "chew", + "chubby", + "cinema", + "civil", + "class", + "clay", + "cleanup", + "client", + "climate", + "clinic", + "clock", + "clogs", + "closet", + "clothes", + "club", + "cluster", + "coal", + "coastal", + "coding", + "column", + "company", + "corner", + "costume", + "counter", + "course", + "cover", + "cowboy", + "cradle", + "craft", + "crazy", + "credit", + "cricket", + "criminal", + "crisis", + "critical", + "crowd", + "crucial", + "crunch", + "crush", + "crystal", + "cubic", + "cultural", + "curious", + "curly", + "custody", + "cylinder", + "daisy", + "damage", + "dance", + "darkness", + "database", + "daughter", + "deadline", + "deal", + "debris", + "debut", + "decent", + "decision", + "declare", + "decorate", + "decrease", + "deliver", + "demand", + "density", + "deny", + "depart", + "depend", + "depict", + "deploy", + "describe", + "desert", + "desire", + "desktop", + "destroy", + "detailed", + "detect", + "device", + "devote", + "diagnose", + "dictate", + "diet", + "dilemma", + "diminish", + "dining", + "diploma", + "disaster", + "discuss", + "disease", + "dish", + "dismiss", + "display", + "distance", + "dive", + "divorce", + "document", + "domain", + "domestic", + "dominant", + "dough", + "downtown", + "dragon", + "dramatic", + "dream", + "dress", + "drift", + "drink", + "drove", + "drug", + "dryer", + "duckling", + "duke", + "duration", + "dwarf", + "dynamic", + "early", + "earth", + "easel", + "easy", + "echo", + "eclipse", + "ecology", + "edge", + "editor", + "educate", + "either", + "elbow", + "elder", + "election", + "elegant", + "element", + "elephant", + "elevator", + "elite", + "else", + "email", + "emerald", + "emission", + "emperor", + "emphasis", + "employer", + "empty", + "ending", + "endless", + "endorse", + "enemy", + "energy", + "enforce", + "engage", + "enjoy", + "enlarge", + "entrance", + "envelope", + "envy", + "epidemic", + "episode", + "equation", + "equip", + "eraser", + "erode", + "escape", + "estate", + "estimate", + "evaluate", + "evening", + "evidence", + "evil", + "evoke", + "exact", + "example", + "exceed", + "exchange", + "exclude", + "excuse", + "execute", + "exercise", + "exhaust", + "exotic", + "expand", + "expect", + "explain", + "express", + "extend", + "extra", + "eyebrow", + "facility", + "fact", + "failure", + "faint", + "fake", + "false", + "family", + "famous", + "fancy", + "fangs", + "fantasy", + "fatal", + "fatigue", + "favorite", + "fawn", + "fiber", + "fiction", + "filter", + "finance", + "findings", + "finger", + "firefly", + "firm", + "fiscal", + "fishing", + "fitness", + "flame", + "flash", + "flavor", + "flea", + "flexible", + "flip", + "float", + "floral", + "fluff", + "focus", + "forbid", + "force", + "forecast", + "forget", + "formal", + "fortune", + "forward", + "founder", + "fraction", + "fragment", + "frequent", + "freshman", + "friar", + "fridge", + "friendly", + "frost", + "froth", + "frozen", + "fumes", + "funding", + "furl", + "fused", + "galaxy", + "game", + "garbage", + "garden", + "garlic", + "gasoline", + "gather", + "general", + "genius", + "genre", + "genuine", + "geology", + "gesture", + "glad", + "glance", + "glasses", + "glen", + "glimpse", + "goat", + "golden", + "graduate", + "grant", + "grasp", + "gravity", + "gray", + "greatest", + "grief", + "grill", + "grin", + "grocery", + "gross", + "group", + "grownup", + "grumpy", + "guard", + "guest", + "guilt", + "guitar", + "gums", + "hairy", + "hamster", + "hand", + "hanger", + "harvest", + "have", + "havoc", + "hawk", + "hazard", + "headset", + "health", + "hearing", + "heat", + "helpful", + "herald", + "herd", + "hesitate", + "hobo", + "holiday", + "holy", + "home", + "hormone", + "hospital", + "hour", + "huge", + "human", + "humidity", + "hunting", + "husband", + "hush", + "husky", + "hybrid", + "idea", + "identify", + "idle", + "image", + "impact", + "imply", + "improve", + "impulse", + "include", + "income", + "increase", + "index", + "indicate", + "industry", + "infant", + "inform", + "inherit", + "injury", + "inmate", + "insect", + "inside", + "install", + "intend", + "intimate", + "invasion", + "involve", + "iris", + "island", + "isolate", + "item", + "ivory", + "jacket", + "jerky", + "jewelry", + "join", + "judicial", + "juice", + "jump", + "junction", + "junior", + "junk", + "jury", + "justice", + "kernel", + "keyboard", + "kidney", + "kind", + "kitchen", + "knife", + "knit", + "laden", + "ladle", + "ladybug", + "lair", + "lamp", + "language", + "large", + "laser", + "laundry", + "lawsuit", + "leader", + "leaf", + "learn", + "leaves", + "lecture", + "legal", + "legend", + "legs", + "lend", + "length", + "level", + "liberty", + "library", + "license", + "lift", + "likely", + "lilac", + "lily", + "lips", + "liquid", + "listen", + "literary", + "living", + "lizard", + "loan", + "lobe", + "location", + "losing", + "loud", + "loyalty", + "luck", + "lunar", + "lunch", + "lungs", + "luxury", + "lying", + "lyrics", + "machine", + "magazine", + "maiden", + "mailman", + "main", + "makeup", + "making", + "mama", + "manager", + "mandate", + "mansion", + "manual", + "marathon", + "march", + "market", + "marvel", + "mason", + "material", + "math", + "maximum", + "mayor", + "meaning", + "medal", + "medical", + "member", + "memory", + "mental", + "merchant", + "merit", + "method", + "metric", + "midst", + "mild", + "military", + "mineral", + "minister", + "miracle", + "mixed", + "mixture", + "mobile", + "modern", + "modify", + "moisture", + "moment", + "morning", + "mortgage", + "mother", + "mountain", + "mouse", + "move", + "much", + "mule", + "multiple", + "muscle", + "museum", + "music", + "mustang", + "nail", + "national", + "necklace", + "negative", + "nervous", + "network", + "news", + "nuclear", + "numb", + "numerous", + "nylon", + "oasis", + "obesity", + "object", + "observe", + "obtain", + "ocean", + "often", + "olympic", + "omit", + "oral", + "orange", + "orbit", + "order", + "ordinary", + "organize", + "ounce", + "oven", + "overall", + "owner", + "paces", + "pacific", + "package", + "paid", + "painting", + "pajamas", + "pancake", + "pants", + "papa", + "paper", + "parcel", + "parking", + "party", + "patent", + "patrol", + "payment", + "payroll", + "peaceful", + "peanut", + "peasant", + "pecan", + "penalty", + "pencil", + "percent", + "perfect", + "permit", + "petition", + "phantom", + "pharmacy", + "photo", + "phrase", + "physics", + "pickup", + "picture", + "piece", + "pile", + "pink", + "pipeline", + "pistol", + "pitch", + "plains", + "plan", + "plastic", + "platform", + "playoff", + "pleasure", + "plot", + "plunge", + "practice", + "prayer", + "preach", + "predator", + "pregnant", + "premium", + "prepare", + "presence", + "prevent", + "priest", + "primary", + "priority", + "prisoner", + "privacy", + "prize", + "problem", + "process", + "profile", + "program", + "promise", + "prospect", + "provide", + "prune", + "public", + "pulse", + "pumps", + "punish", + "puny", + "pupal", + "purchase", + "purple", + "python", + "quantity", + "quarter", + "quick", + "quiet", + "race", + "racism", + "radar", + "railroad", + "rainbow", + "raisin", + "random", + "ranked", + "rapids", + "raspy", + "reaction", + "realize", + "rebound", + "rebuild", + "recall", + "receiver", + "recover", + "regret", + "regular", + "reject", + "relate", + "remember", + "remind", + "remove", + "render", + "repair", + "repeat", + "replace", + "require", + "rescue", + "research", + "resident", + "response", + "result", + "retailer", + "retreat", + "reunion", + "revenue", + "review", + "reward", + "rhyme", + "rhythm", + "rich", + "rival", + "river", + "robin", + "rocky", + "romantic", + "romp", + "roster", + "round", + "royal", + "ruin", + "ruler", + "rumor", + "sack", + "safari", + "salary", + "salon", + "salt", + "satisfy", + "satoshi", + "saver", + "says", + "scandal", + "scared", + "scatter", + "scene", + "scholar", + "science", + "scout", + "scramble", + "screw", + "script", + "scroll", + "seafood", + "season", + "secret", + "security", + "segment", + "senior", + "shadow", + "shaft", + "shame", + "shaped", + "sharp", + "shelter", + "sheriff", + "short", + "should", + "shrimp", + "sidewalk", + "silent", + "silver", + "similar", + "simple", + "single", + "sister", + "skin", + "skunk", + "slap", + "slavery", + "sled", + "slice", + "slim", + "slow", + "slush", + "smart", + "smear", + "smell", + "smirk", + "smith", + "smoking", + "smug", + "snake", + "snapshot", + "sniff", + "society", + "software", + "soldier", + "solution", + "soul", + "source", + "space", + "spark", + "speak", + "species", + "spelling", + "spend", + "spew", + "spider", + "spill", + "spine", + "spirit", + "spit", + "spray", + "sprinkle", + "square", + "squeeze", + "stadium", + "staff", + "standard", + "starting", + "station", + "stay", + "steady", + "step", + "stick", + "stilt", + "story", + "strategy", + "strike", + "style", + "subject", + "submit", + "sugar", + "suitable", + "sunlight", + "superior", + "surface", + "surprise", + "survive", + "sweater", + "swimming", + "swing", + "switch", + "symbolic", + "sympathy", + "syndrome", + "system", + "tackle", + "tactics", + "tadpole", + "talent", + "task", + "taste", + "taught", + "taxi", + "teacher", + "teammate", + "teaspoon", + "temple", + "tenant", + "tendency", + "tension", + "terminal", + "testify", + "texture", + "thank", + "that", + "theater", + "theory", + "therapy", + "thorn", + "threaten", + "thumb", + "thunder", + "ticket", + "tidy", + "timber", + "timely", + "ting", + "tofu", + "together", + "tolerate", + "total", + "toxic", + "tracks", + "traffic", + "training", + "transfer", + "trash", + "traveler", + "treat", + "trend", + "trial", + "tricycle", + "trip", + "triumph", + "trouble", + "true", + "trust", + "twice", + "twin", + "type", + "typical", + "ugly", + "ultimate", + "umbrella", + "uncover", + "undergo", + "unfair", + "unfold", + "unhappy", + "union", + "universe", + "unkind", + "unknown", + "unusual", + "unwrap", + "upgrade", + "upstairs", + "username", + "usher", + "usual", + "valid", + "valuable", + "vampire", + "vanish", + "various", + "vegan", + "velvet", + "venture", + "verdict", + "verify", + "very", + "veteran", + "vexed", + "victim", + "video", + "view", + "vintage", + "violence", + "viral", + "visitor", + "visual", + "vitamins", + "vocal", + "voice", + "volume", + "voter", + "voting", + "walnut", + "warmth", + "warn", + "watch", + "wavy", + "wealthy", + "weapon", + "webcam", + "welcome", + "welfare", + "western", + "width", + "wildlife", + "window", + "wine", + "wireless", + "wisdom", + "withdraw", + "wits", + "wolf", + "woman", + "work", + "worthy", + "wrap", + "wrist", + "writing", + "wrote", + "year", + "yelp", + "yield", + "yoga", + "zero", )