rippled
Loading...
Searching...
No Matches
RFC1751.cpp
1#include <xrpl/beast/utility/instrumentation.h>
2#include <xrpl/crypto/RFC1751.h>
3
4#include <boost/algorithm/string/classification.hpp>
5#include <boost/algorithm/string/constants.hpp>
6#include <boost/algorithm/string/split.hpp>
7#include <boost/algorithm/string/trim.hpp>
8#include <boost/range/adaptor/copied.hpp>
9
10#include <cctype>
11#include <cstddef>
12#include <cstdint>
13#include <cstring>
14#include <string>
15#include <vector>
16
17namespace ripple {
18
19//
20// RFC 1751 code converted to C++/Boost.
21//
22
23char const* RFC1751::s_dictionary[2048] = {
24 "A", "ABE", "ACE", "ACT", "AD", "ADA", "ADD", "AGO", "AID",
25 "AIM", "AIR", "ALL", "ALP", "AM", "AMY", "AN", "ANA", "AND",
26 "ANN", "ANT", "ANY", "APE", "APS", "APT", "ARC", "ARE", "ARK",
27 "ARM", "ART", "AS", "ASH", "ASK", "AT", "ATE", "AUG", "AUK",
28 "AVE", "AWE", "AWK", "AWL", "AWN", "AX", "AYE", "BAD", "BAG",
29 "BAH", "BAM", "BAN", "BAR", "BAT", "BAY", "BE", "BED", "BEE",
30 "BEG", "BEN", "BET", "BEY", "BIB", "BID", "BIG", "BIN", "BIT",
31 "BOB", "BOG", "BON", "BOO", "BOP", "BOW", "BOY", "BUB", "BUD",
32 "BUG", "BUM", "BUN", "BUS", "BUT", "BUY", "BY", "BYE", "CAB",
33 "CAL", "CAM", "CAN", "CAP", "CAR", "CAT", "CAW", "COD", "COG",
34 "COL", "CON", "COO", "COP", "COT", "COW", "COY", "CRY", "CUB",
35 "CUE", "CUP", "CUR", "CUT", "DAB", "DAD", "DAM", "DAN", "DAR",
36 "DAY", "DEE", "DEL", "DEN", "DES", "DEW", "DID", "DIE", "DIG",
37 "DIN", "DIP", "DO", "DOE", "DOG", "DON", "DOT", "DOW", "DRY",
38 "DUB", "DUD", "DUE", "DUG", "DUN", "EAR", "EAT", "ED", "EEL",
39 "EGG", "EGO", "ELI", "ELK", "ELM", "ELY", "EM", "END", "EST",
40 "ETC", "EVA", "EVE", "EWE", "EYE", "FAD", "FAN", "FAR", "FAT",
41 "FAY", "FED", "FEE", "FEW", "FIB", "FIG", "FIN", "FIR", "FIT",
42 "FLO", "FLY", "FOE", "FOG", "FOR", "FRY", "FUM", "FUN", "FUR",
43 "GAB", "GAD", "GAG", "GAL", "GAM", "GAP", "GAS", "GAY", "GEE",
44 "GEL", "GEM", "GET", "GIG", "GIL", "GIN", "GO", "GOT", "GUM",
45 "GUN", "GUS", "GUT", "GUY", "GYM", "GYP", "HA", "HAD", "HAL",
46 "HAM", "HAN", "HAP", "HAS", "HAT", "HAW", "HAY", "HE", "HEM",
47 "HEN", "HER", "HEW", "HEY", "HI", "HID", "HIM", "HIP", "HIS",
48 "HIT", "HO", "HOB", "HOC", "HOE", "HOG", "HOP", "HOT", "HOW",
49 "HUB", "HUE", "HUG", "HUH", "HUM", "HUT", "I", "ICY", "IDA",
50 "IF", "IKE", "ILL", "INK", "INN", "IO", "ION", "IQ", "IRA",
51 "IRE", "IRK", "IS", "IT", "ITS", "IVY", "JAB", "JAG", "JAM",
52 "JAN", "JAR", "JAW", "JAY", "JET", "JIG", "JIM", "JO", "JOB",
53 "JOE", "JOG", "JOT", "JOY", "JUG", "JUT", "KAY", "KEG", "KEN",
54 "KEY", "KID", "KIM", "KIN", "KIT", "LA", "LAB", "LAC", "LAD",
55 "LAG", "LAM", "LAP", "LAW", "LAY", "LEA", "LED", "LEE", "LEG",
56 "LEN", "LEO", "LET", "LEW", "LID", "LIE", "LIN", "LIP", "LIT",
57 "LO", "LOB", "LOG", "LOP", "LOS", "LOT", "LOU", "LOW", "LOY",
58 "LUG", "LYE", "MA", "MAC", "MAD", "MAE", "MAN", "MAO", "MAP",
59 "MAT", "MAW", "MAY", "ME", "MEG", "MEL", "MEN", "MET", "MEW",
60 "MID", "MIN", "MIT", "MOB", "MOD", "MOE", "MOO", "MOP", "MOS",
61 "MOT", "MOW", "MUD", "MUG", "MUM", "MY", "NAB", "NAG", "NAN",
62 "NAP", "NAT", "NAY", "NE", "NED", "NEE", "NET", "NEW", "NIB",
63 "NIL", "NIP", "NIT", "NO", "NOB", "NOD", "NON", "NOR", "NOT",
64 "NOV", "NOW", "NU", "NUN", "NUT", "O", "OAF", "OAK", "OAR",
65 "OAT", "ODD", "ODE", "OF", "OFF", "OFT", "OH", "OIL", "OK",
66 "OLD", "ON", "ONE", "OR", "ORB", "ORE", "ORR", "OS", "OTT",
67 "OUR", "OUT", "OVA", "OW", "OWE", "OWL", "OWN", "OX", "PA",
68 "PAD", "PAL", "PAM", "PAN", "PAP", "PAR", "PAT", "PAW", "PAY",
69 "PEA", "PEG", "PEN", "PEP", "PER", "PET", "PEW", "PHI", "PI",
70 "PIE", "PIN", "PIT", "PLY", "PO", "POD", "POE", "POP", "POT",
71 "POW", "PRO", "PRY", "PUB", "PUG", "PUN", "PUP", "PUT", "QUO",
72 "RAG", "RAM", "RAN", "RAP", "RAT", "RAW", "RAY", "REB", "RED",
73 "REP", "RET", "RIB", "RID", "RIG", "RIM", "RIO", "RIP", "ROB",
74 "ROD", "ROE", "RON", "ROT", "ROW", "ROY", "RUB", "RUE", "RUG",
75 "RUM", "RUN", "RYE", "SAC", "SAD", "SAG", "SAL", "SAM", "SAN",
76 "SAP", "SAT", "SAW", "SAY", "SEA", "SEC", "SEE", "SEN", "SET",
77 "SEW", "SHE", "SHY", "SIN", "SIP", "SIR", "SIS", "SIT", "SKI",
78 "SKY", "SLY", "SO", "SOB", "SOD", "SON", "SOP", "SOW", "SOY",
79 "SPA", "SPY", "SUB", "SUD", "SUE", "SUM", "SUN", "SUP", "TAB",
80 "TAD", "TAG", "TAN", "TAP", "TAR", "TEA", "TED", "TEE", "TEN",
81 "THE", "THY", "TIC", "TIE", "TIM", "TIN", "TIP", "TO", "TOE",
82 "TOG", "TOM", "TON", "TOO", "TOP", "TOW", "TOY", "TRY", "TUB",
83 "TUG", "TUM", "TUN", "TWO", "UN", "UP", "US", "USE", "VAN",
84 "VAT", "VET", "VIE", "WAD", "WAG", "WAR", "WAS", "WAY", "WE",
85 "WEB", "WED", "WEE", "WET", "WHO", "WHY", "WIN", "WIT", "WOK",
86 "WON", "WOO", "WOW", "WRY", "WU", "YAM", "YAP", "YAW", "YE",
87 "YEA", "YES", "YET", "YOU", "ABED", "ABEL", "ABET", "ABLE", "ABUT",
88 "ACHE", "ACID", "ACME", "ACRE", "ACTA", "ACTS", "ADAM", "ADDS", "ADEN",
89 "AFAR", "AFRO", "AGEE", "AHEM", "AHOY", "AIDA", "AIDE", "AIDS", "AIRY",
90 "AJAR", "AKIN", "ALAN", "ALEC", "ALGA", "ALIA", "ALLY", "ALMA", "ALOE",
91 "ALSO", "ALTO", "ALUM", "ALVA", "AMEN", "AMES", "AMID", "AMMO", "AMOK",
92 "AMOS", "AMRA", "ANDY", "ANEW", "ANNA", "ANNE", "ANTE", "ANTI", "AQUA",
93 "ARAB", "ARCH", "AREA", "ARGO", "ARID", "ARMY", "ARTS", "ARTY", "ASIA",
94 "ASKS", "ATOM", "AUNT", "AURA", "AUTO", "AVER", "AVID", "AVIS", "AVON",
95 "AVOW", "AWAY", "AWRY", "BABE", "BABY", "BACH", "BACK", "BADE", "BAIL",
96 "BAIT", "BAKE", "BALD", "BALE", "BALI", "BALK", "BALL", "BALM", "BAND",
97 "BANE", "BANG", "BANK", "BARB", "BARD", "BARE", "BARK", "BARN", "BARR",
98 "BASE", "BASH", "BASK", "BASS", "BATE", "BATH", "BAWD", "BAWL", "BEAD",
99 "BEAK", "BEAM", "BEAN", "BEAR", "BEAT", "BEAU", "BECK", "BEEF", "BEEN",
100 "BEER", "BEET", "BELA", "BELL", "BELT", "BEND", "BENT", "BERG", "BERN",
101 "BERT", "BESS", "BEST", "BETA", "BETH", "BHOY", "BIAS", "BIDE", "BIEN",
102 "BILE", "BILK", "BILL", "BIND", "BING", "BIRD", "BITE", "BITS", "BLAB",
103 "BLAT", "BLED", "BLEW", "BLOB", "BLOC", "BLOT", "BLOW", "BLUE", "BLUM",
104 "BLUR", "BOAR", "BOAT", "BOCA", "BOCK", "BODE", "BODY", "BOGY", "BOHR",
105 "BOIL", "BOLD", "BOLO", "BOLT", "BOMB", "BONA", "BOND", "BONE", "BONG",
106 "BONN", "BONY", "BOOK", "BOOM", "BOON", "BOOT", "BORE", "BORG", "BORN",
107 "BOSE", "BOSS", "BOTH", "BOUT", "BOWL", "BOYD", "BRAD", "BRAE", "BRAG",
108 "BRAN", "BRAY", "BRED", "BREW", "BRIG", "BRIM", "BROW", "BUCK", "BUDD",
109 "BUFF", "BULB", "BULK", "BULL", "BUNK", "BUNT", "BUOY", "BURG", "BURL",
110 "BURN", "BURR", "BURT", "BURY", "BUSH", "BUSS", "BUST", "BUSY", "BYTE",
111 "CADY", "CAFE", "CAGE", "CAIN", "CAKE", "CALF", "CALL", "CALM", "CAME",
112 "CANE", "CANT", "CARD", "CARE", "CARL", "CARR", "CART", "CASE", "CASH",
113 "CASK", "CAST", "CAVE", "CEIL", "CELL", "CENT", "CERN", "CHAD", "CHAR",
114 "CHAT", "CHAW", "CHEF", "CHEN", "CHEW", "CHIC", "CHIN", "CHOU", "CHOW",
115 "CHUB", "CHUG", "CHUM", "CITE", "CITY", "CLAD", "CLAM", "CLAN", "CLAW",
116 "CLAY", "CLOD", "CLOG", "CLOT", "CLUB", "CLUE", "COAL", "COAT", "COCA",
117 "COCK", "COCO", "CODA", "CODE", "CODY", "COED", "COIL", "COIN", "COKE",
118 "COLA", "COLD", "COLT", "COMA", "COMB", "COME", "COOK", "COOL", "COON",
119 "COOT", "CORD", "CORE", "CORK", "CORN", "COST", "COVE", "COWL", "CRAB",
120 "CRAG", "CRAM", "CRAY", "CREW", "CRIB", "CROW", "CRUD", "CUBA", "CUBE",
121 "CUFF", "CULL", "CULT", "CUNY", "CURB", "CURD", "CURE", "CURL", "CURT",
122 "CUTS", "DADE", "DALE", "DAME", "DANA", "DANE", "DANG", "DANK", "DARE",
123 "DARK", "DARN", "DART", "DASH", "DATA", "DATE", "DAVE", "DAVY", "DAWN",
124 "DAYS", "DEAD", "DEAF", "DEAL", "DEAN", "DEAR", "DEBT", "DECK", "DEED",
125 "DEEM", "DEER", "DEFT", "DEFY", "DELL", "DENT", "DENY", "DESK", "DIAL",
126 "DICE", "DIED", "DIET", "DIME", "DINE", "DING", "DINT", "DIRE", "DIRT",
127 "DISC", "DISH", "DISK", "DIVE", "DOCK", "DOES", "DOLE", "DOLL", "DOLT",
128 "DOME", "DONE", "DOOM", "DOOR", "DORA", "DOSE", "DOTE", "DOUG", "DOUR",
129 "DOVE", "DOWN", "DRAB", "DRAG", "DRAM", "DRAW", "DREW", "DRUB", "DRUG",
130 "DRUM", "DUAL", "DUCK", "DUCT", "DUEL", "DUET", "DUKE", "DULL", "DUMB",
131 "DUNE", "DUNK", "DUSK", "DUST", "DUTY", "EACH", "EARL", "EARN", "EASE",
132 "EAST", "EASY", "EBEN", "ECHO", "EDDY", "EDEN", "EDGE", "EDGY", "EDIT",
133 "EDNA", "EGAN", "ELAN", "ELBA", "ELLA", "ELSE", "EMIL", "EMIT", "EMMA",
134 "ENDS", "ERIC", "EROS", "EVEN", "EVER", "EVIL", "EYED", "FACE", "FACT",
135 "FADE", "FAIL", "FAIN", "FAIR", "FAKE", "FALL", "FAME", "FANG", "FARM",
136 "FAST", "FATE", "FAWN", "FEAR", "FEAT", "FEED", "FEEL", "FEET", "FELL",
137 "FELT", "FEND", "FERN", "FEST", "FEUD", "FIEF", "FIGS", "FILE", "FILL",
138 "FILM", "FIND", "FINE", "FINK", "FIRE", "FIRM", "FISH", "FISK", "FIST",
139 "FITS", "FIVE", "FLAG", "FLAK", "FLAM", "FLAT", "FLAW", "FLEA", "FLED",
140 "FLEW", "FLIT", "FLOC", "FLOG", "FLOW", "FLUB", "FLUE", "FOAL", "FOAM",
141 "FOGY", "FOIL", "FOLD", "FOLK", "FOND", "FONT", "FOOD", "FOOL", "FOOT",
142 "FORD", "FORE", "FORK", "FORM", "FORT", "FOSS", "FOUL", "FOUR", "FOWL",
143 "FRAU", "FRAY", "FRED", "FREE", "FRET", "FREY", "FROG", "FROM", "FUEL",
144 "FULL", "FUME", "FUND", "FUNK", "FURY", "FUSE", "FUSS", "GAFF", "GAGE",
145 "GAIL", "GAIN", "GAIT", "GALA", "GALE", "GALL", "GALT", "GAME", "GANG",
146 "GARB", "GARY", "GASH", "GATE", "GAUL", "GAUR", "GAVE", "GAWK", "GEAR",
147 "GELD", "GENE", "GENT", "GERM", "GETS", "GIBE", "GIFT", "GILD", "GILL",
148 "GILT", "GINA", "GIRD", "GIRL", "GIST", "GIVE", "GLAD", "GLEE", "GLEN",
149 "GLIB", "GLOB", "GLOM", "GLOW", "GLUE", "GLUM", "GLUT", "GOAD", "GOAL",
150 "GOAT", "GOER", "GOES", "GOLD", "GOLF", "GONE", "GONG", "GOOD", "GOOF",
151 "GORE", "GORY", "GOSH", "GOUT", "GOWN", "GRAB", "GRAD", "GRAY", "GREG",
152 "GREW", "GREY", "GRID", "GRIM", "GRIN", "GRIT", "GROW", "GRUB", "GULF",
153 "GULL", "GUNK", "GURU", "GUSH", "GUST", "GWEN", "GWYN", "HAAG", "HAAS",
154 "HACK", "HAIL", "HAIR", "HALE", "HALF", "HALL", "HALO", "HALT", "HAND",
155 "HANG", "HANK", "HANS", "HARD", "HARK", "HARM", "HART", "HASH", "HAST",
156 "HATE", "HATH", "HAUL", "HAVE", "HAWK", "HAYS", "HEAD", "HEAL", "HEAR",
157 "HEAT", "HEBE", "HECK", "HEED", "HEEL", "HEFT", "HELD", "HELL", "HELM",
158 "HERB", "HERD", "HERE", "HERO", "HERS", "HESS", "HEWN", "HICK", "HIDE",
159 "HIGH", "HIKE", "HILL", "HILT", "HIND", "HINT", "HIRE", "HISS", "HIVE",
160 "HOBO", "HOCK", "HOFF", "HOLD", "HOLE", "HOLM", "HOLT", "HOME", "HONE",
161 "HONK", "HOOD", "HOOF", "HOOK", "HOOT", "HORN", "HOSE", "HOST", "HOUR",
162 "HOVE", "HOWE", "HOWL", "HOYT", "HUCK", "HUED", "HUFF", "HUGE", "HUGH",
163 "HUGO", "HULK", "HULL", "HUNK", "HUNT", "HURD", "HURL", "HURT", "HUSH",
164 "HYDE", "HYMN", "IBIS", "ICON", "IDEA", "IDLE", "IFFY", "INCA", "INCH",
165 "INTO", "IONS", "IOTA", "IOWA", "IRIS", "IRMA", "IRON", "ISLE", "ITCH",
166 "ITEM", "IVAN", "JACK", "JADE", "JAIL", "JAKE", "JANE", "JAVA", "JEAN",
167 "JEFF", "JERK", "JESS", "JEST", "JIBE", "JILL", "JILT", "JIVE", "JOAN",
168 "JOBS", "JOCK", "JOEL", "JOEY", "JOHN", "JOIN", "JOKE", "JOLT", "JOVE",
169 "JUDD", "JUDE", "JUDO", "JUDY", "JUJU", "JUKE", "JULY", "JUNE", "JUNK",
170 "JUNO", "JURY", "JUST", "JUTE", "KAHN", "KALE", "KANE", "KANT", "KARL",
171 "KATE", "KEEL", "KEEN", "KENO", "KENT", "KERN", "KERR", "KEYS", "KICK",
172 "KILL", "KIND", "KING", "KIRK", "KISS", "KITE", "KLAN", "KNEE", "KNEW",
173 "KNIT", "KNOB", "KNOT", "KNOW", "KOCH", "KONG", "KUDO", "KURD", "KURT",
174 "KYLE", "LACE", "LACK", "LACY", "LADY", "LAID", "LAIN", "LAIR", "LAKE",
175 "LAMB", "LAME", "LAND", "LANE", "LANG", "LARD", "LARK", "LASS", "LAST",
176 "LATE", "LAUD", "LAVA", "LAWN", "LAWS", "LAYS", "LEAD", "LEAF", "LEAK",
177 "LEAN", "LEAR", "LEEK", "LEER", "LEFT", "LEND", "LENS", "LENT", "LEON",
178 "LESK", "LESS", "LEST", "LETS", "LIAR", "LICE", "LICK", "LIED", "LIEN",
179 "LIES", "LIEU", "LIFE", "LIFT", "LIKE", "LILA", "LILT", "LILY", "LIMA",
180 "LIMB", "LIME", "LIND", "LINE", "LINK", "LINT", "LION", "LISA", "LIST",
181 "LIVE", "LOAD", "LOAF", "LOAM", "LOAN", "LOCK", "LOFT", "LOGE", "LOIS",
182 "LOLA", "LONE", "LONG", "LOOK", "LOON", "LOOT", "LORD", "LORE", "LOSE",
183 "LOSS", "LOST", "LOUD", "LOVE", "LOWE", "LUCK", "LUCY", "LUGE", "LUKE",
184 "LULU", "LUND", "LUNG", "LURA", "LURE", "LURK", "LUSH", "LUST", "LYLE",
185 "LYNN", "LYON", "LYRA", "MACE", "MADE", "MAGI", "MAID", "MAIL", "MAIN",
186 "MAKE", "MALE", "MALI", "MALL", "MALT", "MANA", "MANN", "MANY", "MARC",
187 "MARE", "MARK", "MARS", "MART", "MARY", "MASH", "MASK", "MASS", "MAST",
188 "MATE", "MATH", "MAUL", "MAYO", "MEAD", "MEAL", "MEAN", "MEAT", "MEEK",
189 "MEET", "MELD", "MELT", "MEMO", "MEND", "MENU", "MERT", "MESH", "MESS",
190 "MICE", "MIKE", "MILD", "MILE", "MILK", "MILL", "MILT", "MIMI", "MIND",
191 "MINE", "MINI", "MINK", "MINT", "MIRE", "MISS", "MIST", "MITE", "MITT",
192 "MOAN", "MOAT", "MOCK", "MODE", "MOLD", "MOLE", "MOLL", "MOLT", "MONA",
193 "MONK", "MONT", "MOOD", "MOON", "MOOR", "MOOT", "MORE", "MORN", "MORT",
194 "MOSS", "MOST", "MOTH", "MOVE", "MUCH", "MUCK", "MUDD", "MUFF", "MULE",
195 "MULL", "MURK", "MUSH", "MUST", "MUTE", "MUTT", "MYRA", "MYTH", "NAGY",
196 "NAIL", "NAIR", "NAME", "NARY", "NASH", "NAVE", "NAVY", "NEAL", "NEAR",
197 "NEAT", "NECK", "NEED", "NEIL", "NELL", "NEON", "NERO", "NESS", "NEST",
198 "NEWS", "NEWT", "NIBS", "NICE", "NICK", "NILE", "NINA", "NINE", "NOAH",
199 "NODE", "NOEL", "NOLL", "NONE", "NOOK", "NOON", "NORM", "NOSE", "NOTE",
200 "NOUN", "NOVA", "NUDE", "NULL", "NUMB", "OATH", "OBEY", "OBOE", "ODIN",
201 "OHIO", "OILY", "OINT", "OKAY", "OLAF", "OLDY", "OLGA", "OLIN", "OMAN",
202 "OMEN", "OMIT", "ONCE", "ONES", "ONLY", "ONTO", "ONUS", "ORAL", "ORGY",
203 "OSLO", "OTIS", "OTTO", "OUCH", "OUST", "OUTS", "OVAL", "OVEN", "OVER",
204 "OWLY", "OWNS", "QUAD", "QUIT", "QUOD", "RACE", "RACK", "RACY", "RAFT",
205 "RAGE", "RAID", "RAIL", "RAIN", "RAKE", "RANK", "RANT", "RARE", "RASH",
206 "RATE", "RAVE", "RAYS", "READ", "REAL", "REAM", "REAR", "RECK", "REED",
207 "REEF", "REEK", "REEL", "REID", "REIN", "RENA", "REND", "RENT", "REST",
208 "RICE", "RICH", "RICK", "RIDE", "RIFT", "RILL", "RIME", "RING", "RINK",
209 "RISE", "RISK", "RITE", "ROAD", "ROAM", "ROAR", "ROBE", "ROCK", "RODE",
210 "ROIL", "ROLL", "ROME", "ROOD", "ROOF", "ROOK", "ROOM", "ROOT", "ROSA",
211 "ROSE", "ROSS", "ROSY", "ROTH", "ROUT", "ROVE", "ROWE", "ROWS", "RUBE",
212 "RUBY", "RUDE", "RUDY", "RUIN", "RULE", "RUNG", "RUNS", "RUNT", "RUSE",
213 "RUSH", "RUSK", "RUSS", "RUST", "RUTH", "SACK", "SAFE", "SAGE", "SAID",
214 "SAIL", "SALE", "SALK", "SALT", "SAME", "SAND", "SANE", "SANG", "SANK",
215 "SARA", "SAUL", "SAVE", "SAYS", "SCAN", "SCAR", "SCAT", "SCOT", "SEAL",
216 "SEAM", "SEAR", "SEAT", "SEED", "SEEK", "SEEM", "SEEN", "SEES", "SELF",
217 "SELL", "SEND", "SENT", "SETS", "SEWN", "SHAG", "SHAM", "SHAW", "SHAY",
218 "SHED", "SHIM", "SHIN", "SHOD", "SHOE", "SHOT", "SHOW", "SHUN", "SHUT",
219 "SICK", "SIDE", "SIFT", "SIGH", "SIGN", "SILK", "SILL", "SILO", "SILT",
220 "SINE", "SING", "SINK", "SIRE", "SITE", "SITS", "SITU", "SKAT", "SKEW",
221 "SKID", "SKIM", "SKIN", "SKIT", "SLAB", "SLAM", "SLAT", "SLAY", "SLED",
222 "SLEW", "SLID", "SLIM", "SLIT", "SLOB", "SLOG", "SLOT", "SLOW", "SLUG",
223 "SLUM", "SLUR", "SMOG", "SMUG", "SNAG", "SNOB", "SNOW", "SNUB", "SNUG",
224 "SOAK", "SOAR", "SOCK", "SODA", "SOFA", "SOFT", "SOIL", "SOLD", "SOME",
225 "SONG", "SOON", "SOOT", "SORE", "SORT", "SOUL", "SOUR", "SOWN", "STAB",
226 "STAG", "STAN", "STAR", "STAY", "STEM", "STEW", "STIR", "STOW", "STUB",
227 "STUN", "SUCH", "SUDS", "SUIT", "SULK", "SUMS", "SUNG", "SUNK", "SURE",
228 "SURF", "SWAB", "SWAG", "SWAM", "SWAN", "SWAT", "SWAY", "SWIM", "SWUM",
229 "TACK", "TACT", "TAIL", "TAKE", "TALE", "TALK", "TALL", "TANK", "TASK",
230 "TATE", "TAUT", "TEAL", "TEAM", "TEAR", "TECH", "TEEM", "TEEN", "TEET",
231 "TELL", "TEND", "TENT", "TERM", "TERN", "TESS", "TEST", "THAN", "THAT",
232 "THEE", "THEM", "THEN", "THEY", "THIN", "THIS", "THUD", "THUG", "TICK",
233 "TIDE", "TIDY", "TIED", "TIER", "TILE", "TILL", "TILT", "TIME", "TINA",
234 "TINE", "TINT", "TINY", "TIRE", "TOAD", "TOGO", "TOIL", "TOLD", "TOLL",
235 "TONE", "TONG", "TONY", "TOOK", "TOOL", "TOOT", "TORE", "TORN", "TOTE",
236 "TOUR", "TOUT", "TOWN", "TRAG", "TRAM", "TRAY", "TREE", "TREK", "TRIG",
237 "TRIM", "TRIO", "TROD", "TROT", "TROY", "TRUE", "TUBA", "TUBE", "TUCK",
238 "TUFT", "TUNA", "TUNE", "TUNG", "TURF", "TURN", "TUSK", "TWIG", "TWIN",
239 "TWIT", "ULAN", "UNIT", "URGE", "USED", "USER", "USES", "UTAH", "VAIL",
240 "VAIN", "VALE", "VARY", "VASE", "VAST", "VEAL", "VEDA", "VEIL", "VEIN",
241 "VEND", "VENT", "VERB", "VERY", "VETO", "VICE", "VIEW", "VINE", "VISE",
242 "VOID", "VOLT", "VOTE", "WACK", "WADE", "WAGE", "WAIL", "WAIT", "WAKE",
243 "WALE", "WALK", "WALL", "WALT", "WAND", "WANE", "WANG", "WANT", "WARD",
244 "WARM", "WARN", "WART", "WASH", "WAST", "WATS", "WATT", "WAVE", "WAVY",
245 "WAYS", "WEAK", "WEAL", "WEAN", "WEAR", "WEED", "WEEK", "WEIR", "WELD",
246 "WELL", "WELT", "WENT", "WERE", "WERT", "WEST", "WHAM", "WHAT", "WHEE",
247 "WHEN", "WHET", "WHOA", "WHOM", "WICK", "WIFE", "WILD", "WILL", "WIND",
248 "WINE", "WING", "WINK", "WINO", "WIRE", "WISE", "WISH", "WITH", "WOLF",
249 "WONT", "WOOD", "WOOL", "WORD", "WORE", "WORK", "WORM", "WORN", "WOVE",
250 "WRIT", "WYNN", "YALE", "YANG", "YANK", "YARD", "YARN", "YAWL", "YAWN",
251 "YEAH", "YEAR", "YELL", "YOGA", "YOKE"};
252
253/* Extract 'length' bits from the char array 's'
254 starting with bit 'start' */
255unsigned long
256RFC1751::extract(char const* s, int start, int length)
257{
258 unsigned char cl;
259 unsigned char cc;
260 unsigned char cr;
261 unsigned long x;
262
263 XRPL_ASSERT(length <= 11, "ripple::RFC1751::extract : maximum length");
264 XRPL_ASSERT(start >= 0, "ripple::RFC1751::extract : minimum start");
265 XRPL_ASSERT(length >= 0, "ripple::RFC1751::extract : minimum length");
266 XRPL_ASSERT(
267 start + length <= 66,
268 "ripple::RFC1751::extract : maximum start + length");
269
270 int const shiftR = 24 - (length + (start % 8));
271 cl = s[start / 8]; // get components
272 cc = (shiftR < 16) ? s[start / 8 + 1] : 0;
273 cr = (shiftR < 8) ? s[start / 8 + 2] : 0;
274
275 x = ((long)(cl << 8 | cc) << 8 | cr); // Put bits together
276 x = x >> shiftR; // Right justify number
277 x = (x & (0xffff >> (16 - length))); // Trim extra bits.
278
279 return x;
280}
281
282// Encode 8 bytes in 'c' as a string of English words.
283// Returns a pointer to a static buffer
284void
285RFC1751::btoe(std::string& strHuman, std::string const& strData)
286{
287 char caBuffer[9]; /* add in room for the parity 2 bits*/
288 int p, i;
289
290 memcpy(caBuffer, strData.c_str(), 8);
291
292 // compute parity: merely add groups of two bits.
293 for (p = 0, i = 0; i < 64; i += 2)
294 p += extract(caBuffer, i, 2);
295
296 caBuffer[8] = char(p) << 6;
297
298 strHuman = std::string() + s_dictionary[extract(caBuffer, 0, 11)] + " " +
299 s_dictionary[extract(caBuffer, 11, 11)] + " " +
300 s_dictionary[extract(caBuffer, 22, 11)] + " " +
301 s_dictionary[extract(caBuffer, 33, 11)] + " " +
302 s_dictionary[extract(caBuffer, 44, 11)] + " " +
303 s_dictionary[extract(caBuffer, 55, 11)];
304}
305
306void
307RFC1751::insert(char* s, int x, int start, int length)
308{
309 unsigned char cl;
310 unsigned char cc;
311 unsigned char cr;
312 unsigned long y;
313 int shift;
314
315 XRPL_ASSERT(length <= 11, "ripple::RFC1751::insert : maximum length");
316 XRPL_ASSERT(start >= 0, "ripple::RFC1751::insert : minimum start");
317 XRPL_ASSERT(length >= 0, "ripple::RFC1751::insert : minimum length");
318 XRPL_ASSERT(
319 start + length <= 66,
320 "ripple::RFC1751::insert : maximum start + length");
321
322 shift = ((8 - ((start + length) % 8)) % 8);
323 y = (long)x << shift;
324 cl = (y >> 16) & 0xff;
325 cc = (y >> 8) & 0xff;
326 cr = y & 0xff;
327
328 if (shift + length > 16)
329 {
330 s[start / 8] |= cl;
331 s[start / 8 + 1] |= cc;
332 s[start / 8 + 2] |= cr;
333 }
334 else if (shift + length > 8)
335 {
336 s[start / 8] |= cc;
337 s[start / 8 + 1] |= cr;
338 }
339 else
340 {
341 s[start / 8] |= cr;
342 }
343}
344
345void
347{
348 for (auto& letter : strWord)
349 {
350 if (islower(static_cast<unsigned char>(letter)))
351 letter = toupper(static_cast<unsigned char>(letter));
352 else if (letter == '1')
353 letter = 'L';
354 else if (letter == '0')
355 letter = 'O';
356 else if (letter == '5')
357 letter = 'S';
358 }
359}
360
361// Binary search of dictionary.
362int
363RFC1751::wsrch(std::string const& strWord, int iMin, int iMax)
364{
365 int iResult = -1;
366
367 while (iResult < 0 && iMin != iMax)
368 {
369 // Have a range to search.
370 int iMid = iMin + (iMax - iMin) / 2;
371 int iDir = strWord.compare(s_dictionary[iMid]);
372
373 if (!iDir)
374 {
375 iResult = iMid; // Found it.
376 }
377 else if (iDir < 0)
378 {
379 iMax = iMid; // key < middle, middle is new max.
380 }
381 else
382 {
383 iMin = iMid + 1; // key > middle, new min is past the middle.
384 }
385 }
386
387 return iResult;
388}
389
390// Convert 6 words to binary.
391//
392// Returns 1 OK - all good words and parity is OK
393// 0 word not in data base
394// -1 badly formed in put ie > 4 char word
395// -2 words OK but parity is wrong
396int
398{
399 if (6 != vsHuman.size())
400 return -1;
401
402 int i, p = 0;
403 char b[9] = {0};
404
405 for (auto& strWord : vsHuman)
406 {
407 int l = strWord.length();
408
409 if (l > 4 || l < 1)
410 return -1;
411
412 standard(strWord);
413
414 auto v = wsrch(strWord, l < 4 ? 0 : 571, l < 4 ? 570 : 2048);
415
416 if (v < 0)
417 return 0;
418
419 insert(b, v, p, 11);
420 p += 11;
421 }
422
423 /* now check the parity of what we got */
424 for (p = 0, i = 0; i < 64; i += 2)
425 p += extract(b, i, 2);
426
427 if ((p & 3) != extract(b, 64, 2))
428 return -2;
429
430 strData.assign(b, 8);
431
432 return 1;
433}
434
443int
445{
447 std::string strFirst, strSecond;
448 int rc = 0;
449
450 std::string strTrimmed(strHuman);
451
452 boost::algorithm::trim(strTrimmed);
453
454 boost::algorithm::split(
455 vWords,
456 strTrimmed,
457 boost::algorithm::is_space(),
458 boost::algorithm::token_compress_on);
459
460 rc = 12 == vWords.size() ? 1 : -1;
461
462 if (1 == rc)
463 rc = etob(strFirst, vWords | boost::adaptors::copied(0, 6));
464
465 if (1 == rc)
466 rc = etob(strSecond, vWords | boost::adaptors::copied(6, 12));
467
468 if (1 == rc)
469 strKey = strFirst + strSecond;
470
471 return rc;
472}
473
476void
478{
479 std::string strFirst, strSecond;
480
481 btoe(strFirst, strKey.substr(0, 8));
482 btoe(strSecond, strKey.substr(8, 8));
483
484 strHuman = strFirst + " " + strSecond;
485}
486
488RFC1751::getWordFromBlob(void const* blob, size_t bytes)
489{
490 // This is a simple implementation of the Jenkins one-at-a-time hash
491 // algorithm:
492 // http://en.wikipedia.org/wiki/Jenkins_hash_function#one-at-a-time
493 unsigned char const* data = static_cast<unsigned char const*>(blob);
494 std::uint32_t hash = 0;
495
496 for (size_t i = 0; i < bytes; ++i)
497 {
498 hash += data[i];
499 hash += (hash << 10);
500 hash ^= (hash >> 6);
501 }
502
503 hash += (hash << 3);
504 hash ^= (hash >> 11);
505 hash += (hash << 15);
506
507 return s_dictionary
508 [hash % (sizeof(s_dictionary) / sizeof(s_dictionary[0]))];
509}
510
511} // namespace ripple
T assign(T... args)
T c_str(T... args)
static int wsrch(std::string const &strWord, int iMin, int iMax)
Definition RFC1751.cpp:363
static int etob(std::string &strData, std::vector< std::string > vsHuman)
Definition RFC1751.cpp:397
static void standard(std::string &strWord)
Definition RFC1751.cpp:346
static char const * s_dictionary[]
Definition RFC1751.h:42
static void btoe(std::string &strHuman, std::string const &strData)
Definition RFC1751.cpp:285
static void getEnglishFromKey(std::string &strHuman, std::string const &strKey)
Convert to human from a 128 bit key in big-endian format.
Definition RFC1751.cpp:477
static void insert(char *s, int x, int start, int length)
Definition RFC1751.cpp:307
static unsigned long extract(char const *s, int start, int length)
Definition RFC1751.cpp:256
static std::string getWordFromBlob(void const *blob, size_t bytes)
Chooses a single dictionary word from the data.
Definition RFC1751.cpp:488
static int getKeyFromEnglish(std::string &strKey, std::string const &strHuman)
Convert words separated by spaces into a 128 bit key in big-endian format.
Definition RFC1751.cpp:444
T compare(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6
T size(T... args)
T substr(T... args)