freebsd-dev/contrib/opie/libopie/btoe.c
1997-09-29 08:53:38 +00:00

2267 lines
25 KiB
C

/* btoe: The opiebtoe() and opieetob() library functions:
Conversion to/from the six-English-word representation of a
64 bit OTP.
%%% portions-copyright-cmetz-96
Portions of this software are Copyright 1996-1997 by Craig Metz, All Rights
Reserved. The Inner Net License Version 2 applies to these portions of
the software.
You should have received a copy of the license with this software. If
you didn't get a copy, you may request one from <license@inner.net>.
Portions of this software are Copyright 1995 by Randall Atkinson and Dan
McDonald, All Rights Reserved. All Rights under this copyright are assigned
to the U.S. Naval Research Laboratory (NRL). The NRL Copyright Notice and
License Agreement applies to this software.
History:
Modified by cmetz for OPIE 2.2. Use FUNCTION declaration et al.
Remove unnecessary address futzing with Wp in opiebtoe.
Changed unsigned long to UINT4 for Alpha.
Modified at NRL for OPIE 2.2. Moved from put.c to libopie/opiebtoe.c.
Modified at NRL for OPIE 2.0.
Written at Bellcore for the S/Key Version 1 software distribution.
*/
#include "opie_cfg.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include "opie.h"
static UINT4 extract __P((char *s, int start, int length));
static VOIDRET insert __P((char *s, int x, int start, int length));
static int wsrch __P((char *w, int low, int high));
/* Dictionary for integer-word translations */
static char Wp[2048][4] =
{
"A",
"ABE",
"ACE",
"ACT",
"AD",
"ADA",
"ADD",
"AGO",
"AID",
"AIM",
"AIR",
"ALL",
"ALP",
"AM",
"AMY",
"AN",
"ANA",
"AND",
"ANN",
"ANT",
"ANY",
"APE",
"APS",
"APT",
"ARC",
"ARE",
"ARK",
"ARM",
"ART",
"AS",
"ASH",
"ASK",
"AT",
"ATE",
"AUG",
"AUK",
"AVE",
"AWE",
"AWK",
"AWL",
"AWN",
"AX",
"AYE",
"BAD",
"BAG",
"BAH",
"BAM",
"BAN",
"BAR",
"BAT",
"BAY",
"BE",
"BED",
"BEE",
"BEG",
"BEN",
"BET",
"BEY",
"BIB",
"BID",
"BIG",
"BIN",
"BIT",
"BOB",
"BOG",
"BON",
"BOO",
"BOP",
"BOW",
"BOY",
"BUB",
"BUD",
"BUG",
"BUM",
"BUN",
"BUS",
"BUT",
"BUY",
"BY",
"BYE",
"CAB",
"CAL",
"CAM",
"CAN",
"CAP",
"CAR",
"CAT",
"CAW",
"COD",
"COG",
"COL",
"CON",
"COO",
"COP",
"COT",
"COW",
"COY",
"CRY",
"CUB",
"CUE",
"CUP",
"CUR",
"CUT",
"DAB",
"DAD",
"DAM",
"DAN",
"DAR",
"DAY",
"DEE",
"DEL",
"DEN",
"DES",
"DEW",
"DID",
"DIE",
"DIG",
"DIN",
"DIP",
"DO",
"DOE",
"DOG",
"DON",
"DOT",
"DOW",
"DRY",
"DUB",
"DUD",
"DUE",
"DUG",
"DUN",
"EAR",
"EAT",
"ED",
"EEL",
"EGG",
"EGO",
"ELI",
"ELK",
"ELM",
"ELY",
"EM",
"END",
"EST",
"ETC",
"EVA",
"EVE",
"EWE",
"EYE",
"FAD",
"FAN",
"FAR",
"FAT",
"FAY",
"FED",
"FEE",
"FEW",
"FIB",
"FIG",
"FIN",
"FIR",
"FIT",
"FLO",
"FLY",
"FOE",
"FOG",
"FOR",
"FRY",
"FUM",
"FUN",
"FUR",
"GAB",
"GAD",
"GAG",
"GAL",
"GAM",
"GAP",
"GAS",
"GAY",
"GEE",
"GEL",
"GEM",
"GET",
"GIG",
"GIL",
"GIN",
"GO",
"GOT",
"GUM",
"GUN",
"GUS",
"GUT",
"GUY",
"GYM",
"GYP",
"HA",
"HAD",
"HAL",
"HAM",
"HAN",
"HAP",
"HAS",
"HAT",
"HAW",
"HAY",
"HE",
"HEM",
"HEN",
"HER",
"HEW",
"HEY",
"HI",
"HID",
"HIM",
"HIP",
"HIS",
"HIT",
"HO",
"HOB",
"HOC",
"HOE",
"HOG",
"HOP",
"HOT",
"HOW",
"HUB",
"HUE",
"HUG",
"HUH",
"HUM",
"HUT",
"I",
"ICY",
"IDA",
"IF",
"IKE",
"ILL",
"INK",
"INN",
"IO",
"ION",
"IQ",
"IRA",
"IRE",
"IRK",
"IS",
"IT",
"ITS",
"IVY",
"JAB",
"JAG",
"JAM",
"JAN",
"JAR",
"JAW",
"JAY",
"JET",
"JIG",
"JIM",
"JO",
"JOB",
"JOE",
"JOG",
"JOT",
"JOY",
"JUG",
"JUT",
"KAY",
"KEG",
"KEN",
"KEY",
"KID",
"KIM",
"KIN",
"KIT",
"LA",
"LAB",
"LAC",
"LAD",
"LAG",
"LAM",
"LAP",
"LAW",
"LAY",
"LEA",
"LED",
"LEE",
"LEG",
"LEN",
"LEO",
"LET",
"LEW",
"LID",
"LIE",
"LIN",
"LIP",
"LIT",
"LO",
"LOB",
"LOG",
"LOP",
"LOS",
"LOT",
"LOU",
"LOW",
"LOY",
"LUG",
"LYE",
"MA",
"MAC",
"MAD",
"MAE",
"MAN",
"MAO",
"MAP",
"MAT",
"MAW",
"MAY",
"ME",
"MEG",
"MEL",
"MEN",
"MET",
"MEW",
"MID",
"MIN",
"MIT",
"MOB",
"MOD",
"MOE",
"MOO",
"MOP",
"MOS",
"MOT",
"MOW",
"MUD",
"MUG",
"MUM",
"MY",
"NAB",
"NAG",
"NAN",
"NAP",
"NAT",
"NAY",
"NE",
"NED",
"NEE",
"NET",
"NEW",
"NIB",
"NIL",
"NIP",
"NIT",
"NO",
"NOB",
"NOD",
"NON",
"NOR",
"NOT",
"NOV",
"NOW",
"NU",
"NUN",
"NUT",
"O",
"OAF",
"OAK",
"OAR",
"OAT",
"ODD",
"ODE",
"OF",
"OFF",
"OFT",
"OH",
"OIL",
"OK",
"OLD",
"ON",
"ONE",
"OR",
"ORB",
"ORE",
"ORR",
"OS",
"OTT",
"OUR",
"OUT",
"OVA",
"OW",
"OWE",
"OWL",
"OWN",
"OX",
"PA",
"PAD",
"PAL",
"PAM",
"PAN",
"PAP",
"PAR",
"PAT",
"PAW",
"PAY",
"PEA",
"PEG",
"PEN",
"PEP",
"PER",
"PET",
"PEW",
"PHI",
"PI",
"PIE",
"PIN",
"PIT",
"PLY",
"PO",
"POD",
"POE",
"POP",
"POT",
"POW",
"PRO",
"PRY",
"PUB",
"PUG",
"PUN",
"PUP",
"PUT",
"QUO",
"RAG",
"RAM",
"RAN",
"RAP",
"RAT",
"RAW",
"RAY",
"REB",
"RED",
"REP",
"RET",
"RIB",
"RID",
"RIG",
"RIM",
"RIO",
"RIP",
"ROB",
"ROD",
"ROE",
"RON",
"ROT",
"ROW",
"ROY",
"RUB",
"RUE",
"RUG",
"RUM",
"RUN",
"RYE",
"SAC",
"SAD",
"SAG",
"SAL",
"SAM",
"SAN",
"SAP",
"SAT",
"SAW",
"SAY",
"SEA",
"SEC",
"SEE",
"SEN",
"SET",
"SEW",
"SHE",
"SHY",
"SIN",
"SIP",
"SIR",
"SIS",
"SIT",
"SKI",
"SKY",
"SLY",
"SO",
"SOB",
"SOD",
"SON",
"SOP",
"SOW",
"SOY",
"SPA",
"SPY",
"SUB",
"SUD",
"SUE",
"SUM",
"SUN",
"SUP",
"TAB",
"TAD",
"TAG",
"TAN",
"TAP",
"TAR",
"TEA",
"TED",
"TEE",
"TEN",
"THE",
"THY",
"TIC",
"TIE",
"TIM",
"TIN",
"TIP",
"TO",
"TOE",
"TOG",
"TOM",
"TON",
"TOO",
"TOP",
"TOW",
"TOY",
"TRY",
"TUB",
"TUG",
"TUM",
"TUN",
"TWO",
"UN",
"UP",
"US",
"USE",
"VAN",
"VAT",
"VET",
"VIE",
"WAD",
"WAG",
"WAR",
"WAS",
"WAY",
"WE",
"WEB",
"WED",
"WEE",
"WET",
"WHO",
"WHY",
"WIN",
"WIT",
"WOK",
"WON",
"WOO",
"WOW",
"WRY",
"WU",
"YAM",
"YAP",
"YAW",
"YE",
"YEA",
"YES",
"YET",
"YOU",
"ABED",
"ABEL",
"ABET",
"ABLE",
"ABUT",
"ACHE",
"ACID",
"ACME",
"ACRE",
"ACTA",
"ACTS",
"ADAM",
"ADDS",
"ADEN",
"AFAR",
"AFRO",
"AGEE",
"AHEM",
"AHOY",
"AIDA",
"AIDE",
"AIDS",
"AIRY",
"AJAR",
"AKIN",
"ALAN",
"ALEC",
"ALGA",
"ALIA",
"ALLY",
"ALMA",
"ALOE",
"ALSO",
"ALTO",
"ALUM",
"ALVA",
"AMEN",
"AMES",
"AMID",
"AMMO",
"AMOK",
"AMOS",
"AMRA",
"ANDY",
"ANEW",
"ANNA",
"ANNE",
"ANTE",
"ANTI",
"AQUA",
"ARAB",
"ARCH",
"AREA",
"ARGO",
"ARID",
"ARMY",
"ARTS",
"ARTY",
"ASIA",
"ASKS",
"ATOM",
"AUNT",
"AURA",
"AUTO",
"AVER",
"AVID",
"AVIS",
"AVON",
"AVOW",
"AWAY",
"AWRY",
"BABE",
"BABY",
"BACH",
"BACK",
"BADE",
"BAIL",
"BAIT",
"BAKE",
"BALD",
"BALE",
"BALI",
"BALK",
"BALL",
"BALM",
"BAND",
"BANE",
"BANG",
"BANK",
"BARB",
"BARD",
"BARE",
"BARK",
"BARN",
"BARR",
"BASE",
"BASH",
"BASK",
"BASS",
"BATE",
"BATH",
"BAWD",
"BAWL",
"BEAD",
"BEAK",
"BEAM",
"BEAN",
"BEAR",
"BEAT",
"BEAU",
"BECK",
"BEEF",
"BEEN",
"BEER",
"BEET",
"BELA",
"BELL",
"BELT",
"BEND",
"BENT",
"BERG",
"BERN",
"BERT",
"BESS",
"BEST",
"BETA",
"BETH",
"BHOY",
"BIAS",
"BIDE",
"BIEN",
"BILE",
"BILK",
"BILL",
"BIND",
"BING",
"BIRD",
"BITE",
"BITS",
"BLAB",
"BLAT",
"BLED",
"BLEW",
"BLOB",
"BLOC",
"BLOT",
"BLOW",
"BLUE",
"BLUM",
"BLUR",
"BOAR",
"BOAT",
"BOCA",
"BOCK",
"BODE",
"BODY",
"BOGY",
"BOHR",
"BOIL",
"BOLD",
"BOLO",
"BOLT",
"BOMB",
"BONA",
"BOND",
"BONE",
"BONG",
"BONN",
"BONY",
"BOOK",
"BOOM",
"BOON",
"BOOT",
"BORE",
"BORG",
"BORN",
"BOSE",
"BOSS",
"BOTH",
"BOUT",
"BOWL",
"BOYD",
"BRAD",
"BRAE",
"BRAG",
"BRAN",
"BRAY",
"BRED",
"BREW",
"BRIG",
"BRIM",
"BROW",
"BUCK",
"BUDD",
"BUFF",
"BULB",
"BULK",
"BULL",
"BUNK",
"BUNT",
"BUOY",
"BURG",
"BURL",
"BURN",
"BURR",
"BURT",
"BURY",
"BUSH",
"BUSS",
"BUST",
"BUSY",
"BYTE",
"CADY",
"CAFE",
"CAGE",
"CAIN",
"CAKE",
"CALF",
"CALL",
"CALM",
"CAME",
"CANE",
"CANT",
"CARD",
"CARE",
"CARL",
"CARR",
"CART",
"CASE",
"CASH",
"CASK",
"CAST",
"CAVE",
"CEIL",
"CELL",
"CENT",
"CERN",
"CHAD",
"CHAR",
"CHAT",
"CHAW",
"CHEF",
"CHEN",
"CHEW",
"CHIC",
"CHIN",
"CHOU",
"CHOW",
"CHUB",
"CHUG",
"CHUM",
"CITE",
"CITY",
"CLAD",
"CLAM",
"CLAN",
"CLAW",
"CLAY",
"CLOD",
"CLOG",
"CLOT",
"CLUB",
"CLUE",
"COAL",
"COAT",
"COCA",
"COCK",
"COCO",
"CODA",
"CODE",
"CODY",
"COED",
"COIL",
"COIN",
"COKE",
"COLA",
"COLD",
"COLT",
"COMA",
"COMB",
"COME",
"COOK",
"COOL",
"COON",
"COOT",
"CORD",
"CORE",
"CORK",
"CORN",
"COST",
"COVE",
"COWL",
"CRAB",
"CRAG",
"CRAM",
"CRAY",
"CREW",
"CRIB",
"CROW",
"CRUD",
"CUBA",
"CUBE",
"CUFF",
"CULL",
"CULT",
"CUNY",
"CURB",
"CURD",
"CURE",
"CURL",
"CURT",
"CUTS",
"DADE",
"DALE",
"DAME",
"DANA",
"DANE",
"DANG",
"DANK",
"DARE",
"DARK",
"DARN",
"DART",
"DASH",
"DATA",
"DATE",
"DAVE",
"DAVY",
"DAWN",
"DAYS",
"DEAD",
"DEAF",
"DEAL",
"DEAN",
"DEAR",
"DEBT",
"DECK",
"DEED",
"DEEM",
"DEER",
"DEFT",
"DEFY",
"DELL",
"DENT",
"DENY",
"DESK",
"DIAL",
"DICE",
"DIED",
"DIET",
"DIME",
"DINE",
"DING",
"DINT",
"DIRE",
"DIRT",
"DISC",
"DISH",
"DISK",
"DIVE",
"DOCK",
"DOES",
"DOLE",
"DOLL",
"DOLT",
"DOME",
"DONE",
"DOOM",
"DOOR",
"DORA",
"DOSE",
"DOTE",
"DOUG",
"DOUR",
"DOVE",
"DOWN",
"DRAB",
"DRAG",
"DRAM",
"DRAW",
"DREW",
"DRUB",
"DRUG",
"DRUM",
"DUAL",
"DUCK",
"DUCT",
"DUEL",
"DUET",
"DUKE",
"DULL",
"DUMB",
"DUNE",
"DUNK",
"DUSK",
"DUST",
"DUTY",
"EACH",
"EARL",
"EARN",
"EASE",
"EAST",
"EASY",
"EBEN",
"ECHO",
"EDDY",
"EDEN",
"EDGE",
"EDGY",
"EDIT",
"EDNA",
"EGAN",
"ELAN",
"ELBA",
"ELLA",
"ELSE",
"EMIL",
"EMIT",
"EMMA",
"ENDS",
"ERIC",
"EROS",
"EVEN",
"EVER",
"EVIL",
"EYED",
"FACE",
"FACT",
"FADE",
"FAIL",
"FAIN",
"FAIR",
"FAKE",
"FALL",
"FAME",
"FANG",
"FARM",
"FAST",
"FATE",
"FAWN",
"FEAR",
"FEAT",
"FEED",
"FEEL",
"FEET",
"FELL",
"FELT",
"FEND",
"FERN",
"FEST",
"FEUD",
"FIEF",
"FIGS",
"FILE",
"FILL",
"FILM",
"FIND",
"FINE",
"FINK",
"FIRE",
"FIRM",
"FISH",
"FISK",
"FIST",
"FITS",
"FIVE",
"FLAG",
"FLAK",
"FLAM",
"FLAT",
"FLAW",
"FLEA",
"FLED",
"FLEW",
"FLIT",
"FLOC",
"FLOG",
"FLOW",
"FLUB",
"FLUE",
"FOAL",
"FOAM",
"FOGY",
"FOIL",
"FOLD",
"FOLK",
"FOND",
"FONT",
"FOOD",
"FOOL",
"FOOT",
"FORD",
"FORE",
"FORK",
"FORM",
"FORT",
"FOSS",
"FOUL",
"FOUR",
"FOWL",
"FRAU",
"FRAY",
"FRED",
"FREE",
"FRET",
"FREY",
"FROG",
"FROM",
"FUEL",
"FULL",
"FUME",
"FUND",
"FUNK",
"FURY",
"FUSE",
"FUSS",
"GAFF",
"GAGE",
"GAIL",
"GAIN",
"GAIT",
"GALA",
"GALE",
"GALL",
"GALT",
"GAME",
"GANG",
"GARB",
"GARY",
"GASH",
"GATE",
"GAUL",
"GAUR",
"GAVE",
"GAWK",
"GEAR",
"GELD",
"GENE",
"GENT",
"GERM",
"GETS",
"GIBE",
"GIFT",
"GILD",
"GILL",
"GILT",
"GINA",
"GIRD",
"GIRL",
"GIST",
"GIVE",
"GLAD",
"GLEE",
"GLEN",
"GLIB",
"GLOB",
"GLOM",
"GLOW",
"GLUE",
"GLUM",
"GLUT",
"GOAD",
"GOAL",
"GOAT",
"GOER",
"GOES",
"GOLD",
"GOLF",
"GONE",
"GONG",
"GOOD",
"GOOF",
"GORE",
"GORY",
"GOSH",
"GOUT",
"GOWN",
"GRAB",
"GRAD",
"GRAY",
"GREG",
"GREW",
"GREY",
"GRID",
"GRIM",
"GRIN",
"GRIT",
"GROW",
"GRUB",
"GULF",
"GULL",
"GUNK",
"GURU",
"GUSH",
"GUST",
"GWEN",
"GWYN",
"HAAG",
"HAAS",
"HACK",
"HAIL",
"HAIR",
"HALE",
"HALF",
"HALL",
"HALO",
"HALT",
"HAND",
"HANG",
"HANK",
"HANS",
"HARD",
"HARK",
"HARM",
"HART",
"HASH",
"HAST",
"HATE",
"HATH",
"HAUL",
"HAVE",
"HAWK",
"HAYS",
"HEAD",
"HEAL",
"HEAR",
"HEAT",
"HEBE",
"HECK",
"HEED",
"HEEL",
"HEFT",
"HELD",
"HELL",
"HELM",
"HERB",
"HERD",
"HERE",
"HERO",
"HERS",
"HESS",
"HEWN",
"HICK",
"HIDE",
"HIGH",
"HIKE",
"HILL",
"HILT",
"HIND",
"HINT",
"HIRE",
"HISS",
"HIVE",
"HOBO",
"HOCK",
"HOFF",
"HOLD",
"HOLE",
"HOLM",
"HOLT",
"HOME",
"HONE",
"HONK",
"HOOD",
"HOOF",
"HOOK",
"HOOT",
"HORN",
"HOSE",
"HOST",
"HOUR",
"HOVE",
"HOWE",
"HOWL",
"HOYT",
"HUCK",
"HUED",
"HUFF",
"HUGE",
"HUGH",
"HUGO",
"HULK",
"HULL",
"HUNK",
"HUNT",
"HURD",
"HURL",
"HURT",
"HUSH",
"HYDE",
"HYMN",
"IBIS",
"ICON",
"IDEA",
"IDLE",
"IFFY",
"INCA",
"INCH",
"INTO",
"IONS",
"IOTA",
"IOWA",
"IRIS",
"IRMA",
"IRON",
"ISLE",
"ITCH",
"ITEM",
"IVAN",
"JACK",
"JADE",
"JAIL",
"JAKE",
"JANE",
"JAVA",
"JEAN",
"JEFF",
"JERK",
"JESS",
"JEST",
"JIBE",
"JILL",
"JILT",
"JIVE",
"JOAN",
"JOBS",
"JOCK",
"JOEL",
"JOEY",
"JOHN",
"JOIN",
"JOKE",
"JOLT",
"JOVE",
"JUDD",
"JUDE",
"JUDO",
"JUDY",
"JUJU",
"JUKE",
"JULY",
"JUNE",
"JUNK",
"JUNO",
"JURY",
"JUST",
"JUTE",
"KAHN",
"KALE",
"KANE",
"KANT",
"KARL",
"KATE",
"KEEL",
"KEEN",
"KENO",
"KENT",
"KERN",
"KERR",
"KEYS",
"KICK",
"KILL",
"KIND",
"KING",
"KIRK",
"KISS",
"KITE",
"KLAN",
"KNEE",
"KNEW",
"KNIT",
"KNOB",
"KNOT",
"KNOW",
"KOCH",
"KONG",
"KUDO",
"KURD",
"KURT",
"KYLE",
"LACE",
"LACK",
"LACY",
"LADY",
"LAID",
"LAIN",
"LAIR",
"LAKE",
"LAMB",
"LAME",
"LAND",
"LANE",
"LANG",
"LARD",
"LARK",
"LASS",
"LAST",
"LATE",
"LAUD",
"LAVA",
"LAWN",
"LAWS",
"LAYS",
"LEAD",
"LEAF",
"LEAK",
"LEAN",
"LEAR",
"LEEK",
"LEER",
"LEFT",
"LEND",
"LENS",
"LENT",
"LEON",
"LESK",
"LESS",
"LEST",
"LETS",
"LIAR",
"LICE",
"LICK",
"LIED",
"LIEN",
"LIES",
"LIEU",
"LIFE",
"LIFT",
"LIKE",
"LILA",
"LILT",
"LILY",
"LIMA",
"LIMB",
"LIME",
"LIND",
"LINE",
"LINK",
"LINT",
"LION",
"LISA",
"LIST",
"LIVE",
"LOAD",
"LOAF",
"LOAM",
"LOAN",
"LOCK",
"LOFT",
"LOGE",
"LOIS",
"LOLA",
"LONE",
"LONG",
"LOOK",
"LOON",
"LOOT",
"LORD",
"LORE",
"LOSE",
"LOSS",
"LOST",
"LOUD",
"LOVE",
"LOWE",
"LUCK",
"LUCY",
"LUGE",
"LUKE",
"LULU",
"LUND",
"LUNG",
"LURA",
"LURE",
"LURK",
"LUSH",
"LUST",
"LYLE",
"LYNN",
"LYON",
"LYRA",
"MACE",
"MADE",
"MAGI",
"MAID",
"MAIL",
"MAIN",
"MAKE",
"MALE",
"MALI",
"MALL",
"MALT",
"MANA",
"MANN",
"MANY",
"MARC",
"MARE",
"MARK",
"MARS",
"MART",
"MARY",
"MASH",
"MASK",
"MASS",
"MAST",
"MATE",
"MATH",
"MAUL",
"MAYO",
"MEAD",
"MEAL",
"MEAN",
"MEAT",
"MEEK",
"MEET",
"MELD",
"MELT",
"MEMO",
"MEND",
"MENU",
"MERT",
"MESH",
"MESS",
"MICE",
"MIKE",
"MILD",
"MILE",
"MILK",
"MILL",
"MILT",
"MIMI",
"MIND",
"MINE",
"MINI",
"MINK",
"MINT",
"MIRE",
"MISS",
"MIST",
"MITE",
"MITT",
"MOAN",
"MOAT",
"MOCK",
"MODE",
"MOLD",
"MOLE",
"MOLL",
"MOLT",
"MONA",
"MONK",
"MONT",
"MOOD",
"MOON",
"MOOR",
"MOOT",
"MORE",
"MORN",
"MORT",
"MOSS",
"MOST",
"MOTH",
"MOVE",
"MUCH",
"MUCK",
"MUDD",
"MUFF",
"MULE",
"MULL",
"MURK",
"MUSH",
"MUST",
"MUTE",
"MUTT",
"MYRA",
"MYTH",
"NAGY",
"NAIL",
"NAIR",
"NAME",
"NARY",
"NASH",
"NAVE",
"NAVY",
"NEAL",
"NEAR",
"NEAT",
"NECK",
"NEED",
"NEIL",
"NELL",
"NEON",
"NERO",
"NESS",
"NEST",
"NEWS",
"NEWT",
"NIBS",
"NICE",
"NICK",
"NILE",
"NINA",
"NINE",
"NOAH",
"NODE",
"NOEL",
"NOLL",
"NONE",
"NOOK",
"NOON",
"NORM",
"NOSE",
"NOTE",
"NOUN",
"NOVA",
"NUDE",
"NULL",
"NUMB",
"OATH",
"OBEY",
"OBOE",
"ODIN",
"OHIO",
"OILY",
"OINT",
"OKAY",
"OLAF",
"OLDY",
"OLGA",
"OLIN",
"OMAN",
"OMEN",
"OMIT",
"ONCE",
"ONES",
"ONLY",
"ONTO",
"ONUS",
"ORAL",
"ORGY",
"OSLO",
"OTIS",
"OTTO",
"OUCH",
"OUST",
"OUTS",
"OVAL",
"OVEN",
"OVER",
"OWLY",
"OWNS",
"QUAD",
"QUIT",
"QUOD",
"RACE",
"RACK",
"RACY",
"RAFT",
"RAGE",
"RAID",
"RAIL",
"RAIN",
"RAKE",
"RANK",
"RANT",
"RARE",
"RASH",
"RATE",
"RAVE",
"RAYS",
"READ",
"REAL",
"REAM",
"REAR",
"RECK",
"REED",
"REEF",
"REEK",
"REEL",
"REID",
"REIN",
"RENA",
"REND",
"RENT",
"REST",
"RICE",
"RICH",
"RICK",
"RIDE",
"RIFT",
"RILL",
"RIME",
"RING",
"RINK",
"RISE",
"RISK",
"RITE",
"ROAD",
"ROAM",
"ROAR",
"ROBE",
"ROCK",
"RODE",
"ROIL",
"ROLL",
"ROME",
"ROOD",
"ROOF",
"ROOK",
"ROOM",
"ROOT",
"ROSA",
"ROSE",
"ROSS",
"ROSY",
"ROTH",
"ROUT",
"ROVE",
"ROWE",
"ROWS",
"RUBE",
"RUBY",
"RUDE",
"RUDY",
"RUIN",
"RULE",
"RUNG",
"RUNS",
"RUNT",
"RUSE",
"RUSH",
"RUSK",
"RUSS",
"RUST",
"RUTH",
"SACK",
"SAFE",
"SAGE",
"SAID",
"SAIL",
"SALE",
"SALK",
"SALT",
"SAME",
"SAND",
"SANE",
"SANG",
"SANK",
"SARA",
"SAUL",
"SAVE",
"SAYS",
"SCAN",
"SCAR",
"SCAT",
"SCOT",
"SEAL",
"SEAM",
"SEAR",
"SEAT",
"SEED",
"SEEK",
"SEEM",
"SEEN",
"SEES",
"SELF",
"SELL",
"SEND",
"SENT",
"SETS",
"SEWN",
"SHAG",
"SHAM",
"SHAW",
"SHAY",
"SHED",
"SHIM",
"SHIN",
"SHOD",
"SHOE",
"SHOT",
"SHOW",
"SHUN",
"SHUT",
"SICK",
"SIDE",
"SIFT",
"SIGH",
"SIGN",
"SILK",
"SILL",
"SILO",
"SILT",
"SINE",
"SING",
"SINK",
"SIRE",
"SITE",
"SITS",
"SITU",
"SKAT",
"SKEW",
"SKID",
"SKIM",
"SKIN",
"SKIT",
"SLAB",
"SLAM",
"SLAT",
"SLAY",
"SLED",
"SLEW",
"SLID",
"SLIM",
"SLIT",
"SLOB",
"SLOG",
"SLOT",
"SLOW",
"SLUG",
"SLUM",
"SLUR",
"SMOG",
"SMUG",
"SNAG",
"SNOB",
"SNOW",
"SNUB",
"SNUG",
"SOAK",
"SOAR",
"SOCK",
"SODA",
"SOFA",
"SOFT",
"SOIL",
"SOLD",
"SOME",
"SONG",
"SOON",
"SOOT",
"SORE",
"SORT",
"SOUL",
"SOUR",
"SOWN",
"STAB",
"STAG",
"STAN",
"STAR",
"STAY",
"STEM",
"STEW",
"STIR",
"STOW",
"STUB",
"STUN",
"SUCH",
"SUDS",
"SUIT",
"SULK",
"SUMS",
"SUNG",
"SUNK",
"SURE",
"SURF",
"SWAB",
"SWAG",
"SWAM",
"SWAN",
"SWAT",
"SWAY",
"SWIM",
"SWUM",
"TACK",
"TACT",
"TAIL",
"TAKE",
"TALE",
"TALK",
"TALL",
"TANK",
"TASK",
"TATE",
"TAUT",
"TEAL",
"TEAM",
"TEAR",
"TECH",
"TEEM",
"TEEN",
"TEET",
"TELL",
"TEND",
"TENT",
"TERM",
"TERN",
"TESS",
"TEST",
"THAN",
"THAT",
"THEE",
"THEM",
"THEN",
"THEY",
"THIN",
"THIS",
"THUD",
"THUG",
"TICK",
"TIDE",
"TIDY",
"TIED",
"TIER",
"TILE",
"TILL",
"TILT",
"TIME",
"TINA",
"TINE",
"TINT",
"TINY",
"TIRE",
"TOAD",
"TOGO",
"TOIL",
"TOLD",
"TOLL",
"TONE",
"TONG",
"TONY",
"TOOK",
"TOOL",
"TOOT",
"TORE",
"TORN",
"TOTE",
"TOUR",
"TOUT",
"TOWN",
"TRAG",
"TRAM",
"TRAY",
"TREE",
"TREK",
"TRIG",
"TRIM",
"TRIO",
"TROD",
"TROT",
"TROY",
"TRUE",
"TUBA",
"TUBE",
"TUCK",
"TUFT",
"TUNA",
"TUNE",
"TUNG",
"TURF",
"TURN",
"TUSK",
"TWIG",
"TWIN",
"TWIT",
"ULAN",
"UNIT",
"URGE",
"USED",
"USER",
"USES",
"UTAH",
"VAIL",
"VAIN",
"VALE",
"VARY",
"VASE",
"VAST",
"VEAL",
"VEDA",
"VEIL",
"VEIN",
"VEND",
"VENT",
"VERB",
"VERY",
"VETO",
"VICE",
"VIEW",
"VINE",
"VISE",
"VOID",
"VOLT",
"VOTE",
"WACK",
"WADE",
"WAGE",
"WAIL",
"WAIT",
"WAKE",
"WALE",
"WALK",
"WALL",
"WALT",
"WAND",
"WANE",
"WANG",
"WANT",
"WARD",
"WARM",
"WARN",
"WART",
"WASH",
"WAST",
"WATS",
"WATT",
"WAVE",
"WAVY",
"WAYS",
"WEAK",
"WEAL",
"WEAN",
"WEAR",
"WEED",
"WEEK",
"WEIR",
"WELD",
"WELL",
"WELT",
"WENT",
"WERE",
"WERT",
"WEST",
"WHAM",
"WHAT",
"WHEE",
"WHEN",
"WHET",
"WHOA",
"WHOM",
"WICK",
"WIFE",
"WILD",
"WILL",
"WIND",
"WINE",
"WING",
"WINK",
"WINO",
"WIRE",
"WISE",
"WISH",
"WITH",
"WOLF",
"WONT",
"WOOD",
"WOOL",
"WORD",
"WORE",
"WORK",
"WORM",
"WORN",
"WOVE",
"WRIT",
"WYNN",
"YALE",
"YANG",
"YANK",
"YARD",
"YARN",
"YAWL",
"YAWN",
"YEAH",
"YEAR",
"YELL",
"YOGA",
"YOKE"
};
/* Encode 8 bytes in 'c' as a string of English words. */
char *opiebtoe FUNCTION((engout, c), char *engout AND char *c)
{
char cp[9]; /* add in room for the parity 2 bits */
int p, i;
engout[0] = '\0';
memcpy(cp, c, 8);
/* compute parity */
for (p = 0, i = 0; i < 64; i += 2)
p += extract(cp, i, 2);
cp[8] = (char)(p << 6);
strncat(engout, Wp[extract(cp, 0, 11)], 4);
strcat(engout, " ");
strncat(engout, Wp[extract(cp, 11, 11)], 4);
strcat(engout, " ");
strncat(engout, Wp[extract(cp, 22, 11)], 4);
strcat(engout, " ");
strncat(engout, Wp[extract(cp, 33, 11)], 4);
strcat(engout, " ");
strncat(engout, Wp[extract(cp, 44, 11)], 4);
strcat(engout, " ");
strncat(engout, Wp[extract(cp, 55, 11)], 4);
return (engout);
}
/* convert English to binary
* returns 1 OK - all good words and parity is OK
* 0 word not in data base
* -1 badly formed in put ie > 4 char word
* -2 words OK but parity is wrong
*/
int opieetob FUNCTION((out, e), char *out AND char *e)
{
char *word, *c, *input, b[9];
int i, p, v, l, low, high, rval = -1;
if (e == NULL)
return -1;
if ((i = strlen(e)) > 64)
i = 64;
if (!(input = malloc(i+1)))
return -1;
strncpy(input, e, i);
input[i] = 0;
memset(b, 0, sizeof(b));
memset(out, 0, 8);
for (i = 0, p = 0, word = c = input; i < 6; i++, p += 11) {
while (*c && !isalpha(*c)) c++;
word = c;
while (*c) {
if (islower(*c))
*c = toupper(*c);
if (*c == '1')
*c = 'L';
if (*c == '0')
*c = 'O';
if (*c == '5')
*c = 'S';
if (!isalpha(*c))
break;
c++;
}
if ((!*c) && (i != 5))
goto opiebtoeret;
*c = 0;
c++;
if (c == word)
goto opiebtoeret;
l = strlen(word);
if (l > 4 || l < 1)
goto opiebtoeret;
if (l < 4) {
low = 0;
high = 570;
} else {
low = 571;
high = 2047;
}
if ((v = wsrch(word, low, high)) < 0) {
rval = 0;
goto opiebtoeret;
}
insert(b, v, p, 11);
}
/* now check the parity of what we got */
for (p = 0, i = 0; i < 64; i += 2)
p += extract(b, i, 2);
if ((p & 3) != extract(b, 64, 2)) {
rval = -2;
goto opiebtoeret;
}
memcpy(out, b, 8);
rval = 1;
opiebtoeret:
free(input);
return rval;
}
/* Internal subroutines for word encoding/decoding */
/* Dictionary binary search */
static int wsrch FUNCTION((w, low, high), char *w AND int low AND int high)
{
int i, j;
for (;;) {
i = (low + high) / 2;
if ((j = strncmp(w, Wp[i], 4)) == 0)
return i; /* Found it */
if (high == low + 1) {
/* Avoid effects of integer truncation in /2 */
if (strncmp(w, Wp[high], 4) == 0)
return high;
else
return -1;
}
if (low >= high)
return -1; /* I don't *think* this can happen... */
if (j < 0)
high = i; /* Search lower half */
else
low = i; /* Search upper half */
}
}
static VOIDRET insert FUNCTION((s, x, start, length), char *s AND int x AND int start AND int length)
{
unsigned char cl;
unsigned char cc;
unsigned char cr;
UINT4 y;
int shift;
shift = ((8 - ((start + length) % 8)) % 8);
y = (long) x << shift;
cl = (y >> 16) & 0xff;
cc = (y >> 8) & 0xff;
cr = y & 0xff;
if (shift + length > 16) {
s[start / 8] |= cl;
s[start / 8 + 1] |= cc;
s[start / 8 + 2] |= cr;
} else
if (shift + length > 8) {
s[start / 8] |= cc;
s[start / 8 + 1] |= cr;
} else {
s[start / 8] |= cr;
}
}
static UINT4 extract FUNCTION((s, start, length), char *s AND int start AND int length)
{
UINT4 x;
unsigned char cl;
unsigned char cc;
unsigned char cr;
cl = s[start / 8];
cc = s[start / 8 + 1];
cr = s[start / 8 + 2];
x = ((UINT4) (cl << 8 | cc) << 8 | cr);
x = x >> (24 - (length + (start % 8)));
x = (x & (0xffff >> (16 - length)));
return (x);
}