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