otp.tcl

Go to the documentation of this file.
00001 /*  otp.tcl - Copyright (C) 2006 Pat Thoyts <patthoyts@users.sourceforge.net>*/
00002 /* */
00003 /*  Tcl implementation of RFC 2289: A One-Time Password System*/
00004 /* */
00005 /*  -------------------------------------------------------------------------*/
00006 /*  See the file "license.terms" for information on usage and redistribution*/
00007 /*  of this file, and for a DISCLAIMER OF ALL WARRANTIES.*/
00008 /*  -------------------------------------------------------------------------*/
00009 
00010 
00011 package require Tcl 8.2;                /*  tcl minimum version*/
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 /*  Encode 64 bits as words selected from the RFC 2289 dictionary.*/
00281 /*  See the RFC for details. Briefly the input is broken into 11 bit*/
00282 /*  chunks + 2bits of checksum and each chunk selects a word from the */
00283 /*  2048 word table.*/
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 /*  Fold a 128 bit digest in little-endian format into a 64 bit*/
00316 /*  little-endian output*/
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 /*  Fold a160 bit big-endian digest (SHA-1) into a 64 bit */
00325 /*  little-endian output*/
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 /*  Fold a 160 bit little-endian digest into a 64 bit */
00334 /*  little-endian output.*/
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 /*  Description:*/
00343 /*   Pop the nth element off a list. Used in options processing.*/
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 /*  Local Variables:*/
00431 /*    mode: tcl*/
00432 /*    indent-tabs-mode: nil*/
00433 /*  End:*/
00434 

Generated on 21 Sep 2010 for Gui by  doxygen 1.6.1