otp.tcl
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 package require Tcl 8.2;
00012
00013 namespace ::otp {
00014 variable version 1.0.0
00015 variable rcsid {$Id: otp.tcl,v 1.2 2006/09/02 22:30:17 patthoyts Exp $}
00016
00017 namespace export otp-md4 otp-md5 otp-sha1 otp-rmd160
00018
00019 variable Words {
00020 "A" "ABE" "ACE" "ACT" "AD" "ADA" "ADD"
00021 "AGO" "AID" "AIM" "AIR" "ALL" "ALP" "AM" "AMY"
00022 "AN" "ANA" "AND" "ANN" "ANT" "ANY" "APE" "APS"
00023 "APT" "ARC" "ARE" "ARK" "ARM" "ART" "AS" "ASH"
00024 "ASK" "AT" "ATE" "AUG" "AUK" "AVE" "AWE" "AWK"
00025 "AWL" "AWN" "AX" "AYE" "BAD" "BAG" "BAH" "BAM"
00026 "BAN" "BAR" "BAT" "BAY" "BE" "BED" "BEE" "BEG"
00027 "BEN" "BET" "BEY" "BIB" "BID" "BIG" "BIN" "BIT"
00028 "BOB" "BOG" "BON" "BOO" "BOP" "BOW" "BOY" "BUB"
00029 "BUD" "BUG" "BUM" "BUN" "BUS" "BUT" "BUY" "BY"
00030 "BYE" "CAB" "CAL" "CAM" "CAN" "CAP" "CAR" "CAT"
00031 "CAW" "COD" "COG" "COL" "CON" "COO" "COP" "COT"
00032 "COW" "COY" "CRY" "CUB" "CUE" "CUP" "CUR" "CUT"
00033 "DAB" "DAD" "DAM" "DAN" "DAR" "DAY" "DEE" "DEL"
00034 "DEN" "DES" "DEW" "DID" "DIE" "DIG" "DIN" "DIP"
00035 "DO" "DOE" "DOG" "DON" "DOT" "DOW" "DRY" "DUB"
00036 "DUD" "DUE" "DUG" "DUN" "EAR" "EAT" "ED" "EEL"
00037 "EGG" "EGO" "ELI" "ELK" "ELM" "ELY" "EM" "END"
00038 "EST" "ETC" "EVA" "EVE" "EWE" "EYE" "FAD" "FAN"
00039 "FAR" "FAT" "FAY" "FED" "FEE" "FEW" "FIB" "FIG"
00040 "FIN" "FIR" "FIT" "FLO" "FLY" "FOE" "FOG" "FOR"
00041 "FRY" "FUM" "FUN" "FUR" "GAB" "GAD" "GAG" "GAL"
00042 "GAM" "GAP" "GAS" "GAY" "GEE" "GEL" "GEM" "GET"
00043 "GIG" "GIL" "GIN" "GO" "GOT" "GUM" "GUN" "GUS"
00044 "GUT" "GUY" "GYM" "GYP" "HA" "HAD" "HAL" "HAM"
00045 "HAN" "HAP" "HAS" "HAT" "HAW" "HAY" "HE" "HEM"
00046 "HEN" "HER" "HEW" "HEY" "HI" "HID" "HIM" "HIP"
00047 "HIS" "HIT" "HO" "HOB" "HOC" "HOE" "HOG" "HOP"
00048 "HOT" "HOW" "HUB" "HUE" "HUG" "HUH" "HUM" "HUT"
00049 "I" "ICY" "IDA" "IF" "IKE" "ILL" "INK" "INN"
00050 "IO" "ION" "IQ" "IRA" "IRE" "IRK" "IS" "IT"
00051 "ITS" "IVY" "JAB" "JAG" "JAM" "JAN" "JAR" "JAW"
00052 "JAY" "JET" "JIG" "JIM" "JO" "JOB" "JOE" "JOG"
00053 "JOT" "JOY" "JUG" "JUT" "KAY" "KEG" "KEN" "KEY"
00054 "KID" "KIM" "KIN" "KIT" "LA" "LAB" "LAC" "LAD"
00055 "LAG" "LAM" "LAP" "LAW" "LAY" "LEA" "LED" "LEE"
00056 "LEG" "LEN" "LEO" "LET" "LEW" "LID" "LIE" "LIN"
00057 "LIP" "LIT" "LO" "LOB" "LOG" "LOP" "LOS" "LOT"
00058 "LOU" "LOW" "LOY" "LUG" "LYE" "MA" "MAC" "MAD"
00059 "MAE" "MAN" "MAO" "MAP" "MAT" "MAW" "MAY" "ME"
00060 "MEG" "MEL" "MEN" "MET" "MEW" "MID" "MIN" "MIT"
00061 "MOB" "MOD" "MOE" "MOO" "MOP" "MOS" "MOT" "MOW"
00062 "MUD" "MUG" "MUM" "MY" "NAB" "NAG" "NAN" "NAP"
00063 "NAT" "NAY" "NE" "NED" "NEE" "NET" "NEW" "NIB"
00064 "NIL" "NIP" "NIT" "NO" "NOB" "NOD" "NON" "NOR"
00065 "NOT" "NOV" "NOW" "NU" "NUN" "NUT" "O" "OAF"
00066 "OAK" "OAR" "OAT" "ODD" "ODE" "OF" "OFF" "OFT"
00067 "OH" "OIL" "OK" "OLD" "ON" "ONE" "OR" "ORB"
00068 "ORE" "ORR" "OS" "OTT" "OUR" "OUT" "OVA" "OW"
00069 "OWE" "OWL" "OWN" "OX" "PA" "PAD" "PAL" "PAM"
00070 "PAN" "PAP" "PAR" "PAT" "PAW" "PAY" "PEA" "PEG"
00071 "PEN" "PEP" "PER" "PET" "PEW" "PHI" "PI" "PIE"
00072 "PIN" "PIT" "PLY" "PO" "POD" "POE" "POP" "POT"
00073 "POW" "PRO" "PRY" "PUB" "PUG" "PUN" "PUP" "PUT"
00074 "QUO" "RAG" "RAM" "RAN" "RAP" "RAT" "RAW" "RAY"
00075 "REB" "RED" "REP" "RET" "RIB" "RID" "RIG" "RIM"
00076 "RIO" "RIP" "ROB" "ROD" "ROE" "RON" "ROT" "ROW"
00077 "ROY" "RUB" "RUE" "RUG" "RUM" "RUN" "RYE" "SAC"
00078 "SAD" "SAG" "SAL" "SAM" "SAN" "SAP" "SAT" "SAW"
00079 "SAY" "SEA" "SEC" "SEE" "SEN" "SET" "SEW" "SHE"
00080 "SHY" "SIN" "SIP" "SIR" "SIS" "SIT" "SKI" "SKY"
00081 "SLY" "SO" "SOB" "SOD" "SON" "SOP" "SOW" "SOY"
00082 "SPA" "SPY" "SUB" "SUD" "SUE" "SUM" "SUN" "SUP"
00083 "TAB" "TAD" "TAG" "TAN" "TAP" "TAR" "TEA" "TED"
00084 "TEE" "TEN" "THE" "THY" "TIC" "TIE" "TIM" "TIN"
00085 "TIP" "TO" "TOE" "TOG" "TOM" "TON" "TOO" "TOP"
00086 "TOW" "TOY" "TRY" "TUB" "TUG" "TUM" "TUN" "TWO"
00087 "UN" "UP" "US" "USE" "VAN" "VAT" "VET" "VIE"
00088 "WAD" "WAG" "WAR" "WAS" "WAY" "WE" "WEB" "WED"
00089 "WEE" "WET" "WHO" "WHY" "WIN" "WIT" "WOK" "WON"
00090 "WOO" "WOW" "WRY" "WU" "YAM" "YAP" "YAW" "YE"
00091 "YEA" "YES" "YET" "YOU" "ABED" "ABEL" "ABET" "ABLE"
00092 "ABUT" "ACHE" "ACID" "ACME" "ACRE" "ACTA" "ACTS" "ADAM"
00093 "ADDS" "ADEN" "AFAR" "AFRO" "AGEE" "AHEM" "AHOY" "AIDA"
00094 "AIDE" "AIDS" "AIRY" "AJAR" "AKIN" "ALAN" "ALEC" "ALGA"
00095 "ALIA" "ALLY" "ALMA" "ALOE" "ALSO" "ALTO" "ALUM" "ALVA"
00096 "AMEN" "AMES" "AMID" "AMMO" "AMOK" "AMOS" "AMRA" "ANDY"
00097 "ANEW" "ANNA" "ANNE" "ANTE" "ANTI" "AQUA" "ARAB" "ARCH"
00098 "AREA" "ARGO" "ARID" "ARMY" "ARTS" "ARTY" "ASIA" "ASKS"
00099 "ATOM" "AUNT" "AURA" "AUTO" "AVER" "AVID" "AVIS" "AVON"
00100 "AVOW" "AWAY" "AWRY" "BABE" "BABY" "BACH" "BACK" "BADE"
00101 "BAIL" "BAIT" "BAKE" "BALD" "BALE" "BALI" "BALK" "BALL"
00102 "BALM" "BAND" "BANE" "BANG" "BANK" "BARB" "BARD" "BARE"
00103 "BARK" "BARN" "BARR" "BASE" "BASH" "BASK" "BASS" "BATE"
00104 "BATH" "BAWD" "BAWL" "BEAD" "BEAK" "BEAM" "BEAN" "BEAR"
00105 "BEAT" "BEAU" "BECK" "BEEF" "BEEN" "BEER" "BEET" "BELA"
00106 "BELL" "BELT" "BEND" "BENT" "BERG" "BERN" "BERT" "BESS"
00107 "BEST" "BETA" "BETH" "BHOY" "BIAS" "BIDE" "BIEN" "BILE"
00108 "BILK" "BILL" "BIND" "BING" "BIRD" "BITE" "BITS" "BLAB"
00109 "BLAT" "BLED" "BLEW" "BLOB" "BLOC" "BLOT" "BLOW" "BLUE"
00110 "BLUM" "BLUR" "BOAR" "BOAT" "BOCA" "BOCK" "BODE" "BODY"
00111 "BOGY" "BOHR" "BOIL" "BOLD" "BOLO" "BOLT" "BOMB" "BONA"
00112 "BOND" "BONE" "BONG" "BONN" "BONY" "BOOK" "BOOM" "BOON"
00113 "BOOT" "BORE" "BORG" "BORN" "BOSE" "BOSS" "BOTH" "BOUT"
00114 "BOWL" "BOYD" "BRAD" "BRAE" "BRAG" "BRAN" "BRAY" "BRED"
00115 "BREW" "BRIG" "BRIM" "BROW" "BUCK" "BUDD" "BUFF" "BULB"
00116 "BULK" "BULL" "BUNK" "BUNT" "BUOY" "BURG" "BURL" "BURN"
00117 "BURR" "BURT" "BURY" "BUSH" "BUSS" "BUST" "BUSY" "BYTE"
00118 "CADY" "CAFE" "CAGE" "CAIN" "CAKE" "CALF" "CALL" "CALM"
00119 "CAME" "CANE" "CANT" "CARD" "CARE" "CARL" "CARR" "CART"
00120 "CASE" "CASH" "CASK" "CAST" "CAVE" "CEIL" "CELL" "CENT"
00121 "CERN" "CHAD" "CHAR" "CHAT" "CHAW" "CHEF" "CHEN" "CHEW"
00122 "CHIC" "CHIN" "CHOU" "CHOW" "CHUB" "CHUG" "CHUM" "CITE"
00123 "CITY" "CLAD" "CLAM" "CLAN" "CLAW" "CLAY" "CLOD" "CLOG"
00124 "CLOT" "CLUB" "CLUE" "COAL" "COAT" "COCA" "COCK" "COCO"
00125 "CODA" "CODE" "CODY" "COED" "COIL" "COIN" "COKE" "COLA"
00126 "COLD" "COLT" "COMA" "COMB" "COME" "COOK" "COOL" "COON"
00127 "COOT" "CORD" "CORE" "CORK" "CORN" "COST" "COVE" "COWL"
00128 "CRAB" "CRAG" "CRAM" "CRAY" "CREW" "CRIB" "CROW" "CRUD"
00129 "CUBA" "CUBE" "CUFF" "CULL" "CULT" "CUNY" "CURB" "CURD"
00130 "CURE" "CURL" "CURT" "CUTS" "DADE" "DALE" "DAME" "DANA"
00131 "DANE" "DANG" "DANK" "DARE" "DARK" "DARN" "DART" "DASH"
00132 "DATA" "DATE" "DAVE" "DAVY" "DAWN" "DAYS" "DEAD" "DEAF"
00133 "DEAL" "DEAN" "DEAR" "DEBT" "DECK" "DEED" "DEEM" "DEER"
00134 "DEFT" "DEFY" "DELL" "DENT" "DENY" "DESK" "DIAL" "DICE"
00135 "DIED" "DIET" "DIME" "DINE" "DING" "DINT" "DIRE" "DIRT"
00136 "DISC" "DISH" "DISK" "DIVE" "DOCK" "DOES" "DOLE" "DOLL"
00137 "DOLT" "DOME" "DONE" "DOOM" "DOOR" "DORA" "DOSE" "DOTE"
00138 "DOUG" "DOUR" "DOVE" "DOWN" "DRAB" "DRAG" "DRAM" "DRAW"
00139 "DREW" "DRUB" "DRUG" "DRUM" "DUAL" "DUCK" "DUCT" "DUEL"
00140 "DUET" "DUKE" "DULL" "DUMB" "DUNE" "DUNK" "DUSK" "DUST"
00141 "DUTY" "EACH" "EARL" "EARN" "EASE" "EAST" "EASY" "EBEN"
00142 "ECHO" "EDDY" "EDEN" "EDGE" "EDGY" "EDIT" "EDNA" "EGAN"
00143 "ELAN" "ELBA" "ELLA" "ELSE" "EMIL" "EMIT" "EMMA" "ENDS"
00144 "ERIC" "EROS" "EVEN" "EVER" "EVIL" "EYED" "FACE" "FACT"
00145 "FADE" "FAIL" "FAIN" "FAIR" "FAKE" "FALL" "FAME" "FANG"
00146 "FARM" "FAST" "FATE" "FAWN" "FEAR" "FEAT" "FEED" "FEEL"
00147 "FEET" "FELL" "FELT" "FEND" "FERN" "FEST" "FEUD" "FIEF"
00148 "FIGS" "FILE" "FILL" "FILM" "FIND" "FINE" "FINK" "FIRE"
00149 "FIRM" "FISH" "FISK" "FIST" "FITS" "FIVE" "FLAG" "FLAK"
00150 "FLAM" "FLAT" "FLAW" "FLEA" "FLED" "FLEW" "FLIT" "FLOC"
00151 "FLOG" "FLOW" "FLUB" "FLUE" "FOAL" "FOAM" "FOGY" "FOIL"
00152 "FOLD" "FOLK" "FOND" "FONT" "FOOD" "FOOL" "FOOT" "FORD"
00153 "FORE" "FORK" "FORM" "FORT" "FOSS" "FOUL" "FOUR" "FOWL"
00154 "FRAU" "FRAY" "FRED" "FREE" "FRET" "FREY" "FROG" "FROM"
00155 "FUEL" "FULL" "FUME" "FUND" "FUNK" "FURY" "FUSE" "FUSS"
00156 "GAFF" "GAGE" "GAIL" "GAIN" "GAIT" "GALA" "GALE" "GALL"
00157 "GALT" "GAME" "GANG" "GARB" "GARY" "GASH" "GATE" "GAUL"
00158 "GAUR" "GAVE" "GAWK" "GEAR" "GELD" "GENE" "GENT" "GERM"
00159 "GETS" "GIBE" "GIFT" "GILD" "GILL" "GILT" "GINA" "GIRD"
00160 "GIRL" "GIST" "GIVE" "GLAD" "GLEE" "GLEN" "GLIB" "GLOB"
00161 "GLOM" "GLOW" "GLUE" "GLUM" "GLUT" "GOAD" "GOAL" "GOAT"
00162 "GOER" "GOES" "GOLD" "GOLF" "GONE" "GONG" "GOOD" "GOOF"
00163 "GORE" "GORY" "GOSH" "GOUT" "GOWN" "GRAB" "GRAD" "GRAY"
00164 "GREG" "GREW" "GREY" "GRID" "GRIM" "GRIN" "GRIT" "GROW"
00165 "GRUB" "GULF" "GULL" "GUNK" "GURU" "GUSH" "GUST" "GWEN"
00166 "GWYN" "HAAG" "HAAS" "HACK" "HAIL" "HAIR" "HALE" "HALF"
00167 "HALL" "HALO" "HALT" "HAND" "HANG" "HANK" "HANS" "HARD"
00168 "HARK" "HARM" "HART" "HASH" "HAST" "HATE" "HATH" "HAUL"
00169 "HAVE" "HAWK" "HAYS" "HEAD" "HEAL" "HEAR" "HEAT" "HEBE"
00170 "HECK" "HEED" "HEEL" "HEFT" "HELD" "HELL" "HELM" "HERB"
00171 "HERD" "HERE" "HERO" "HERS" "HESS" "HEWN" "HICK" "HIDE"
00172 "HIGH" "HIKE" "HILL" "HILT" "HIND" "HINT" "HIRE" "HISS"
00173 "HIVE" "HOBO" "HOCK" "HOFF" "HOLD" "HOLE" "HOLM" "HOLT"
00174 "HOME" "HONE" "HONK" "HOOD" "HOOF" "HOOK" "HOOT" "HORN"
00175 "HOSE" "HOST" "HOUR" "HOVE" "HOWE" "HOWL" "HOYT" "HUCK"
00176 "HUED" "HUFF" "HUGE" "HUGH" "HUGO" "HULK" "HULL" "HUNK"
00177 "HUNT" "HURD" "HURL" "HURT" "HUSH" "HYDE" "HYMN" "IBIS"
00178 "ICON" "IDEA" "IDLE" "IFFY" "INCA" "INCH" "INTO" "IONS"
00179 "IOTA" "IOWA" "IRIS" "IRMA" "IRON" "ISLE" "ITCH" "ITEM"
00180 "IVAN" "JACK" "JADE" "JAIL" "JAKE" "JANE" "JAVA" "JEAN"
00181 "JEFF" "JERK" "JESS" "JEST" "JIBE" "JILL" "JILT" "JIVE"
00182 "JOAN" "JOBS" "JOCK" "JOEL" "JOEY" "JOHN" "JOIN" "JOKE"
00183 "JOLT" "JOVE" "JUDD" "JUDE" "JUDO" "JUDY" "JUJU" "JUKE"
00184 "JULY" "JUNE" "JUNK" "JUNO" "JURY" "JUST" "JUTE" "KAHN"
00185 "KALE" "KANE" "KANT" "KARL" "KATE" "KEEL" "KEEN" "KENO"
00186 "KENT" "KERN" "KERR" "KEYS" "KICK" "KILL" "KIND" "KING"
00187 "KIRK" "KISS" "KITE" "KLAN" "KNEE" "KNEW" "KNIT" "KNOB"
00188 "KNOT" "KNOW" "KOCH" "KONG" "KUDO" "KURD" "KURT" "KYLE"
00189 "LACE" "LACK" "LACY" "LADY" "LAID" "LAIN" "LAIR" "LAKE"
00190 "LAMB" "LAME" "LAND" "LANE" "LANG" "LARD" "LARK" "LASS"
00191 "LAST" "LATE" "LAUD" "LAVA" "LAWN" "LAWS" "LAYS" "LEAD"
00192 "LEAF" "LEAK" "LEAN" "LEAR" "LEEK" "LEER" "LEFT" "LEND"
00193 "LENS" "LENT" "LEON" "LESK" "LESS" "LEST" "LETS" "LIAR"
00194 "LICE" "LICK" "LIED" "LIEN" "LIES" "LIEU" "LIFE" "LIFT"
00195 "LIKE" "LILA" "LILT" "LILY" "LIMA" "LIMB" "LIME" "LIND"
00196 "LINE" "LINK" "LINT" "LION" "LISA" "LIST" "LIVE" "LOAD"
00197 "LOAF" "LOAM" "LOAN" "LOCK" "LOFT" "LOGE" "LOIS" "LOLA"
00198 "LONE" "LONG" "LOOK" "LOON" "LOOT" "LORD" "LORE" "LOSE"
00199 "LOSS" "LOST" "LOUD" "LOVE" "LOWE" "LUCK" "LUCY" "LUGE"
00200 "LUKE" "LULU" "LUND" "LUNG" "LURA" "LURE" "LURK" "LUSH"
00201 "LUST" "LYLE" "LYNN" "LYON" "LYRA" "MACE" "MADE" "MAGI"
00202 "MAID" "MAIL" "MAIN" "MAKE" "MALE" "MALI" "MALL" "MALT"
00203 "MANA" "MANN" "MANY" "MARC" "MARE" "MARK" "MARS" "MART"
00204 "MARY" "MASH" "MASK" "MASS" "MAST" "MATE" "MATH" "MAUL"
00205 "MAYO" "MEAD" "MEAL" "MEAN" "MEAT" "MEEK" "MEET" "MELD"
00206 "MELT" "MEMO" "MEND" "MENU" "MERT" "MESH" "MESS" "MICE"
00207 "MIKE" "MILD" "MILE" "MILK" "MILL" "MILT" "MIMI" "MIND"
00208 "MINE" "MINI" "MINK" "MINT" "MIRE" "MISS" "MIST" "MITE"
00209 "MITT" "MOAN" "MOAT" "MOCK" "MODE" "MOLD" "MOLE" "MOLL"
00210 "MOLT" "MONA" "MONK" "MONT" "MOOD" "MOON" "MOOR" "MOOT"
00211 "MORE" "MORN" "MORT" "MOSS" "MOST" "MOTH" "MOVE" "MUCH"
00212 "MUCK" "MUDD" "MUFF" "MULE" "MULL" "MURK" "MUSH" "MUST"
00213 "MUTE" "MUTT" "MYRA" "MYTH" "NAGY" "NAIL" "NAIR" "NAME"
00214 "NARY" "NASH" "NAVE" "NAVY" "NEAL" "NEAR" "NEAT" "NECK"
00215 "NEED" "NEIL" "NELL" "NEON" "NERO" "NESS" "NEST" "NEWS"
00216 "NEWT" "NIBS" "NICE" "NICK" "NILE" "NINA" "NINE" "NOAH"
00217 "NODE" "NOEL" "NOLL" "NONE" "NOOK" "NOON" "NORM" "NOSE"
00218 "NOTE" "NOUN" "NOVA" "NUDE" "NULL" "NUMB" "OATH" "OBEY"
00219 "OBOE" "ODIN" "OHIO" "OILY" "OINT" "OKAY" "OLAF" "OLDY"
00220 "OLGA" "OLIN" "OMAN" "OMEN" "OMIT" "ONCE" "ONES" "ONLY"
00221 "ONTO" "ONUS" "ORAL" "ORGY" "OSLO" "OTIS" "OTTO" "OUCH"
00222 "OUST" "OUTS" "OVAL" "OVEN" "OVER" "OWLY" "OWNS" "QUAD"
00223 "QUIT" "QUOD" "RACE" "RACK" "RACY" "RAFT" "RAGE" "RAID"
00224 "RAIL" "RAIN" "RAKE" "RANK" "RANT" "RARE" "RASH" "RATE"
00225 "RAVE" "RAYS" "READ" "REAL" "REAM" "REAR" "RECK" "REED"
00226 "REEF" "REEK" "REEL" "REID" "REIN" "RENA" "REND" "RENT"
00227 "REST" "RICE" "RICH" "RICK" "RIDE" "RIFT" "RILL" "RIME"
00228 "RING" "RINK" "RISE" "RISK" "RITE" "ROAD" "ROAM" "ROAR"
00229 "ROBE" "ROCK" "RODE" "ROIL" "ROLL" "ROME" "ROOD" "ROOF"
00230 "ROOK" "ROOM" "ROOT" "ROSA" "ROSE" "ROSS" "ROSY" "ROTH"
00231 "ROUT" "ROVE" "ROWE" "ROWS" "RUBE" "RUBY" "RUDE" "RUDY"
00232 "RUIN" "RULE" "RUNG" "RUNS" "RUNT" "RUSE" "RUSH" "RUSK"
00233 "RUSS" "RUST" "RUTH" "SACK" "SAFE" "SAGE" "SAID" "SAIL"
00234 "SALE" "SALK" "SALT" "SAME" "SAND" "SANE" "SANG" "SANK"
00235 "SARA" "SAUL" "SAVE" "SAYS" "SCAN" "SCAR" "SCAT" "SCOT"
00236 "SEAL" "SEAM" "SEAR" "SEAT" "SEED" "SEEK" "SEEM" "SEEN"
00237 "SEES" "SELF" "SELL" "SEND" "SENT" "SETS" "SEWN" "SHAG"
00238 "SHAM" "SHAW" "SHAY" "SHED" "SHIM" "SHIN" "SHOD" "SHOE"
00239 "SHOT" "SHOW" "SHUN" "SHUT" "SICK" "SIDE" "SIFT" "SIGH"
00240 "SIGN" "SILK" "SILL" "SILO" "SILT" "SINE" "SING" "SINK"
00241 "SIRE" "SITE" "SITS" "SITU" "SKAT" "SKEW" "SKID" "SKIM"
00242 "SKIN" "SKIT" "SLAB" "SLAM" "SLAT" "SLAY" "SLED" "SLEW"
00243 "SLID" "SLIM" "SLIT" "SLOB" "SLOG" "SLOT" "SLOW" "SLUG"
00244 "SLUM" "SLUR" "SMOG" "SMUG" "SNAG" "SNOB" "SNOW" "SNUB"
00245 "SNUG" "SOAK" "SOAR" "SOCK" "SODA" "SOFA" "SOFT" "SOIL"
00246 "SOLD" "SOME" "SONG" "SOON" "SOOT" "SORE" "SORT" "SOUL"
00247 "SOUR" "SOWN" "STAB" "STAG" "STAN" "STAR" "STAY" "STEM"
00248 "STEW" "STIR" "STOW" "STUB" "STUN" "SUCH" "SUDS" "SUIT"
00249 "SULK" "SUMS" "SUNG" "SUNK" "SURE" "SURF" "SWAB" "SWAG"
00250 "SWAM" "SWAN" "SWAT" "SWAY" "SWIM" "SWUM" "TACK" "TACT"
00251 "TAIL" "TAKE" "TALE" "TALK" "TALL" "TANK" "TASK" "TATE"
00252 "TAUT" "TEAL" "TEAM" "TEAR" "TECH" "TEEM" "TEEN" "TEET"
00253 "TELL" "TEND" "TENT" "TERM" "TERN" "TESS" "TEST" "THAN"
00254 "THAT" "THEE" "THEM" "THEN" "THEY" "THIN" "THIS" "THUD"
00255 "THUG" "TICK" "TIDE" "TIDY" "TIED" "TIER" "TILE" "TILL"
00256 "TILT" "TIME" "TINA" "TINE" "TINT" "TINY" "TIRE" "TOAD"
00257 "TOGO" "TOIL" "TOLD" "TOLL" "TONE" "TONG" "TONY" "TOOK"
00258 "TOOL" "TOOT" "TORE" "TORN" "TOTE" "TOUR" "TOUT" "TOWN"
00259 "TRAG" "TRAM" "TRAY" "TREE" "TREK" "TRIG" "TRIM" "TRIO"
00260 "TROD" "TROT" "TROY" "TRUE" "TUBA" "TUBE" "TUCK" "TUFT"
00261 "TUNA" "TUNE" "TUNG" "TURF" "TURN" "TUSK" "TWIG" "TWIN"
00262 "TWIT" "ULAN" "UNIT" "URGE" "USED" "USER" "USES" "UTAH"
00263 "VAIL" "VAIN" "VALE" "VARY" "VASE" "VAST" "VEAL" "VEDA"
00264 "VEIL" "VEIN" "VEND" "VENT" "VERB" "VERY" "VETO" "VICE"
00265 "VIEW" "VINE" "VISE" "VOID" "VOLT" "VOTE" "WACK" "WADE"
00266 "WAGE" "WAIL" "WAIT" "WAKE" "WALE" "WALK" "WALL" "WALT"
00267 "WAND" "WANE" "WANG" "WANT" "WARD" "WARM" "WARN" "WART"
00268 "WASH" "WAST" "WATS" "WATT" "WAVE" "WAVY" "WAYS" "WEAK"
00269 "WEAL" "WEAN" "WEAR" "WEED" "WEEK" "WEIR" "WELD" "WELL"
00270 "WELT" "WENT" "WERE" "WERT" "WEST" "WHAM" "WHAT" "WHEE"
00271 "WHEN" "WHET" "WHOA" "WHOM" "WICK" "WIFE" "WILD" "WILL"
00272 "WIND" "WINE" "WING" "WINK" "WINO" "WIRE" "WISE" "WISH"
00273 "WITH" "WOLF" "WONT" "WOOD" "WOOL" "WORD" "WORE" "WORK"
00274 "WORM" "WORN" "WOVE" "WRIT" "WYNN" "YALE" "YANG" "YANK"
00275 "YARD" "YARN" "YAWL" "YAWN" "YEAH" "YEAR" "YELL" "YOGA"
00276 "YOKE"
00277 }
00278 }
00279
00280
00281
00282
00283
00284
00285 ret ::otp::otp_encode (type data) {
00286 variable Words
00287 if {[string length $data] != 8} {
00288 set bc [expr {[string length $data] * 8}]
00289 return -code error "invalid input: 64 bits of data\
00290 required and $bc bits provided"
00291 }
00292 binary scan $data II A B
00293
00294 set cksum 0
00295 foreach w [list $A $B] {
00296 for {set n 0} {$n < 32} {incr n 2} {
00297 incr cksum [expr {($w >> $n) & 3}]
00298 }
00299 }
00300
00301 set W0 [expr { (($A & 0xFFE00000) >> 21) & 0x07ff}]
00302 set W1 [expr { (($A & 0x001FFC00) >> 10)}]
00303 set W2 [expr { (($A & 0x000003FF) << 1) | (($B >> 31) & 0x1)}]
00304 set W3 [expr { ($B & 0x7FF00000) >> 20}]
00305 set W4 [expr { ($B & 0x000FFE00) >> 9}]
00306 set W5 [expr { (($B & 0x000001FF) << 2) | ($cksum & 3)}]
00307
00308 foreach w [list $W0 $W1 $W2 $W3 $W4 $W5] {
00309 lappend words [lindex $Words $w]
00310 }
00311
00312 return $words
00313 }
00314
00315
00316
00317 ret ::otp::Fold64LE (type digest) {
00318 binary scan $digest iiii A B C D
00319 set w0 [expr {($A ^ $C) & 0xffffffff}]
00320 set w1 [expr {($B ^ $D) & 0xffffffff}]
00321 binary format ii $w0 $w1
00322 }
00323
00324
00325
00326 ret ::otp::Fold160BE (type digest) {
00327 binary scan $digest IIIII A B C D E
00328 set w0 [expr {(($A ^ $C) ^ $E) & 0xffffffff}]
00329 set w1 [expr { ($B ^ $D) & 0xffffffff}]
00330 binary format ii $w0 $w1
00331 }
00332
00333
00334
00335 ret ::otp::Fold160LE (type digest) {
00336 binary scan $digest iiiii A B C D E
00337 set w0 [expr {(($A ^ $C) ^ $E) & 0xffffffff}]
00338 set w1 [expr { ($B ^ $D) & 0xffffffff}]
00339 binary format ii $w0 $w1
00340 }
00341
00342
00343
00344
00345 ret ::otp::Pop (type varname , optional nth =0) {
00346 upvar $varname args
00347 set r [lindex $args $nth]
00348 set args [lreplace $args $nth $nth]
00349 return $r
00350 }
00351
00352 ret ::otp::otp (type args) {
00353 array set opts {-hash md5 -seed {} -count 0 -hex 0 -words 0}
00354 while {[string match -* [set option [lindex $args 0]]]} {
00355 switch -exact -- $option {
00356 -hex { set opts(-hex) 1}
00357 -word -
00358 -words { set opts(-words) 1 }
00359 -hash { set opts(-hash) [Pop args 1] }
00360 -seed { set opts(-seed) [Pop args 1] }
00361 -count { set opts(-count) [Pop args 1] }
00362 default {
00363 if {[llength $args] == 1} { break }
00364 if {[string compare $option "--"] == 0} { Pop args; break }
00365 set err [join [lsort [array names opts]] ", "]
00366 return -code error "bad option \"$option\":\
00367 must be one of $err"
00368 }
00369 }
00370 Pop args
00371 }
00372
00373 set data [lindex $args 0]
00374
00375 if {[string length $opts(-seed)] < 1 || [string length $opts(-seed)] > 16} {
00376 return -code error "seed must be between 1 and 16 characters in length"
00377 }
00378 switch -exact -- $opts(-hash) {
00379 md4 { set func ::md4::md4 ; set fold ::otp::Fold64LE }
00380 md5 { set func ::md5::md5 ; set fold ::otp::Fold64LE }
00381 sha1 { set func ::otp::sha1 ; set fold ::otp::Fold160BE }
00382 rmd160 { set func ::ripemd::ripemd160 ; set fold ::otp::Fold160LE }
00383 default {
00384 return -code error "invalid hash type \"$opts(-hash)\":\
00385 must be one of md4, md5, rmd160 or sha1"
00386 }
00387 }
00388 # RFC 2289: Initial step
00389 set S [$fold [$func [string tolower $opts(-seed)]$data]]
00390
00391 # RFC2289:6 Computation step
00392 for {set n 0} {$n < $opts(-count)} {incr n} {
00393 set S [$fold [$func $S]]
00394 }
00395
00396 if {$opts(-hex)} {
00397 binary scan $S H* S
00398 } elseif {$opts(-words)} {
00399 set S [otp_encode $S]
00400 }
00401 return $S
00402 }
00403
00404 ret ::otp::otp-md4 (type args) {
00405 package require md4
00406 return [eval [linsert $args 0 [namespace current]::otp -hash md4]]
00407 }
00408
00409 ret ::otp::otp-md5 (type args) {
00410 package require md5
00411 return [eval [linsert $args 0 [namespace current]::otp -hash md5]]
00412 }
00413
00414 ret ::otp::otp-sha1 (type args) {
00415 package require sha1
00416 interp alias {} ::otp::sha1 {} ::sha1::sha1 -bin
00417 return [eval [linsert $args 0 [namespace current]::otp -hash sha1]]
00418 }
00419
00420 ret ::otp::otp-rmd160 (type args) {
00421 package require ripemd160
00422 return [eval [linsert $args 0 [namespace current]::otp -hash rmd160]]
00423 }
00424
00425
00426
00427 package provide otp $::otp::version
00428
00429
00430
00431
00432
00433
00434