1// Copyright 2015 Keybase, Inc. All rights reserved. Use of
2// this source code is governed by the included BSD license.
3
4package libkb
5
6import (
7	"crypto/rand"
8	"fmt"
9	"math"
10	"math/big"
11	"strings"
12)
13
14// SecWordList returns an array of words from secwords.  It
15// returns enough words to satisfy the desired entropy.
16func SecWordList(entropy int) ([]string, error) {
17	return secWordListN(secWordCount(entropy))
18}
19
20func secWordCount(entropy int) int {
21	return int(math.Ceil(float64(entropy) / math.Log2(float64(len(secwords)))))
22}
23
24// secWordListN returns n random words from secwords.
25func secWordListN(n int) ([]string, error) {
26	var res []string
27	max := big.NewInt(int64(len(secwords)))
28	for i := 0; i < n; i++ {
29		x, err := rand.Int(rand.Reader, max)
30		if err != nil {
31			return []string{}, err
32		}
33		res = append(res, secwords[x.Int64()])
34	}
35	return res, nil
36}
37
38func validPhrase(p string, entropies []int) error {
39
40	lens := make(map[int]bool)
41	for _, e := range entropies {
42		lens[secWordCount(e)] = true
43	}
44
45	words := strings.Split(p, " ")
46
47	if words[len(words)-1] == kexPhraseVersion {
48		words = words[:len(words)-1]
49	}
50
51	if !lens[len(words)] {
52		return fmt.Errorf("phrase had %d words, expected %v", len(words), entropies)
53	}
54	for _, w := range words {
55		if !ValidSecWord(w) {
56			return fmt.Errorf("word %q is not a valid word", w)
57		}
58	}
59	return nil
60}
61
62func ValidSecWord(w string) bool {
63	return secwordSet[w]
64}
65
66// SecWord returns the n'th word from the BIP-0039 list, mod the size
67// of the list.
68func SecWord(n int) string {
69	return secwords[n%len(secwords)]
70}
71
72// Wordlist from BIP0039:
73//  https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt
74//
75var secwords = []string{
76	"abandon",
77	"ability",
78	"able",
79	"about",
80	"above",
81	"absent",
82	"absorb",
83	"abstract",
84	"absurd",
85	"abuse",
86	"access",
87	"accident",
88	"account",
89	"accuse",
90	"achieve",
91	"acid",
92	"acoustic",
93	"acquire",
94	"across",
95	"act",
96	"action",
97	"actor",
98	"actress",
99	"actual",
100	"adapt",
101	"add",
102	"addict",
103	"address",
104	"adjust",
105	"admit",
106	"adult",
107	"advance",
108	"advice",
109	"aerobic",
110	"affair",
111	"afford",
112	"afraid",
113	"again",
114	"age",
115	"agent",
116	"agree",
117	"ahead",
118	"aim",
119	"air",
120	"airport",
121	"aisle",
122	"alarm",
123	"album",
124	"alcohol",
125	"alert",
126	"alien",
127	"all",
128	"alley",
129	"allow",
130	"almost",
131	"alone",
132	"alpha",
133	"already",
134	"also",
135	"alter",
136	"always",
137	"amateur",
138	"amazing",
139	"among",
140	"amount",
141	"amused",
142	"analyst",
143	"anchor",
144	"ancient",
145	"anger",
146	"angle",
147	"angry",
148	"animal",
149	"ankle",
150	"announce",
151	"annual",
152	"another",
153	"answer",
154	"antenna",
155	"antique",
156	"anxiety",
157	"any",
158	"apart",
159	"apology",
160	"appear",
161	"apple",
162	"approve",
163	"april",
164	"arch",
165	"arctic",
166	"area",
167	"arena",
168	"argue",
169	"arm",
170	"armed",
171	"armor",
172	"army",
173	"around",
174	"arrange",
175	"arrest",
176	"arrive",
177	"arrow",
178	"art",
179	"artefact",
180	"artist",
181	"artwork",
182	"ask",
183	"aspect",
184	"assault",
185	"asset",
186	"assist",
187	"assume",
188	"asthma",
189	"athlete",
190	"atom",
191	"attack",
192	"attend",
193	"attitude",
194	"attract",
195	"auction",
196	"audit",
197	"august",
198	"aunt",
199	"author",
200	"auto",
201	"autumn",
202	"average",
203	"avocado",
204	"avoid",
205	"awake",
206	"aware",
207	"away",
208	"awesome",
209	"awful",
210	"awkward",
211	"axis",
212	"baby",
213	"bachelor",
214	"bacon",
215	"badge",
216	"bag",
217	"balance",
218	"balcony",
219	"ball",
220	"bamboo",
221	"banana",
222	"banner",
223	"bar",
224	"barely",
225	"bargain",
226	"barrel",
227	"base",
228	"basic",
229	"basket",
230	"battle",
231	"beach",
232	"bean",
233	"beauty",
234	"because",
235	"become",
236	"beef",
237	"before",
238	"begin",
239	"behave",
240	"behind",
241	"believe",
242	"below",
243	"belt",
244	"bench",
245	"benefit",
246	"best",
247	"betray",
248	"better",
249	"between",
250	"beyond",
251	"bicycle",
252	"bid",
253	"bike",
254	"bind",
255	"biology",
256	"bird",
257	"birth",
258	"bitter",
259	"black",
260	"blade",
261	"blame",
262	"blanket",
263	"blast",
264	"bleak",
265	"bless",
266	"blind",
267	"blood",
268	"blossom",
269	"blouse",
270	"blue",
271	"blur",
272	"blush",
273	"board",
274	"boat",
275	"body",
276	"boil",
277	"bomb",
278	"bone",
279	"bonus",
280	"book",
281	"boost",
282	"border",
283	"boring",
284	"borrow",
285	"boss",
286	"bottom",
287	"bounce",
288	"box",
289	"boy",
290	"bracket",
291	"brain",
292	"brand",
293	"brass",
294	"brave",
295	"bread",
296	"breeze",
297	"brick",
298	"bridge",
299	"brief",
300	"bright",
301	"bring",
302	"brisk",
303	"broccoli",
304	"broken",
305	"bronze",
306	"broom",
307	"brother",
308	"brown",
309	"brush",
310	"bubble",
311	"buddy",
312	"budget",
313	"buffalo",
314	"build",
315	"bulb",
316	"bulk",
317	"bullet",
318	"bundle",
319	"bunker",
320	"burden",
321	"burger",
322	"burst",
323	"bus",
324	"business",
325	"busy",
326	"butter",
327	"buyer",
328	"buzz",
329	"cabbage",
330	"cabin",
331	"cable",
332	"cactus",
333	"cage",
334	"cake",
335	"call",
336	"calm",
337	"camera",
338	"camp",
339	"can",
340	"canal",
341	"cancel",
342	"candy",
343	"cannon",
344	"canoe",
345	"canvas",
346	"canyon",
347	"capable",
348	"capital",
349	"captain",
350	"car",
351	"carbon",
352	"card",
353	"cargo",
354	"carpet",
355	"carry",
356	"cart",
357	"case",
358	"cash",
359	"casino",
360	"castle",
361	"casual",
362	"cat",
363	"catalog",
364	"catch",
365	"category",
366	"cattle",
367	"caught",
368	"cause",
369	"caution",
370	"cave",
371	"ceiling",
372	"celery",
373	"cement",
374	"census",
375	"century",
376	"cereal",
377	"certain",
378	"chair",
379	"chalk",
380	"champion",
381	"change",
382	"chaos",
383	"chapter",
384	"charge",
385	"chase",
386	"chat",
387	"cheap",
388	"check",
389	"cheese",
390	"chef",
391	"cherry",
392	"chest",
393	"chicken",
394	"chief",
395	"child",
396	"chimney",
397	"choice",
398	"choose",
399	"chronic",
400	"chuckle",
401	"chunk",
402	"churn",
403	"cigar",
404	"cinnamon",
405	"circle",
406	"citizen",
407	"city",
408	"civil",
409	"claim",
410	"clap",
411	"clarify",
412	"claw",
413	"clay",
414	"clean",
415	"clerk",
416	"clever",
417	"click",
418	"client",
419	"cliff",
420	"climb",
421	"clinic",
422	"clip",
423	"clock",
424	"clog",
425	"close",
426	"cloth",
427	"cloud",
428	"clown",
429	"club",
430	"clump",
431	"cluster",
432	"clutch",
433	"coach",
434	"coast",
435	"coconut",
436	"code",
437	"coffee",
438	"coil",
439	"coin",
440	"collect",
441	"color",
442	"column",
443	"combine",
444	"come",
445	"comfort",
446	"comic",
447	"common",
448	"company",
449	"concert",
450	"conduct",
451	"confirm",
452	"congress",
453	"connect",
454	"consider",
455	"control",
456	"convince",
457	"cook",
458	"cool",
459	"copper",
460	"copy",
461	"coral",
462	"core",
463	"corn",
464	"correct",
465	"cost",
466	"cotton",
467	"couch",
468	"country",
469	"couple",
470	"course",
471	"cousin",
472	"cover",
473	"coyote",
474	"crack",
475	"cradle",
476	"craft",
477	"cram",
478	"crane",
479	"crash",
480	"crater",
481	"crawl",
482	"crazy",
483	"cream",
484	"credit",
485	"creek",
486	"crew",
487	"cricket",
488	"crime",
489	"crisp",
490	"critic",
491	"crop",
492	"cross",
493	"crouch",
494	"crowd",
495	"crucial",
496	"cruel",
497	"cruise",
498	"crumble",
499	"crunch",
500	"crush",
501	"cry",
502	"crystal",
503	"cube",
504	"culture",
505	"cup",
506	"cupboard",
507	"curious",
508	"current",
509	"curtain",
510	"curve",
511	"cushion",
512	"custom",
513	"cute",
514	"cycle",
515	"dad",
516	"damage",
517	"damp",
518	"dance",
519	"danger",
520	"daring",
521	"dash",
522	"daughter",
523	"dawn",
524	"day",
525	"deal",
526	"debate",
527	"debris",
528	"decade",
529	"december",
530	"decide",
531	"decline",
532	"decorate",
533	"decrease",
534	"deer",
535	"defense",
536	"define",
537	"defy",
538	"degree",
539	"delay",
540	"deliver",
541	"demand",
542	"demise",
543	"denial",
544	"dentist",
545	"deny",
546	"depart",
547	"depend",
548	"deposit",
549	"depth",
550	"deputy",
551	"derive",
552	"describe",
553	"desert",
554	"design",
555	"desk",
556	"despair",
557	"destroy",
558	"detail",
559	"detect",
560	"develop",
561	"device",
562	"devote",
563	"diagram",
564	"dial",
565	"diamond",
566	"diary",
567	"dice",
568	"diesel",
569	"diet",
570	"differ",
571	"digital",
572	"dignity",
573	"dilemma",
574	"dinner",
575	"dinosaur",
576	"direct",
577	"dirt",
578	"disagree",
579	"discover",
580	"disease",
581	"dish",
582	"dismiss",
583	"disorder",
584	"display",
585	"distance",
586	"divert",
587	"divide",
588	"divorce",
589	"dizzy",
590	"doctor",
591	"document",
592	"dog",
593	"doll",
594	"dolphin",
595	"domain",
596	"donate",
597	"donkey",
598	"donor",
599	"door",
600	"dose",
601	"double",
602	"dove",
603	"draft",
604	"dragon",
605	"drama",
606	"drastic",
607	"draw",
608	"dream",
609	"dress",
610	"drift",
611	"drill",
612	"drink",
613	"drip",
614	"drive",
615	"drop",
616	"drum",
617	"dry",
618	"duck",
619	"dumb",
620	"dune",
621	"during",
622	"dust",
623	"dutch",
624	"duty",
625	"dwarf",
626	"dynamic",
627	"eager",
628	"eagle",
629	"early",
630	"earn",
631	"earth",
632	"easily",
633	"east",
634	"easy",
635	"echo",
636	"ecology",
637	"economy",
638	"edge",
639	"edit",
640	"educate",
641	"effort",
642	"egg",
643	"eight",
644	"either",
645	"elbow",
646	"elder",
647	"electric",
648	"elegant",
649	"element",
650	"elephant",
651	"elevator",
652	"elite",
653	"else",
654	"embark",
655	"embody",
656	"embrace",
657	"emerge",
658	"emotion",
659	"employ",
660	"empower",
661	"empty",
662	"enable",
663	"enact",
664	"end",
665	"endless",
666	"endorse",
667	"enemy",
668	"energy",
669	"enforce",
670	"engage",
671	"engine",
672	"enhance",
673	"enjoy",
674	"enlist",
675	"enough",
676	"enrich",
677	"enroll",
678	"ensure",
679	"enter",
680	"entire",
681	"entry",
682	"envelope",
683	"episode",
684	"equal",
685	"equip",
686	"era",
687	"erase",
688	"erode",
689	"erosion",
690	"error",
691	"erupt",
692	"escape",
693	"essay",
694	"essence",
695	"estate",
696	"eternal",
697	"ethics",
698	"evidence",
699	"evil",
700	"evoke",
701	"evolve",
702	"exact",
703	"example",
704	"excess",
705	"exchange",
706	"excite",
707	"exclude",
708	"excuse",
709	"execute",
710	"exercise",
711	"exhaust",
712	"exhibit",
713	"exile",
714	"exist",
715	"exit",
716	"exotic",
717	"expand",
718	"expect",
719	"expire",
720	"explain",
721	"expose",
722	"express",
723	"extend",
724	"extra",
725	"eye",
726	"eyebrow",
727	"fabric",
728	"face",
729	"faculty",
730	"fade",
731	"faint",
732	"faith",
733	"fall",
734	"false",
735	"fame",
736	"family",
737	"famous",
738	"fan",
739	"fancy",
740	"fantasy",
741	"farm",
742	"fashion",
743	"fat",
744	"fatal",
745	"father",
746	"fatigue",
747	"fault",
748	"favorite",
749	"feature",
750	"february",
751	"federal",
752	"fee",
753	"feed",
754	"feel",
755	"female",
756	"fence",
757	"festival",
758	"fetch",
759	"fever",
760	"few",
761	"fiber",
762	"fiction",
763	"field",
764	"figure",
765	"file",
766	"film",
767	"filter",
768	"final",
769	"find",
770	"fine",
771	"finger",
772	"finish",
773	"fire",
774	"firm",
775	"first",
776	"fiscal",
777	"fish",
778	"fit",
779	"fitness",
780	"fix",
781	"flag",
782	"flame",
783	"flash",
784	"flat",
785	"flavor",
786	"flee",
787	"flight",
788	"flip",
789	"float",
790	"flock",
791	"floor",
792	"flower",
793	"fluid",
794	"flush",
795	"fly",
796	"foam",
797	"focus",
798	"fog",
799	"foil",
800	"fold",
801	"follow",
802	"food",
803	"foot",
804	"force",
805	"forest",
806	"forget",
807	"fork",
808	"fortune",
809	"forum",
810	"forward",
811	"fossil",
812	"foster",
813	"found",
814	"fox",
815	"fragile",
816	"frame",
817	"frequent",
818	"fresh",
819	"friend",
820	"fringe",
821	"frog",
822	"front",
823	"frost",
824	"frown",
825	"frozen",
826	"fruit",
827	"fuel",
828	"fun",
829	"funny",
830	"furnace",
831	"fury",
832	"future",
833	"gadget",
834	"gain",
835	"galaxy",
836	"gallery",
837	"game",
838	"gap",
839	"garage",
840	"garbage",
841	"garden",
842	"garlic",
843	"garment",
844	"gas",
845	"gasp",
846	"gate",
847	"gather",
848	"gauge",
849	"gaze",
850	"general",
851	"genius",
852	"genre",
853	"gentle",
854	"genuine",
855	"gesture",
856	"ghost",
857	"giant",
858	"gift",
859	"giggle",
860	"ginger",
861	"giraffe",
862	"girl",
863	"give",
864	"glad",
865	"glance",
866	"glare",
867	"glass",
868	"glide",
869	"glimpse",
870	"globe",
871	"gloom",
872	"glory",
873	"glove",
874	"glow",
875	"glue",
876	"goat",
877	"goddess",
878	"gold",
879	"good",
880	"goose",
881	"gorilla",
882	"gospel",
883	"gossip",
884	"govern",
885	"gown",
886	"grab",
887	"grace",
888	"grain",
889	"grant",
890	"grape",
891	"grass",
892	"gravity",
893	"great",
894	"green",
895	"grid",
896	"grief",
897	"grit",
898	"grocery",
899	"group",
900	"grow",
901	"grunt",
902	"guard",
903	"guess",
904	"guide",
905	"guilt",
906	"guitar",
907	"gun",
908	"gym",
909	"habit",
910	"hair",
911	"half",
912	"hammer",
913	"hamster",
914	"hand",
915	"happy",
916	"harbor",
917	"hard",
918	"harsh",
919	"harvest",
920	"hat",
921	"have",
922	"hawk",
923	"hazard",
924	"head",
925	"health",
926	"heart",
927	"heavy",
928	"hedgehog",
929	"height",
930	"hello",
931	"helmet",
932	"help",
933	"hen",
934	"hero",
935	"hidden",
936	"high",
937	"hill",
938	"hint",
939	"hip",
940	"hire",
941	"history",
942	"hobby",
943	"hockey",
944	"hold",
945	"hole",
946	"holiday",
947	"hollow",
948	"home",
949	"honey",
950	"hood",
951	"hope",
952	"horn",
953	"horror",
954	"horse",
955	"hospital",
956	"host",
957	"hotel",
958	"hour",
959	"hover",
960	"hub",
961	"huge",
962	"human",
963	"humble",
964	"humor",
965	"hundred",
966	"hungry",
967	"hunt",
968	"hurdle",
969	"hurry",
970	"hurt",
971	"husband",
972	"hybrid",
973	"ice",
974	"icon",
975	"idea",
976	"identify",
977	"idle",
978	"ignore",
979	"ill",
980	"illegal",
981	"illness",
982	"image",
983	"imitate",
984	"immense",
985	"immune",
986	"impact",
987	"impose",
988	"improve",
989	"impulse",
990	"inch",
991	"include",
992	"income",
993	"increase",
994	"index",
995	"indicate",
996	"indoor",
997	"industry",
998	"infant",
999	"inflict",
1000	"inform",
1001	"inhale",
1002	"inherit",
1003	"initial",
1004	"inject",
1005	"injury",
1006	"inmate",
1007	"inner",
1008	"innocent",
1009	"input",
1010	"inquiry",
1011	"insane",
1012	"insect",
1013	"inside",
1014	"inspire",
1015	"install",
1016	"intact",
1017	"interest",
1018	"into",
1019	"invest",
1020	"invite",
1021	"involve",
1022	"iron",
1023	"island",
1024	"isolate",
1025	"issue",
1026	"item",
1027	"ivory",
1028	"jacket",
1029	"jaguar",
1030	"jar",
1031	"jazz",
1032	"jealous",
1033	"jeans",
1034	"jelly",
1035	"jewel",
1036	"job",
1037	"join",
1038	"joke",
1039	"journey",
1040	"joy",
1041	"judge",
1042	"juice",
1043	"jump",
1044	"jungle",
1045	"junior",
1046	"junk",
1047	"just",
1048	"kangaroo",
1049	"keen",
1050	"keep",
1051	"ketchup",
1052	"key",
1053	"kick",
1054	"kid",
1055	"kidney",
1056	"kind",
1057	"kingdom",
1058	"kiss",
1059	"kit",
1060	"kitchen",
1061	"kite",
1062	"kitten",
1063	"kiwi",
1064	"knee",
1065	"knife",
1066	"knock",
1067	"know",
1068	"lab",
1069	"label",
1070	"labor",
1071	"ladder",
1072	"lady",
1073	"lake",
1074	"lamp",
1075	"language",
1076	"laptop",
1077	"large",
1078	"later",
1079	"latin",
1080	"laugh",
1081	"laundry",
1082	"lava",
1083	"law",
1084	"lawn",
1085	"lawsuit",
1086	"layer",
1087	"lazy",
1088	"leader",
1089	"leaf",
1090	"learn",
1091	"leave",
1092	"lecture",
1093	"left",
1094	"leg",
1095	"legal",
1096	"legend",
1097	"leisure",
1098	"lemon",
1099	"lend",
1100	"length",
1101	"lens",
1102	"leopard",
1103	"lesson",
1104	"letter",
1105	"level",
1106	"liar",
1107	"liberty",
1108	"library",
1109	"license",
1110	"life",
1111	"lift",
1112	"light",
1113	"like",
1114	"limb",
1115	"limit",
1116	"link",
1117	"lion",
1118	"liquid",
1119	"list",
1120	"little",
1121	"live",
1122	"lizard",
1123	"load",
1124	"loan",
1125	"lobster",
1126	"local",
1127	"lock",
1128	"logic",
1129	"lonely",
1130	"long",
1131	"loop",
1132	"lottery",
1133	"loud",
1134	"lounge",
1135	"love",
1136	"loyal",
1137	"lucky",
1138	"luggage",
1139	"lumber",
1140	"lunar",
1141	"lunch",
1142	"luxury",
1143	"lyrics",
1144	"machine",
1145	"mad",
1146	"magic",
1147	"magnet",
1148	"maid",
1149	"mail",
1150	"main",
1151	"major",
1152	"make",
1153	"mammal",
1154	"man",
1155	"manage",
1156	"mandate",
1157	"mango",
1158	"mansion",
1159	"manual",
1160	"maple",
1161	"marble",
1162	"march",
1163	"margin",
1164	"marine",
1165	"market",
1166	"marriage",
1167	"mask",
1168	"mass",
1169	"master",
1170	"match",
1171	"material",
1172	"math",
1173	"matrix",
1174	"matter",
1175	"maximum",
1176	"maze",
1177	"meadow",
1178	"mean",
1179	"measure",
1180	"meat",
1181	"mechanic",
1182	"medal",
1183	"media",
1184	"melody",
1185	"melt",
1186	"member",
1187	"memory",
1188	"mention",
1189	"menu",
1190	"mercy",
1191	"merge",
1192	"merit",
1193	"merry",
1194	"mesh",
1195	"message",
1196	"metal",
1197	"method",
1198	"middle",
1199	"midnight",
1200	"milk",
1201	"million",
1202	"mimic",
1203	"mind",
1204	"minimum",
1205	"minor",
1206	"minute",
1207	"miracle",
1208	"mirror",
1209	"misery",
1210	"miss",
1211	"mistake",
1212	"mix",
1213	"mixed",
1214	"mixture",
1215	"mobile",
1216	"model",
1217	"modify",
1218	"mom",
1219	"moment",
1220	"monitor",
1221	"monkey",
1222	"monster",
1223	"month",
1224	"moon",
1225	"moral",
1226	"more",
1227	"morning",
1228	"mosquito",
1229	"mother",
1230	"motion",
1231	"motor",
1232	"mountain",
1233	"mouse",
1234	"move",
1235	"movie",
1236	"much",
1237	"muffin",
1238	"mule",
1239	"multiply",
1240	"muscle",
1241	"museum",
1242	"mushroom",
1243	"music",
1244	"must",
1245	"mutual",
1246	"myself",
1247	"mystery",
1248	"myth",
1249	"naive",
1250	"name",
1251	"napkin",
1252	"narrow",
1253	"nasty",
1254	"nation",
1255	"nature",
1256	"near",
1257	"neck",
1258	"need",
1259	"negative",
1260	"neglect",
1261	"neither",
1262	"nephew",
1263	"nerve",
1264	"nest",
1265	"net",
1266	"network",
1267	"neutral",
1268	"never",
1269	"news",
1270	"next",
1271	"nice",
1272	"night",
1273	"noble",
1274	"noise",
1275	"nominee",
1276	"noodle",
1277	"normal",
1278	"north",
1279	"nose",
1280	"notable",
1281	"note",
1282	"nothing",
1283	"notice",
1284	"novel",
1285	"now",
1286	"nuclear",
1287	"number",
1288	"nurse",
1289	"nut",
1290	"oak",
1291	"obey",
1292	"object",
1293	"oblige",
1294	"obscure",
1295	"observe",
1296	"obtain",
1297	"obvious",
1298	"occur",
1299	"ocean",
1300	"october",
1301	"odor",
1302	"off",
1303	"offer",
1304	"office",
1305	"often",
1306	"oil",
1307	"okay",
1308	"old",
1309	"olive",
1310	"olympic",
1311	"omit",
1312	"once",
1313	"one",
1314	"onion",
1315	"online",
1316	"only",
1317	"open",
1318	"opera",
1319	"opinion",
1320	"oppose",
1321	"option",
1322	"orange",
1323	"orbit",
1324	"orchard",
1325	"order",
1326	"ordinary",
1327	"organ",
1328	"orient",
1329	"original",
1330	"orphan",
1331	"ostrich",
1332	"other",
1333	"outdoor",
1334	"outer",
1335	"output",
1336	"outside",
1337	"oval",
1338	"oven",
1339	"over",
1340	"own",
1341	"owner",
1342	"oxygen",
1343	"oyster",
1344	"ozone",
1345	"pact",
1346	"paddle",
1347	"page",
1348	"pair",
1349	"palace",
1350	"palm",
1351	"panda",
1352	"panel",
1353	"panic",
1354	"panther",
1355	"paper",
1356	"parade",
1357	"parent",
1358	"park",
1359	"parrot",
1360	"party",
1361	"pass",
1362	"patch",
1363	"path",
1364	"patient",
1365	"patrol",
1366	"pattern",
1367	"pause",
1368	"pave",
1369	"payment",
1370	"peace",
1371	"peanut",
1372	"pear",
1373	"peasant",
1374	"pelican",
1375	"pen",
1376	"penalty",
1377	"pencil",
1378	"people",
1379	"pepper",
1380	"perfect",
1381	"permit",
1382	"person",
1383	"pet",
1384	"phone",
1385	"photo",
1386	"phrase",
1387	"physical",
1388	"piano",
1389	"picnic",
1390	"picture",
1391	"piece",
1392	"pig",
1393	"pigeon",
1394	"pill",
1395	"pilot",
1396	"pink",
1397	"pioneer",
1398	"pipe",
1399	"pistol",
1400	"pitch",
1401	"pizza",
1402	"place",
1403	"planet",
1404	"plastic",
1405	"plate",
1406	"play",
1407	"please",
1408	"pledge",
1409	"pluck",
1410	"plug",
1411	"plunge",
1412	"poem",
1413	"poet",
1414	"point",
1415	"polar",
1416	"pole",
1417	"police",
1418	"pond",
1419	"pony",
1420	"pool",
1421	"popular",
1422	"portion",
1423	"position",
1424	"possible",
1425	"post",
1426	"potato",
1427	"pottery",
1428	"poverty",
1429	"powder",
1430	"power",
1431	"practice",
1432	"praise",
1433	"predict",
1434	"prefer",
1435	"prepare",
1436	"present",
1437	"pretty",
1438	"prevent",
1439	"price",
1440	"pride",
1441	"primary",
1442	"print",
1443	"priority",
1444	"prison",
1445	"private",
1446	"prize",
1447	"problem",
1448	"process",
1449	"produce",
1450	"profit",
1451	"program",
1452	"project",
1453	"promote",
1454	"proof",
1455	"property",
1456	"prosper",
1457	"protect",
1458	"proud",
1459	"provide",
1460	"public",
1461	"pudding",
1462	"pull",
1463	"pulp",
1464	"pulse",
1465	"pumpkin",
1466	"punch",
1467	"pupil",
1468	"puppy",
1469	"purchase",
1470	"purity",
1471	"purpose",
1472	"purse",
1473	"push",
1474	"put",
1475	"puzzle",
1476	"pyramid",
1477	"quality",
1478	"quantum",
1479	"quarter",
1480	"question",
1481	"quick",
1482	"quit",
1483	"quiz",
1484	"quote",
1485	"rabbit",
1486	"raccoon",
1487	"race",
1488	"rack",
1489	"radar",
1490	"radio",
1491	"rail",
1492	"rain",
1493	"raise",
1494	"rally",
1495	"ramp",
1496	"ranch",
1497	"random",
1498	"range",
1499	"rapid",
1500	"rare",
1501	"rate",
1502	"rather",
1503	"raven",
1504	"raw",
1505	"razor",
1506	"ready",
1507	"real",
1508	"reason",
1509	"rebel",
1510	"rebuild",
1511	"recall",
1512	"receive",
1513	"recipe",
1514	"record",
1515	"recycle",
1516	"reduce",
1517	"reflect",
1518	"reform",
1519	"refuse",
1520	"region",
1521	"regret",
1522	"regular",
1523	"reject",
1524	"relax",
1525	"release",
1526	"relief",
1527	"rely",
1528	"remain",
1529	"remember",
1530	"remind",
1531	"remove",
1532	"render",
1533	"renew",
1534	"rent",
1535	"reopen",
1536	"repair",
1537	"repeat",
1538	"replace",
1539	"report",
1540	"require",
1541	"rescue",
1542	"resemble",
1543	"resist",
1544	"resource",
1545	"response",
1546	"result",
1547	"retire",
1548	"retreat",
1549	"return",
1550	"reunion",
1551	"reveal",
1552	"review",
1553	"reward",
1554	"rhythm",
1555	"rib",
1556	"ribbon",
1557	"rice",
1558	"rich",
1559	"ride",
1560	"ridge",
1561	"rifle",
1562	"right",
1563	"rigid",
1564	"ring",
1565	"riot",
1566	"ripple",
1567	"risk",
1568	"ritual",
1569	"rival",
1570	"river",
1571	"road",
1572	"roast",
1573	"robot",
1574	"robust",
1575	"rocket",
1576	"romance",
1577	"roof",
1578	"rookie",
1579	"room",
1580	"rose",
1581	"rotate",
1582	"rough",
1583	"round",
1584	"route",
1585	"royal",
1586	"rubber",
1587	"rude",
1588	"rug",
1589	"rule",
1590	"run",
1591	"runway",
1592	"rural",
1593	"sad",
1594	"saddle",
1595	"sadness",
1596	"safe",
1597	"sail",
1598	"salad",
1599	"salmon",
1600	"salon",
1601	"salt",
1602	"salute",
1603	"same",
1604	"sample",
1605	"sand",
1606	"satisfy",
1607	"satoshi",
1608	"sauce",
1609	"sausage",
1610	"save",
1611	"say",
1612	"scale",
1613	"scan",
1614	"scare",
1615	"scatter",
1616	"scene",
1617	"scheme",
1618	"school",
1619	"science",
1620	"scissors",
1621	"scorpion",
1622	"scout",
1623	"scrap",
1624	"screen",
1625	"script",
1626	"scrub",
1627	"sea",
1628	"search",
1629	"season",
1630	"seat",
1631	"second",
1632	"secret",
1633	"section",
1634	"security",
1635	"seed",
1636	"seek",
1637	"segment",
1638	"select",
1639	"sell",
1640	"seminar",
1641	"senior",
1642	"sense",
1643	"sentence",
1644	"series",
1645	"service",
1646	"session",
1647	"settle",
1648	"setup",
1649	"seven",
1650	"shadow",
1651	"shaft",
1652	"shallow",
1653	"share",
1654	"shed",
1655	"shell",
1656	"sheriff",
1657	"shield",
1658	"shift",
1659	"shine",
1660	"ship",
1661	"shiver",
1662	"shock",
1663	"shoe",
1664	"shoot",
1665	"shop",
1666	"short",
1667	"shoulder",
1668	"shove",
1669	"shrimp",
1670	"shrug",
1671	"shuffle",
1672	"shy",
1673	"sibling",
1674	"sick",
1675	"side",
1676	"siege",
1677	"sight",
1678	"sign",
1679	"silent",
1680	"silk",
1681	"silly",
1682	"silver",
1683	"similar",
1684	"simple",
1685	"since",
1686	"sing",
1687	"siren",
1688	"sister",
1689	"situate",
1690	"six",
1691	"size",
1692	"skate",
1693	"sketch",
1694	"ski",
1695	"skill",
1696	"skin",
1697	"skirt",
1698	"skull",
1699	"slab",
1700	"slam",
1701	"sleep",
1702	"slender",
1703	"slice",
1704	"slide",
1705	"slight",
1706	"slim",
1707	"slogan",
1708	"slot",
1709	"slow",
1710	"slush",
1711	"small",
1712	"smart",
1713	"smile",
1714	"smoke",
1715	"smooth",
1716	"snack",
1717	"snake",
1718	"snap",
1719	"sniff",
1720	"snow",
1721	"soap",
1722	"soccer",
1723	"social",
1724	"sock",
1725	"soda",
1726	"soft",
1727	"solar",
1728	"soldier",
1729	"solid",
1730	"solution",
1731	"solve",
1732	"someone",
1733	"song",
1734	"soon",
1735	"sorry",
1736	"sort",
1737	"soul",
1738	"sound",
1739	"soup",
1740	"source",
1741	"south",
1742	"space",
1743	"spare",
1744	"spatial",
1745	"spawn",
1746	"speak",
1747	"special",
1748	"speed",
1749	"spell",
1750	"spend",
1751	"sphere",
1752	"spice",
1753	"spider",
1754	"spike",
1755	"spin",
1756	"spirit",
1757	"split",
1758	"spoil",
1759	"sponsor",
1760	"spoon",
1761	"sport",
1762	"spot",
1763	"spray",
1764	"spread",
1765	"spring",
1766	"spy",
1767	"square",
1768	"squeeze",
1769	"squirrel",
1770	"stable",
1771	"stadium",
1772	"staff",
1773	"stage",
1774	"stairs",
1775	"stamp",
1776	"stand",
1777	"start",
1778	"state",
1779	"stay",
1780	"steak",
1781	"steel",
1782	"stem",
1783	"step",
1784	"stereo",
1785	"stick",
1786	"still",
1787	"sting",
1788	"stock",
1789	"stomach",
1790	"stone",
1791	"stool",
1792	"story",
1793	"stove",
1794	"strategy",
1795	"street",
1796	"strike",
1797	"strong",
1798	"struggle",
1799	"student",
1800	"stuff",
1801	"stumble",
1802	"style",
1803	"subject",
1804	"submit",
1805	"subway",
1806	"success",
1807	"such",
1808	"sudden",
1809	"suffer",
1810	"sugar",
1811	"suggest",
1812	"suit",
1813	"summer",
1814	"sun",
1815	"sunny",
1816	"sunset",
1817	"super",
1818	"supply",
1819	"supreme",
1820	"sure",
1821	"surface",
1822	"surge",
1823	"surprise",
1824	"surround",
1825	"survey",
1826	"suspect",
1827	"sustain",
1828	"swallow",
1829	"swamp",
1830	"swap",
1831	"swarm",
1832	"swear",
1833	"sweet",
1834	"swift",
1835	"swim",
1836	"swing",
1837	"switch",
1838	"sword",
1839	"symbol",
1840	"symptom",
1841	"syrup",
1842	"system",
1843	"table",
1844	"tackle",
1845	"tag",
1846	"tail",
1847	"talent",
1848	"talk",
1849	"tank",
1850	"tape",
1851	"target",
1852	"task",
1853	"taste",
1854	"tattoo",
1855	"taxi",
1856	"teach",
1857	"team",
1858	"tell",
1859	"ten",
1860	"tenant",
1861	"tennis",
1862	"tent",
1863	"term",
1864	"test",
1865	"text",
1866	"thank",
1867	"that",
1868	"theme",
1869	"then",
1870	"theory",
1871	"there",
1872	"they",
1873	"thing",
1874	"this",
1875	"thought",
1876	"three",
1877	"thrive",
1878	"throw",
1879	"thumb",
1880	"thunder",
1881	"ticket",
1882	"tide",
1883	"tiger",
1884	"tilt",
1885	"timber",
1886	"time",
1887	"tiny",
1888	"tip",
1889	"tired",
1890	"tissue",
1891	"title",
1892	"toast",
1893	"tobacco",
1894	"today",
1895	"toddler",
1896	"toe",
1897	"together",
1898	"toilet",
1899	"token",
1900	"tomato",
1901	"tomorrow",
1902	"tone",
1903	"tongue",
1904	"tonight",
1905	"tool",
1906	"tooth",
1907	"top",
1908	"topic",
1909	"topple",
1910	"torch",
1911	"tornado",
1912	"tortoise",
1913	"toss",
1914	"total",
1915	"tourist",
1916	"toward",
1917	"tower",
1918	"town",
1919	"toy",
1920	"track",
1921	"trade",
1922	"traffic",
1923	"tragic",
1924	"train",
1925	"transfer",
1926	"trap",
1927	"trash",
1928	"travel",
1929	"tray",
1930	"treat",
1931	"tree",
1932	"trend",
1933	"trial",
1934	"tribe",
1935	"trick",
1936	"trigger",
1937	"trim",
1938	"trip",
1939	"trophy",
1940	"trouble",
1941	"truck",
1942	"true",
1943	"truly",
1944	"trumpet",
1945	"trust",
1946	"truth",
1947	"try",
1948	"tube",
1949	"tuition",
1950	"tumble",
1951	"tuna",
1952	"tunnel",
1953	"turkey",
1954	"turn",
1955	"turtle",
1956	"twelve",
1957	"twenty",
1958	"twice",
1959	"twin",
1960	"twist",
1961	"two",
1962	"type",
1963	"typical",
1964	"ugly",
1965	"umbrella",
1966	"unable",
1967	"unaware",
1968	"uncle",
1969	"uncover",
1970	"under",
1971	"undo",
1972	"unfair",
1973	"unfold",
1974	"unhappy",
1975	"uniform",
1976	"unique",
1977	"unit",
1978	"universe",
1979	"unknown",
1980	"unlock",
1981	"until",
1982	"unusual",
1983	"unveil",
1984	"update",
1985	"upgrade",
1986	"uphold",
1987	"upon",
1988	"upper",
1989	"upset",
1990	"urban",
1991	"urge",
1992	"usage",
1993	"use",
1994	"used",
1995	"useful",
1996	"useless",
1997	"usual",
1998	"utility",
1999	"vacant",
2000	"vacuum",
2001	"vague",
2002	"valid",
2003	"valley",
2004	"valve",
2005	"van",
2006	"vanish",
2007	"vapor",
2008	"various",
2009	"vast",
2010	"vault",
2011	"vehicle",
2012	"velvet",
2013	"vendor",
2014	"venture",
2015	"venue",
2016	"verb",
2017	"verify",
2018	"version",
2019	"very",
2020	"vessel",
2021	"veteran",
2022	"viable",
2023	"vibrant",
2024	"vicious",
2025	"victory",
2026	"video",
2027	"view",
2028	"village",
2029	"vintage",
2030	"violin",
2031	"virtual",
2032	"virus",
2033	"visa",
2034	"visit",
2035	"visual",
2036	"vital",
2037	"vivid",
2038	"vocal",
2039	"voice",
2040	"void",
2041	"volcano",
2042	"volume",
2043	"vote",
2044	"voyage",
2045	"wage",
2046	"wagon",
2047	"wait",
2048	"walk",
2049	"wall",
2050	"walnut",
2051	"want",
2052	"warfare",
2053	"warm",
2054	"warrior",
2055	"wash",
2056	"wasp",
2057	"waste",
2058	"water",
2059	"wave",
2060	"way",
2061	"wealth",
2062	"weapon",
2063	"wear",
2064	"weasel",
2065	"weather",
2066	"web",
2067	"wedding",
2068	"weekend",
2069	"weird",
2070	"welcome",
2071	"west",
2072	"wet",
2073	"whale",
2074	"what",
2075	"wheat",
2076	"wheel",
2077	"when",
2078	"where",
2079	"whip",
2080	"whisper",
2081	"wide",
2082	"width",
2083	"wife",
2084	"wild",
2085	"will",
2086	"win",
2087	"window",
2088	"wine",
2089	"wing",
2090	"wink",
2091	"winner",
2092	"winter",
2093	"wire",
2094	"wisdom",
2095	"wise",
2096	"wish",
2097	"witness",
2098	"wolf",
2099	"woman",
2100	"wonder",
2101	"wood",
2102	"wool",
2103	"word",
2104	"work",
2105	"world",
2106	"worry",
2107	"worth",
2108	"wrap",
2109	"wreck",
2110	"wrestle",
2111	"wrist",
2112	"write",
2113	"wrong",
2114	"yard",
2115	"year",
2116	"yellow",
2117	"you",
2118	"young",
2119	"youth",
2120	"zebra",
2121	"zero",
2122	"zone",
2123	"zoo",
2124}
2125
2126var secwordSet map[string]bool
2127
2128func init() {
2129	secwordSet = make(map[string]bool)
2130	for _, w := range secwords {
2131		secwordSet[w] = true
2132	}
2133}
2134