From e6597f28b0bc7ed93b75635890b139435e6427f6 Mon Sep 17 00:00:00 2001 From: Alain Brenzikofer Date: Thu, 10 Sep 2026 16:58:30 +0000 Subject: [PATCH] core: embed the BIP-39 wordlist as the upstream file The list was transcoded into Haskell, which can only be audited by reading 2048 words against the source. The upstream english.txt is vendored instead and embedded at compile time, so auditing it is one sha256sum, and a test pins that checksum so the copy cannot drift. file-embed moves into the library, where it was already a dependency of the executables and the test suite. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Rvc3HbiWBTqbAvRT45G5oX --- simplexmq.cabal | 2 + src/Simplex/Messaging/Crypto/BIP39/English.hs | 357 +-- .../Messaging/Crypto/BIP39/english.txt | 2048 +++++++++++++++++ tests/CoreTests/EthCryptoTests.hs | 5 + 4 files changed, 2062 insertions(+), 350 deletions(-) create mode 100644 src/Simplex/Messaging/Crypto/BIP39/english.txt diff --git a/simplexmq.cabal b/simplexmq.cabal index 39fb93d36..e2d774878 100644 --- a/simplexmq.cabal +++ b/simplexmq.cabal @@ -21,6 +21,7 @@ license-file: LICENSE build-type: Simple extra-source-files: README.md + src/Simplex/Messaging/Crypto/BIP39/english.txt CHANGELOG.md cbits/sha512.h cbits/sntrup761.h @@ -386,6 +387,7 @@ library , cryptostore ==0.3.* , data-default ==0.7.* , directory ==1.3.* + , file-embed >=0.0.10 && <0.1 , filepath ==1.4.* , hourglass ==0.2.* , http-types ==0.12.* diff --git a/src/Simplex/Messaging/Crypto/BIP39/English.hs b/src/Simplex/Messaging/Crypto/BIP39/English.hs index 471addb81..6aab4734e 100644 --- a/src/Simplex/Messaging/Crypto/BIP39/English.hs +++ b/src/Simplex/Messaging/Crypto/BIP39/English.hs @@ -1,359 +1,16 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE TemplateHaskell #-} --- | The BIP-39 English wordlist (2048 words), verbatim from +-- | The BIP-39 English wordlist, embedded verbatim from -- . --- SHA-256 of the source file: 2f5eed53a4727b4bf8880d8f3f199efc90e58503646d9ff8eff3a2ed3b24dbda -- --- This module is generated data; do not edit by hand. Every word is ASCII, and --- the first four bytes of each word are unique, which is what makes BIP-39 --- mnemonics unambiguous under four-letter truncation. +-- The file is the upstream one, so it is audited by checksumming it. The tests +-- pin that checksum, so this copy cannot drift. module Simplex.Messaging.Crypto.BIP39.English (englishWordList) where import Data.ByteString.Char8 (ByteString) +import qualified Data.ByteString.Char8 as BC +import Data.FileEmbed (embedFile) -- | All 2048 words, in BIP-39 index order (index 0 is @abandon@). englishWordList :: [ByteString] -englishWordList = - [ "abandon", "ability", "able", "about", "above", "absent" - , "absorb", "abstract", "absurd", "abuse", "access", "accident" - , "account", "accuse", "achieve", "acid", "acoustic", "acquire" - , "across", "act", "action", "actor", "actress", "actual" - , "adapt", "add", "addict", "address", "adjust", "admit" - , "adult", "advance", "advice", "aerobic", "affair", "afford" - , "afraid", "again", "age", "agent", "agree", "ahead" - , "aim", "air", "airport", "aisle", "alarm", "album" - , "alcohol", "alert", "alien", "all", "alley", "allow" - , "almost", "alone", "alpha", "already", "also", "alter" - , "always", "amateur", "amazing", "among", "amount", "amused" - , "analyst", "anchor", "ancient", "anger", "angle", "angry" - , "animal", "ankle", "announce", "annual", "another", "answer" - , "antenna", "antique", "anxiety", "any", "apart", "apology" - , "appear", "apple", "approve", "april", "arch", "arctic" - , "area", "arena", "argue", "arm", "armed", "armor" - , "army", "around", "arrange", "arrest", "arrive", "arrow" - , "art", "artefact", "artist", "artwork", "ask", "aspect" - , "assault", "asset", "assist", "assume", "asthma", "athlete" - , "atom", "attack", "attend", "attitude", "attract", "auction" - , "audit", "august", "aunt", "author", "auto", "autumn" - , "average", "avocado", "avoid", "awake", "aware", "away" - , "awesome", "awful", "awkward", "axis", "baby", "bachelor" - , "bacon", "badge", "bag", "balance", "balcony", "ball" - , "bamboo", "banana", "banner", "bar", "barely", "bargain" - , "barrel", "base", "basic", "basket", "battle", "beach" - , "bean", "beauty", "because", "become", "beef", "before" - , "begin", "behave", "behind", "believe", "below", "belt" - , "bench", "benefit", "best", "betray", "better", "between" - , "beyond", "bicycle", "bid", "bike", "bind", "biology" - , "bird", "birth", "bitter", "black", "blade", "blame" - , "blanket", "blast", "bleak", "bless", "blind", "blood" - , "blossom", "blouse", "blue", "blur", "blush", "board" - , "boat", "body", "boil", "bomb", "bone", "bonus" - , "book", "boost", "border", "boring", "borrow", "boss" - , "bottom", "bounce", "box", "boy", "bracket", "brain" - , "brand", "brass", "brave", "bread", "breeze", "brick" - , "bridge", "brief", "bright", "bring", "brisk", "broccoli" - , "broken", "bronze", "broom", "brother", "brown", "brush" - , "bubble", "buddy", "budget", "buffalo", "build", "bulb" - , "bulk", "bullet", "bundle", "bunker", "burden", "burger" - , "burst", "bus", "business", "busy", "butter", "buyer" - , "buzz", "cabbage", "cabin", "cable", "cactus", "cage" - , "cake", "call", "calm", "camera", "camp", "can" - , "canal", "cancel", "candy", "cannon", "canoe", "canvas" - , "canyon", "capable", "capital", "captain", "car", "carbon" - , "card", "cargo", "carpet", "carry", "cart", "case" - , "cash", "casino", "castle", "casual", "cat", "catalog" - , "catch", "category", "cattle", "caught", "cause", "caution" - , "cave", "ceiling", "celery", "cement", "census", "century" - , "cereal", "certain", "chair", "chalk", "champion", "change" - , "chaos", "chapter", "charge", "chase", "chat", "cheap" - , "check", "cheese", "chef", "cherry", "chest", "chicken" - , "chief", "child", "chimney", "choice", "choose", "chronic" - , "chuckle", "chunk", "churn", "cigar", "cinnamon", "circle" - , "citizen", "city", "civil", "claim", "clap", "clarify" - , "claw", "clay", "clean", "clerk", "clever", "click" - , "client", "cliff", "climb", "clinic", "clip", "clock" - , "clog", "close", "cloth", "cloud", "clown", "club" - , "clump", "cluster", "clutch", "coach", "coast", "coconut" - , "code", "coffee", "coil", "coin", "collect", "color" - , "column", "combine", "come", "comfort", "comic", "common" - , "company", "concert", "conduct", "confirm", "congress", "connect" - , "consider", "control", "convince", "cook", "cool", "copper" - , "copy", "coral", "core", "corn", "correct", "cost" - , "cotton", "couch", "country", "couple", "course", "cousin" - , "cover", "coyote", "crack", "cradle", "craft", "cram" - , "crane", "crash", "crater", "crawl", "crazy", "cream" - , "credit", "creek", "crew", "cricket", "crime", "crisp" - , "critic", "crop", "cross", "crouch", "crowd", "crucial" - , "cruel", "cruise", "crumble", "crunch", "crush", "cry" - , "crystal", "cube", "culture", "cup", "cupboard", "curious" - , "current", "curtain", "curve", "cushion", "custom", "cute" - , "cycle", "dad", "damage", "damp", "dance", "danger" - , "daring", "dash", "daughter", "dawn", "day", "deal" - , "debate", "debris", "decade", "december", "decide", "decline" - , "decorate", "decrease", "deer", "defense", "define", "defy" - , "degree", "delay", "deliver", "demand", "demise", "denial" - , "dentist", "deny", "depart", "depend", "deposit", "depth" - , "deputy", "derive", "describe", "desert", "design", "desk" - , "despair", "destroy", "detail", "detect", "develop", "device" - , "devote", "diagram", "dial", "diamond", "diary", "dice" - , "diesel", "diet", "differ", "digital", "dignity", "dilemma" - , "dinner", "dinosaur", "direct", "dirt", "disagree", "discover" - , "disease", "dish", "dismiss", "disorder", "display", "distance" - , "divert", "divide", "divorce", "dizzy", "doctor", "document" - , "dog", "doll", "dolphin", "domain", "donate", "donkey" - , "donor", "door", "dose", "double", "dove", "draft" - , "dragon", "drama", "drastic", "draw", "dream", "dress" - , "drift", "drill", "drink", "drip", "drive", "drop" - , "drum", "dry", "duck", "dumb", "dune", "during" - , "dust", "dutch", "duty", "dwarf", "dynamic", "eager" - , "eagle", "early", "earn", "earth", "easily", "east" - , "easy", "echo", "ecology", "economy", "edge", "edit" - , "educate", "effort", "egg", "eight", "either", "elbow" - , "elder", "electric", "elegant", "element", "elephant", "elevator" - , "elite", "else", "embark", "embody", "embrace", "emerge" - , "emotion", "employ", "empower", "empty", "enable", "enact" - , "end", "endless", "endorse", "enemy", "energy", "enforce" - , "engage", "engine", "enhance", "enjoy", "enlist", "enough" - , "enrich", "enroll", "ensure", "enter", "entire", "entry" - , "envelope", "episode", "equal", "equip", "era", "erase" - , "erode", "erosion", "error", "erupt", "escape", "essay" - , "essence", "estate", "eternal", "ethics", "evidence", "evil" - , "evoke", "evolve", "exact", "example", "excess", "exchange" - , "excite", "exclude", "excuse", "execute", "exercise", "exhaust" - , "exhibit", "exile", "exist", "exit", "exotic", "expand" - , "expect", "expire", "explain", "expose", "express", "extend" - , "extra", "eye", "eyebrow", "fabric", "face", "faculty" - , "fade", "faint", "faith", "fall", "false", "fame" - , "family", "famous", "fan", "fancy", "fantasy", "farm" - , "fashion", "fat", "fatal", "father", "fatigue", "fault" - , "favorite", "feature", "february", "federal", "fee", "feed" - , "feel", "female", "fence", "festival", "fetch", "fever" - , "few", "fiber", "fiction", "field", "figure", "file" - , "film", "filter", "final", "find", "fine", "finger" - , "finish", "fire", "firm", "first", "fiscal", "fish" - , "fit", "fitness", "fix", "flag", "flame", "flash" - , "flat", "flavor", "flee", "flight", "flip", "float" - , "flock", "floor", "flower", "fluid", "flush", "fly" - , "foam", "focus", "fog", "foil", "fold", "follow" - , "food", "foot", "force", "forest", "forget", "fork" - , "fortune", "forum", "forward", "fossil", "foster", "found" - , "fox", "fragile", "frame", "frequent", "fresh", "friend" - , "fringe", "frog", "front", "frost", "frown", "frozen" - , "fruit", "fuel", "fun", "funny", "furnace", "fury" - , "future", "gadget", "gain", "galaxy", "gallery", "game" - , "gap", "garage", "garbage", "garden", "garlic", "garment" - , "gas", "gasp", "gate", "gather", "gauge", "gaze" - , "general", "genius", "genre", "gentle", "genuine", "gesture" - , "ghost", "giant", "gift", "giggle", "ginger", "giraffe" - , "girl", "give", "glad", "glance", "glare", "glass" - , "glide", "glimpse", "globe", "gloom", "glory", "glove" - , "glow", "glue", "goat", "goddess", "gold", "good" - , "goose", "gorilla", "gospel", "gossip", "govern", "gown" - , "grab", "grace", "grain", "grant", "grape", "grass" - , "gravity", "great", "green", "grid", "grief", "grit" - , "grocery", "group", "grow", "grunt", "guard", "guess" - , "guide", "guilt", "guitar", "gun", "gym", "habit" - , "hair", "half", "hammer", "hamster", "hand", "happy" - , "harbor", "hard", "harsh", "harvest", "hat", "have" - , "hawk", "hazard", "head", "health", "heart", "heavy" - , "hedgehog", "height", "hello", "helmet", "help", "hen" - , "hero", "hidden", "high", "hill", "hint", "hip" - , "hire", "history", "hobby", "hockey", "hold", "hole" - , "holiday", "hollow", "home", "honey", "hood", "hope" - , "horn", "horror", "horse", "hospital", "host", "hotel" - , "hour", "hover", "hub", "huge", "human", "humble" - , "humor", "hundred", "hungry", "hunt", "hurdle", "hurry" - , "hurt", "husband", "hybrid", "ice", "icon", "idea" - , "identify", "idle", "ignore", "ill", "illegal", "illness" - , "image", "imitate", "immense", "immune", "impact", "impose" - , "improve", "impulse", "inch", "include", "income", "increase" - , "index", "indicate", "indoor", "industry", "infant", "inflict" - , "inform", "inhale", "inherit", "initial", "inject", "injury" - , "inmate", "inner", "innocent", "input", "inquiry", "insane" - , "insect", "inside", "inspire", "install", "intact", "interest" - , "into", "invest", "invite", "involve", "iron", "island" - , "isolate", "issue", "item", "ivory", "jacket", "jaguar" - , "jar", "jazz", "jealous", "jeans", "jelly", "jewel" - , "job", "join", "joke", "journey", "joy", "judge" - , "juice", "jump", "jungle", "junior", "junk", "just" - , "kangaroo", "keen", "keep", "ketchup", "key", "kick" - , "kid", "kidney", "kind", "kingdom", "kiss", "kit" - , "kitchen", "kite", "kitten", "kiwi", "knee", "knife" - , "knock", "know", "lab", "label", "labor", "ladder" - , "lady", "lake", "lamp", "language", "laptop", "large" - , "later", "latin", "laugh", "laundry", "lava", "law" - , "lawn", "lawsuit", "layer", "lazy", "leader", "leaf" - , "learn", "leave", "lecture", "left", "leg", "legal" - , "legend", "leisure", "lemon", "lend", "length", "lens" - , "leopard", "lesson", "letter", "level", "liar", "liberty" - , "library", "license", "life", "lift", "light", "like" - , "limb", "limit", "link", "lion", "liquid", "list" - , "little", "live", "lizard", "load", "loan", "lobster" - , "local", "lock", "logic", "lonely", "long", "loop" - , "lottery", "loud", "lounge", "love", "loyal", "lucky" - , "luggage", "lumber", "lunar", "lunch", "luxury", "lyrics" - , "machine", "mad", "magic", "magnet", "maid", "mail" - , "main", "major", "make", "mammal", "man", "manage" - , "mandate", "mango", "mansion", "manual", "maple", "marble" - , "march", "margin", "marine", "market", "marriage", "mask" - , "mass", "master", "match", "material", "math", "matrix" - , "matter", "maximum", "maze", "meadow", "mean", "measure" - , "meat", "mechanic", "medal", "media", "melody", "melt" - , "member", "memory", "mention", "menu", "mercy", "merge" - , "merit", "merry", "mesh", "message", "metal", "method" - , "middle", "midnight", "milk", "million", "mimic", "mind" - , "minimum", "minor", "minute", "miracle", "mirror", "misery" - , "miss", "mistake", "mix", "mixed", "mixture", "mobile" - , "model", "modify", "mom", "moment", "monitor", "monkey" - , "monster", "month", "moon", "moral", "more", "morning" - , "mosquito", "mother", "motion", "motor", "mountain", "mouse" - , "move", "movie", "much", "muffin", "mule", "multiply" - , "muscle", "museum", "mushroom", "music", "must", "mutual" - , "myself", "mystery", "myth", "naive", "name", "napkin" - , "narrow", "nasty", "nation", "nature", "near", "neck" - , "need", "negative", "neglect", "neither", "nephew", "nerve" - , "nest", "net", "network", "neutral", "never", "news" - , "next", "nice", "night", "noble", "noise", "nominee" - , "noodle", "normal", "north", "nose", "notable", "note" - , "nothing", "notice", "novel", "now", "nuclear", "number" - , "nurse", "nut", "oak", "obey", "object", "oblige" - , "obscure", "observe", "obtain", "obvious", "occur", "ocean" - , "october", "odor", "off", "offer", "office", "often" - , "oil", "okay", "old", "olive", "olympic", "omit" - , "once", "one", "onion", "online", "only", "open" - , "opera", "opinion", "oppose", "option", "orange", "orbit" - , "orchard", "order", "ordinary", "organ", "orient", "original" - , "orphan", "ostrich", "other", "outdoor", "outer", "output" - , "outside", "oval", "oven", "over", "own", "owner" - , "oxygen", "oyster", "ozone", "pact", "paddle", "page" - , "pair", "palace", "palm", "panda", "panel", "panic" - , "panther", "paper", "parade", "parent", "park", "parrot" - , "party", "pass", "patch", "path", "patient", "patrol" - , "pattern", "pause", "pave", "payment", "peace", "peanut" - , "pear", "peasant", "pelican", "pen", "penalty", "pencil" - , "people", "pepper", "perfect", "permit", "person", "pet" - , "phone", "photo", "phrase", "physical", "piano", "picnic" - , "picture", "piece", "pig", "pigeon", "pill", "pilot" - , "pink", "pioneer", "pipe", "pistol", "pitch", "pizza" - , "place", "planet", "plastic", "plate", "play", "please" - , "pledge", "pluck", "plug", "plunge", "poem", "poet" - , "point", "polar", "pole", "police", "pond", "pony" - , "pool", "popular", "portion", "position", "possible", "post" - , "potato", "pottery", "poverty", "powder", "power", "practice" - , "praise", "predict", "prefer", "prepare", "present", "pretty" - , "prevent", "price", "pride", "primary", "print", "priority" - , "prison", "private", "prize", "problem", "process", "produce" - , "profit", "program", "project", "promote", "proof", "property" - , "prosper", "protect", "proud", "provide", "public", "pudding" - , "pull", "pulp", "pulse", "pumpkin", "punch", "pupil" - , "puppy", "purchase", "purity", "purpose", "purse", "push" - , "put", "puzzle", "pyramid", "quality", "quantum", "quarter" - , "question", "quick", "quit", "quiz", "quote", "rabbit" - , "raccoon", "race", "rack", "radar", "radio", "rail" - , "rain", "raise", "rally", "ramp", "ranch", "random" - , "range", "rapid", "rare", "rate", "rather", "raven" - , "raw", "razor", "ready", "real", "reason", "rebel" - , "rebuild", "recall", "receive", "recipe", "record", "recycle" - , "reduce", "reflect", "reform", "refuse", "region", "regret" - , "regular", "reject", "relax", "release", "relief", "rely" - , "remain", "remember", "remind", "remove", "render", "renew" - , "rent", "reopen", "repair", "repeat", "replace", "report" - , "require", "rescue", "resemble", "resist", "resource", "response" - , "result", "retire", "retreat", "return", "reunion", "reveal" - , "review", "reward", "rhythm", "rib", "ribbon", "rice" - , "rich", "ride", "ridge", "rifle", "right", "rigid" - , "ring", "riot", "ripple", "risk", "ritual", "rival" - , "river", "road", "roast", "robot", "robust", "rocket" - , "romance", "roof", "rookie", "room", "rose", "rotate" - , "rough", "round", "route", "royal", "rubber", "rude" - , "rug", "rule", "run", "runway", "rural", "sad" - , "saddle", "sadness", "safe", "sail", "salad", "salmon" - , "salon", "salt", "salute", "same", "sample", "sand" - , "satisfy", "satoshi", "sauce", "sausage", "save", "say" - , "scale", "scan", "scare", "scatter", "scene", "scheme" - , "school", "science", "scissors", "scorpion", "scout", "scrap" - , "screen", "script", "scrub", "sea", "search", "season" - , "seat", "second", "secret", "section", "security", "seed" - , "seek", "segment", "select", "sell", "seminar", "senior" - , "sense", "sentence", "series", "service", "session", "settle" - , "setup", "seven", "shadow", "shaft", "shallow", "share" - , "shed", "shell", "sheriff", "shield", "shift", "shine" - , "ship", "shiver", "shock", "shoe", "shoot", "shop" - , "short", "shoulder", "shove", "shrimp", "shrug", "shuffle" - , "shy", "sibling", "sick", "side", "siege", "sight" - , "sign", "silent", "silk", "silly", "silver", "similar" - , "simple", "since", "sing", "siren", "sister", "situate" - , "six", "size", "skate", "sketch", "ski", "skill" - , "skin", "skirt", "skull", "slab", "slam", "sleep" - , "slender", "slice", "slide", "slight", "slim", "slogan" - , "slot", "slow", "slush", "small", "smart", "smile" - , "smoke", "smooth", "snack", "snake", "snap", "sniff" - , "snow", "soap", "soccer", "social", "sock", "soda" - , "soft", "solar", "soldier", "solid", "solution", "solve" - , "someone", "song", "soon", "sorry", "sort", "soul" - , "sound", "soup", "source", "south", "space", "spare" - , "spatial", "spawn", "speak", "special", "speed", "spell" - , "spend", "sphere", "spice", "spider", "spike", "spin" - , "spirit", "split", "spoil", "sponsor", "spoon", "sport" - , "spot", "spray", "spread", "spring", "spy", "square" - , "squeeze", "squirrel", "stable", "stadium", "staff", "stage" - , "stairs", "stamp", "stand", "start", "state", "stay" - , "steak", "steel", "stem", "step", "stereo", "stick" - , "still", "sting", "stock", "stomach", "stone", "stool" - , "story", "stove", "strategy", "street", "strike", "strong" - , "struggle", "student", "stuff", "stumble", "style", "subject" - , "submit", "subway", "success", "such", "sudden", "suffer" - , "sugar", "suggest", "suit", "summer", "sun", "sunny" - , "sunset", "super", "supply", "supreme", "sure", "surface" - , "surge", "surprise", "surround", "survey", "suspect", "sustain" - , "swallow", "swamp", "swap", "swarm", "swear", "sweet" - , "swift", "swim", "swing", "switch", "sword", "symbol" - , "symptom", "syrup", "system", "table", "tackle", "tag" - , "tail", "talent", "talk", "tank", "tape", "target" - , "task", "taste", "tattoo", "taxi", "teach", "team" - , "tell", "ten", "tenant", "tennis", "tent", "term" - , "test", "text", "thank", "that", "theme", "then" - , "theory", "there", "they", "thing", "this", "thought" - , "three", "thrive", "throw", "thumb", "thunder", "ticket" - , "tide", "tiger", "tilt", "timber", "time", "tiny" - , "tip", "tired", "tissue", "title", "toast", "tobacco" - , "today", "toddler", "toe", "together", "toilet", "token" - , "tomato", "tomorrow", "tone", "tongue", "tonight", "tool" - , "tooth", "top", "topic", "topple", "torch", "tornado" - , "tortoise", "toss", "total", "tourist", "toward", "tower" - , "town", "toy", "track", "trade", "traffic", "tragic" - , "train", "transfer", "trap", "trash", "travel", "tray" - , "treat", "tree", "trend", "trial", "tribe", "trick" - , "trigger", "trim", "trip", "trophy", "trouble", "truck" - , "true", "truly", "trumpet", "trust", "truth", "try" - , "tube", "tuition", "tumble", "tuna", "tunnel", "turkey" - , "turn", "turtle", "twelve", "twenty", "twice", "twin" - , "twist", "two", "type", "typical", "ugly", "umbrella" - , "unable", "unaware", "uncle", "uncover", "under", "undo" - , "unfair", "unfold", "unhappy", "uniform", "unique", "unit" - , "universe", "unknown", "unlock", "until", "unusual", "unveil" - , "update", "upgrade", "uphold", "upon", "upper", "upset" - , "urban", "urge", "usage", "use", "used", "useful" - , "useless", "usual", "utility", "vacant", "vacuum", "vague" - , "valid", "valley", "valve", "van", "vanish", "vapor" - , "various", "vast", "vault", "vehicle", "velvet", "vendor" - , "venture", "venue", "verb", "verify", "version", "very" - , "vessel", "veteran", "viable", "vibrant", "vicious", "victory" - , "video", "view", "village", "vintage", "violin", "virtual" - , "virus", "visa", "visit", "visual", "vital", "vivid" - , "vocal", "voice", "void", "volcano", "volume", "vote" - , "voyage", "wage", "wagon", "wait", "walk", "wall" - , "walnut", "want", "warfare", "warm", "warrior", "wash" - , "wasp", "waste", "water", "wave", "way", "wealth" - , "weapon", "wear", "weasel", "weather", "web", "wedding" - , "weekend", "weird", "welcome", "west", "wet", "whale" - , "what", "wheat", "wheel", "when", "where", "whip" - , "whisper", "wide", "width", "wife", "wild", "will" - , "win", "window", "wine", "wing", "wink", "winner" - , "winter", "wire", "wisdom", "wise", "wish", "witness" - , "wolf", "woman", "wonder", "wood", "wool", "word" - , "work", "world", "worry", "worth", "wrap", "wreck" - , "wrestle", "wrist", "write", "wrong", "yard", "year" - , "yellow", "you", "young", "youth", "zebra", "zero" - , "zone", "zoo" - ] +englishWordList = BC.lines $(embedFile "src/Simplex/Messaging/Crypto/BIP39/english.txt") diff --git a/src/Simplex/Messaging/Crypto/BIP39/english.txt b/src/Simplex/Messaging/Crypto/BIP39/english.txt new file mode 100644 index 000000000..942040ed5 --- /dev/null +++ b/src/Simplex/Messaging/Crypto/BIP39/english.txt @@ -0,0 +1,2048 @@ +abandon +ability +able +about +above +absent +absorb +abstract +absurd +abuse +access +accident +account +accuse +achieve +acid +acoustic +acquire +across +act +action +actor +actress +actual +adapt +add +addict +address +adjust +admit +adult +advance +advice +aerobic +affair +afford +afraid +again +age +agent +agree +ahead +aim +air +airport +aisle +alarm +album +alcohol +alert +alien +all +alley +allow +almost +alone +alpha +already +also +alter +always +amateur +amazing +among +amount +amused +analyst +anchor +ancient +anger +angle +angry +animal +ankle +announce +annual +another +answer +antenna +antique +anxiety +any +apart +apology +appear +apple +approve +april +arch +arctic +area +arena +argue +arm +armed +armor +army +around +arrange +arrest +arrive +arrow +art +artefact +artist +artwork +ask +aspect +assault +asset +assist +assume +asthma +athlete +atom +attack +attend +attitude +attract +auction +audit +august +aunt +author +auto +autumn +average +avocado +avoid +awake +aware +away +awesome +awful +awkward +axis +baby +bachelor +bacon +badge +bag +balance +balcony +ball +bamboo +banana +banner +bar +barely +bargain +barrel +base +basic +basket +battle +beach +bean +beauty +because +become +beef +before +begin +behave +behind +believe +below +belt +bench +benefit +best +betray +better +between +beyond +bicycle +bid +bike +bind +biology +bird +birth +bitter +black +blade +blame +blanket +blast +bleak +bless +blind +blood +blossom +blouse +blue +blur +blush +board +boat +body +boil +bomb +bone +bonus +book +boost +border +boring +borrow +boss +bottom +bounce +box +boy +bracket +brain +brand +brass +brave +bread +breeze +brick +bridge +brief +bright +bring +brisk +broccoli +broken +bronze +broom +brother +brown +brush +bubble +buddy +budget +buffalo +build +bulb +bulk +bullet +bundle +bunker +burden +burger +burst +bus +business +busy +butter +buyer +buzz +cabbage +cabin +cable +cactus +cage +cake +call +calm +camera +camp +can +canal +cancel +candy +cannon +canoe +canvas +canyon +capable +capital +captain +car +carbon +card +cargo +carpet +carry +cart +case +cash +casino +castle +casual +cat +catalog +catch +category +cattle +caught +cause +caution +cave +ceiling +celery +cement +census +century +cereal +certain +chair +chalk +champion +change +chaos +chapter +charge +chase +chat +cheap +check +cheese +chef +cherry +chest +chicken +chief +child +chimney +choice +choose +chronic +chuckle +chunk +churn +cigar +cinnamon +circle +citizen +city +civil +claim +clap +clarify +claw +clay +clean +clerk +clever +click +client +cliff +climb +clinic +clip +clock +clog +close +cloth +cloud +clown +club +clump +cluster +clutch +coach +coast +coconut +code +coffee +coil +coin +collect +color +column +combine +come +comfort +comic +common +company +concert +conduct +confirm +congress +connect +consider +control +convince +cook +cool +copper +copy +coral +core +corn +correct +cost +cotton +couch +country +couple +course +cousin +cover +coyote +crack +cradle +craft +cram +crane +crash +crater +crawl +crazy +cream +credit +creek +crew +cricket +crime +crisp +critic +crop +cross +crouch +crowd +crucial +cruel +cruise +crumble +crunch +crush +cry +crystal +cube +culture +cup +cupboard +curious +current +curtain +curve +cushion +custom +cute +cycle +dad +damage +damp +dance +danger +daring +dash +daughter +dawn +day +deal +debate +debris +decade +december +decide +decline +decorate +decrease +deer +defense +define +defy +degree +delay +deliver +demand +demise +denial +dentist +deny +depart +depend +deposit +depth +deputy +derive +describe +desert +design +desk +despair +destroy +detail +detect +develop +device +devote +diagram +dial +diamond +diary +dice +diesel +diet +differ +digital +dignity +dilemma +dinner +dinosaur +direct +dirt +disagree +discover +disease +dish +dismiss +disorder +display +distance +divert +divide +divorce +dizzy +doctor +document +dog +doll +dolphin +domain +donate +donkey +donor +door +dose +double +dove +draft +dragon +drama +drastic +draw +dream +dress +drift +drill +drink +drip +drive +drop +drum +dry +duck +dumb +dune +during +dust +dutch +duty +dwarf +dynamic +eager +eagle +early +earn +earth +easily +east +easy +echo +ecology +economy +edge +edit +educate +effort +egg +eight +either +elbow +elder +electric +elegant +element +elephant +elevator +elite +else +embark +embody +embrace +emerge +emotion +employ +empower +empty +enable +enact +end +endless +endorse +enemy +energy +enforce +engage +engine +enhance +enjoy +enlist +enough +enrich +enroll +ensure +enter +entire +entry +envelope +episode +equal +equip +era +erase +erode +erosion +error +erupt +escape +essay +essence +estate +eternal +ethics +evidence +evil +evoke +evolve +exact +example +excess +exchange +excite +exclude +excuse +execute +exercise +exhaust +exhibit +exile +exist +exit +exotic +expand +expect +expire +explain +expose +express +extend +extra +eye +eyebrow +fabric +face +faculty +fade +faint +faith +fall +false +fame +family +famous +fan +fancy +fantasy +farm +fashion +fat +fatal +father +fatigue +fault +favorite +feature +february +federal +fee +feed +feel +female +fence +festival +fetch +fever +few +fiber +fiction +field +figure +file +film +filter +final +find +fine +finger +finish +fire +firm +first +fiscal +fish +fit +fitness +fix +flag +flame +flash +flat +flavor +flee +flight +flip +float +flock +floor +flower +fluid +flush +fly +foam +focus +fog +foil +fold +follow +food +foot +force +forest +forget +fork +fortune +forum +forward +fossil +foster +found +fox +fragile +frame +frequent +fresh +friend +fringe +frog +front +frost +frown +frozen +fruit +fuel +fun +funny +furnace +fury +future +gadget +gain +galaxy +gallery +game +gap +garage +garbage +garden +garlic +garment +gas +gasp +gate +gather +gauge +gaze +general +genius +genre +gentle +genuine +gesture +ghost +giant +gift +giggle +ginger +giraffe +girl +give +glad +glance +glare +glass +glide +glimpse +globe +gloom +glory +glove +glow +glue +goat +goddess +gold +good +goose +gorilla +gospel +gossip +govern +gown +grab +grace +grain +grant +grape +grass +gravity +great +green +grid +grief +grit +grocery +group +grow +grunt +guard +guess +guide +guilt +guitar +gun +gym +habit +hair +half +hammer +hamster +hand +happy +harbor +hard +harsh +harvest +hat +have +hawk +hazard +head +health +heart +heavy +hedgehog +height +hello +helmet +help +hen +hero +hidden +high +hill +hint +hip +hire +history +hobby +hockey +hold +hole +holiday +hollow +home +honey +hood +hope +horn +horror +horse +hospital +host +hotel +hour +hover +hub +huge +human +humble +humor +hundred +hungry +hunt +hurdle +hurry +hurt +husband +hybrid +ice +icon +idea +identify +idle +ignore +ill +illegal +illness +image +imitate +immense +immune +impact +impose +improve +impulse +inch +include +income +increase +index +indicate +indoor +industry +infant +inflict +inform +inhale +inherit +initial +inject +injury +inmate +inner +innocent +input +inquiry +insane +insect +inside +inspire +install +intact +interest +into +invest +invite +involve +iron +island +isolate +issue +item +ivory +jacket +jaguar +jar +jazz +jealous +jeans +jelly +jewel +job +join +joke +journey +joy +judge +juice +jump +jungle +junior +junk +just +kangaroo +keen +keep +ketchup +key +kick +kid +kidney +kind +kingdom +kiss +kit +kitchen +kite +kitten +kiwi +knee +knife +knock +know +lab +label +labor +ladder +lady +lake +lamp +language +laptop +large +later +latin +laugh +laundry +lava +law +lawn +lawsuit +layer +lazy +leader +leaf +learn +leave +lecture +left +leg +legal +legend +leisure +lemon +lend +length +lens +leopard +lesson +letter +level +liar +liberty +library +license +life +lift +light +like +limb +limit +link +lion +liquid +list +little +live +lizard +load +loan +lobster +local +lock +logic +lonely +long +loop +lottery +loud +lounge +love +loyal +lucky +luggage +lumber +lunar +lunch +luxury +lyrics +machine +mad +magic +magnet +maid +mail +main +major +make +mammal +man +manage +mandate +mango +mansion +manual +maple +marble +march +margin +marine +market +marriage +mask +mass +master +match +material +math +matrix +matter +maximum +maze +meadow +mean +measure +meat +mechanic +medal +media +melody +melt +member +memory +mention +menu +mercy +merge +merit +merry +mesh +message +metal +method +middle +midnight +milk +million +mimic +mind +minimum +minor +minute +miracle +mirror +misery +miss +mistake +mix +mixed +mixture +mobile +model +modify +mom +moment +monitor +monkey +monster +month +moon +moral +more +morning +mosquito +mother +motion +motor +mountain +mouse +move +movie +much +muffin +mule +multiply +muscle +museum +mushroom +music +must +mutual +myself +mystery +myth +naive +name +napkin +narrow +nasty +nation +nature +near +neck +need +negative +neglect +neither +nephew +nerve +nest +net +network +neutral +never +news +next +nice +night +noble +noise +nominee +noodle +normal +north +nose +notable +note +nothing +notice +novel +now +nuclear +number +nurse +nut +oak +obey +object +oblige +obscure +observe +obtain +obvious +occur +ocean +october +odor +off +offer +office +often +oil +okay +old +olive +olympic +omit +once +one +onion +online +only +open +opera +opinion +oppose +option +orange +orbit +orchard +order +ordinary +organ +orient +original +orphan +ostrich +other +outdoor +outer +output +outside +oval +oven +over +own +owner +oxygen +oyster +ozone +pact +paddle +page +pair +palace +palm +panda +panel +panic +panther +paper +parade +parent +park +parrot +party +pass +patch +path +patient +patrol +pattern +pause +pave +payment +peace +peanut +pear +peasant +pelican +pen +penalty +pencil +people +pepper +perfect +permit +person +pet +phone +photo +phrase +physical +piano +picnic +picture +piece +pig +pigeon +pill +pilot +pink +pioneer +pipe +pistol +pitch +pizza +place +planet +plastic +plate +play +please +pledge +pluck +plug +plunge +poem +poet +point +polar +pole +police +pond +pony +pool +popular +portion +position +possible +post +potato +pottery +poverty +powder +power +practice +praise +predict +prefer +prepare +present +pretty +prevent +price +pride +primary +print +priority +prison +private +prize +problem +process +produce +profit +program +project +promote +proof +property +prosper +protect +proud +provide +public +pudding +pull +pulp +pulse +pumpkin +punch +pupil +puppy +purchase +purity +purpose +purse +push +put +puzzle +pyramid +quality +quantum +quarter +question +quick +quit +quiz +quote +rabbit +raccoon +race +rack +radar +radio +rail +rain +raise +rally +ramp +ranch +random +range +rapid +rare +rate +rather +raven +raw +razor +ready +real +reason +rebel +rebuild +recall +receive +recipe +record +recycle +reduce +reflect +reform +refuse +region +regret +regular +reject +relax +release +relief +rely +remain +remember +remind +remove +render +renew +rent +reopen +repair +repeat +replace +report +require +rescue +resemble +resist +resource +response +result +retire +retreat +return +reunion +reveal +review +reward +rhythm +rib +ribbon +rice +rich +ride +ridge +rifle +right +rigid +ring +riot +ripple +risk +ritual +rival +river +road +roast +robot +robust +rocket +romance +roof +rookie +room +rose +rotate +rough +round +route +royal +rubber +rude +rug +rule +run +runway +rural +sad +saddle +sadness +safe +sail +salad +salmon +salon +salt +salute +same +sample +sand +satisfy +satoshi +sauce +sausage +save +say +scale +scan +scare +scatter +scene +scheme +school +science +scissors +scorpion +scout +scrap +screen +script +scrub +sea +search +season +seat +second +secret +section +security +seed +seek +segment +select +sell +seminar +senior +sense +sentence +series +service +session +settle +setup +seven +shadow +shaft +shallow +share +shed +shell +sheriff +shield +shift +shine +ship +shiver +shock +shoe +shoot +shop +short +shoulder +shove +shrimp +shrug +shuffle +shy +sibling +sick +side +siege +sight +sign +silent +silk +silly +silver +similar +simple +since +sing +siren +sister +situate +six +size +skate +sketch +ski +skill +skin +skirt +skull +slab +slam +sleep +slender +slice +slide +slight +slim +slogan +slot +slow +slush +small +smart +smile +smoke +smooth +snack +snake +snap +sniff +snow +soap +soccer +social +sock +soda +soft +solar +soldier +solid +solution +solve +someone +song +soon +sorry +sort +soul +sound +soup +source +south +space +spare +spatial +spawn +speak +special +speed +spell +spend +sphere +spice +spider +spike +spin +spirit +split +spoil +sponsor +spoon +sport +spot +spray +spread +spring +spy +square +squeeze +squirrel +stable +stadium +staff +stage +stairs +stamp +stand +start +state +stay +steak +steel +stem +step +stereo +stick +still +sting +stock +stomach +stone +stool +story +stove +strategy +street +strike +strong +struggle +student +stuff +stumble +style +subject +submit +subway +success +such +sudden +suffer +sugar +suggest +suit +summer +sun +sunny +sunset +super +supply +supreme +sure +surface +surge +surprise +surround +survey +suspect +sustain +swallow +swamp +swap +swarm +swear +sweet +swift +swim +swing +switch +sword +symbol +symptom +syrup +system +table +tackle +tag +tail +talent +talk +tank +tape +target +task +taste +tattoo +taxi +teach +team +tell +ten +tenant +tennis +tent +term +test +text +thank +that +theme +then +theory +there +they +thing +this +thought +three +thrive +throw +thumb +thunder +ticket +tide +tiger +tilt +timber +time +tiny +tip +tired +tissue +title +toast +tobacco +today +toddler +toe +together +toilet +token +tomato +tomorrow +tone +tongue +tonight +tool +tooth +top +topic +topple +torch +tornado +tortoise +toss +total +tourist +toward +tower +town +toy +track +trade +traffic +tragic +train +transfer +trap +trash +travel +tray +treat +tree +trend +trial +tribe +trick +trigger +trim +trip +trophy +trouble +truck +true +truly +trumpet +trust +truth +try +tube +tuition +tumble +tuna +tunnel +turkey +turn +turtle +twelve +twenty +twice +twin +twist +two +type +typical +ugly +umbrella +unable +unaware +uncle +uncover +under +undo +unfair +unfold +unhappy +uniform +unique +unit +universe +unknown +unlock +until +unusual +unveil +update +upgrade +uphold +upon +upper +upset +urban +urge +usage +use +used +useful +useless +usual +utility +vacant +vacuum +vague +valid +valley +valve +van +vanish +vapor +various +vast +vault +vehicle +velvet +vendor +venture +venue +verb +verify +version +very +vessel +veteran +viable +vibrant +vicious +victory +video +view +village +vintage +violin +virtual +virus +visa +visit +visual +vital +vivid +vocal +voice +void +volcano +volume +vote +voyage +wage +wagon +wait +walk +wall +walnut +want +warfare +warm +warrior +wash +wasp +waste +water +wave +way +wealth +weapon +wear +weasel +weather +web +wedding +weekend +weird +welcome +west +wet +whale +what +wheat +wheel +when +where +whip +whisper +wide +width +wife +wild +will +win +window +wine +wing +wink +winner +winter +wire +wisdom +wise +wish +witness +wolf +woman +wonder +wood +wool +word +work +world +worry +worth +wrap +wreck +wrestle +wrist +write +wrong +yard +year +yellow +you +young +youth +zebra +zero +zone +zoo diff --git a/tests/CoreTests/EthCryptoTests.hs b/tests/CoreTests/EthCryptoTests.hs index 0f83b9e8b..aaa3aeaa1 100644 --- a/tests/CoreTests/EthCryptoTests.hs +++ b/tests/CoreTests/EthCryptoTests.hs @@ -23,6 +23,7 @@ import Data.Word (Word32) import qualified Simplex.Messaging.Crypto as C import qualified Simplex.Messaging.Crypto.BIP32 as B32 import qualified Simplex.Messaging.Crypto.BIP39 as B39 +import Simplex.Messaging.Crypto.BIP39.English (englishWordList) import qualified Simplex.Messaging.Crypto.Secp256k1 as S import Simplex.Messaging.Eth.Address import Simplex.Messaging.Eth.EIP712 @@ -120,6 +121,10 @@ bip39Tests = do toHex (B39.mnemonicToSeed p "TREZOR") `shouldBe` seedHex it "has a 2048-word list" $ B39.wordListSize `shouldBe` 2048 + it "embeds the upstream wordlist, unchanged" $ + -- sha256 of bitcoin/bips/bip-0039/english.txt + C.sha256Hash (BC.unlines englishWordList) + `shouldBe` hx "2f5eed53a4727b4bf8880d8f3f199efc90e58503646d9ff8eff3a2ed3b24dbda" it "maps strengths to word counts" $ map B39.strengthWordCount [minBound .. maxBound] `shouldBe` [12, 15, 18, 21, 24] it "rejects a bad checksum" $