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 xrpl {
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, "xrpl::RFC1751::extract : maximum length");
264 XRPL_ASSERT(start >= 0, "xrpl::RFC1751::extract : minimum start");
265 XRPL_ASSERT(length >= 0, "xrpl::RFC1751::extract : minimum length");
266 XRPL_ASSERT(
267 start + length <= 66,
268 "xrpl::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, "xrpl::RFC1751::insert : maximum length");
316 XRPL_ASSERT(start >= 0, "xrpl::RFC1751::insert : minimum start");
317 XRPL_ASSERT(length >= 0, "xrpl::RFC1751::insert : minimum length");
318 XRPL_ASSERT(
319 start + length <= 66, "xrpl::RFC1751::insert : maximum start + length");
320
321 shift = ((8 - ((start + length) % 8)) % 8);
322 y = (long)x << shift;
323 cl = (y >> 16) & 0xff;
324 cc = (y >> 8) & 0xff;
325 cr = y & 0xff;
326
327 if (shift + length > 16)
328 {
329 s[start / 8] |= cl;
330 s[start / 8 + 1] |= cc;
331 s[start / 8 + 2] |= cr;
332 }
333 else if (shift + length > 8)
334 {
335 s[start / 8] |= cc;
336 s[start / 8 + 1] |= cr;
337 }
338 else
339 {
340 s[start / 8] |= cr;
341 }
342}
343
344void
346{
347 for (auto& letter : strWord)
348 {
349 if (islower(static_cast<unsigned char>(letter)))
350 letter = toupper(static_cast<unsigned char>(letter));
351 else if (letter == '1')
352 letter = 'L';
353 else if (letter == '0')
354 letter = 'O';
355 else if (letter == '5')
356 letter = 'S';
357 }
358}
359
360// Binary search of dictionary.
361int
362RFC1751::wsrch(std::string const& strWord, int iMin, int iMax)
363{
364 int iResult = -1;
365
366 while (iResult < 0 && iMin != iMax)
367 {
368 // Have a range to search.
369 int iMid = iMin + (iMax - iMin) / 2;
370 int iDir = strWord.compare(s_dictionary[iMid]);
371
372 if (!iDir)
373 {
374 iResult = iMid; // Found it.
375 }
376 else if (iDir < 0)
377 {
378 iMax = iMid; // key < middle, middle is new max.
379 }
380 else
381 {
382 iMin = iMid + 1; // key > middle, new min is past the middle.
383 }
384 }
385
386 return iResult;
387}
388
389// Convert 6 words to binary.
390//
391// Returns 1 OK - all good words and parity is OK
392// 0 word not in data base
393// -1 badly formed in put ie > 4 char word
394// -2 words OK but parity is wrong
395int
397{
398 if (6 != vsHuman.size())
399 return -1;
400
401 int i, p = 0;
402 char b[9] = {0};
403
404 for (auto& strWord : vsHuman)
405 {
406 int l = strWord.length();
407
408 if (l > 4 || l < 1)
409 return -1;
410
411 standard(strWord);
412
413 auto v = wsrch(strWord, l < 4 ? 0 : 571, l < 4 ? 570 : 2048);
414
415 if (v < 0)
416 return 0;
417
418 insert(b, v, p, 11);
419 p += 11;
420 }
421
422 /* now check the parity of what we got */
423 for (p = 0, i = 0; i < 64; i += 2)
424 p += extract(b, i, 2);
425
426 if ((p & 3) != extract(b, 64, 2))
427 return -2;
428
429 strData.assign(b, 8);
430
431 return 1;
432}
433
442int
444{
446 std::string strFirst, strSecond;
447 int rc = 0;
448
449 std::string strTrimmed(strHuman);
450
451 boost::algorithm::trim(strTrimmed);
452
453 boost::algorithm::split(
454 vWords,
455 strTrimmed,
456 boost::algorithm::is_space(),
457 boost::algorithm::token_compress_on);
458
459 rc = 12 == vWords.size() ? 1 : -1;
460
461 if (1 == rc)
462 rc = etob(strFirst, vWords | boost::adaptors::copied(0, 6));
463
464 if (1 == rc)
465 rc = etob(strSecond, vWords | boost::adaptors::copied(6, 12));
466
467 if (1 == rc)
468 strKey = strFirst + strSecond;
469
470 return rc;
471}
472
475void
477{
478 std::string strFirst, strSecond;
479
480 btoe(strFirst, strKey.substr(0, 8));
481 btoe(strSecond, strKey.substr(8, 8));
482
483 strHuman = strFirst + " " + strSecond;
484}
485
487RFC1751::getWordFromBlob(void const* blob, size_t bytes)
488{
489 // This is a simple implementation of the Jenkins one-at-a-time hash
490 // algorithm:
491 // http://en.wikipedia.org/wiki/Jenkins_hash_function#one-at-a-time
492 unsigned char const* data = static_cast<unsigned char const*>(blob);
493 std::uint32_t hash = 0;
494
495 for (size_t i = 0; i < bytes; ++i)
496 {
497 hash += data[i];
498 hash += (hash << 10);
499 hash ^= (hash >> 6);
500 }
501
502 hash += (hash << 3);
503 hash ^= (hash >> 11);
504 hash += (hash << 15);
505
506 return s_dictionary
507 [hash % (sizeof(s_dictionary) / sizeof(s_dictionary[0]))];
508}
509
510} // namespace xrpl
T assign(T... args)
T c_str(T... args)
static int wsrch(std::string const &strWord, int iMin, int iMax)
Definition RFC1751.cpp:362
static void standard(std::string &strWord)
Definition RFC1751.cpp:345
static int etob(std::string &strData, std::vector< std::string > vsHuman)
Definition RFC1751.cpp:396
static unsigned long extract(char const *s, int start, int length)
Definition RFC1751.cpp:256
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:476
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:443
static std::string getWordFromBlob(void const *blob, size_t bytes)
Chooses a single dictionary word from the data.
Definition RFC1751.cpp:487
static char const * s_dictionary[]
Definition RFC1751.h:42
static void insert(char *s, int x, int start, int length)
Definition RFC1751.cpp:307
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)