otp.el

Difference between revision 4 and current revision

Summary: Rollback to 2007-06-01 11:09 UTC

No diff available.

Download

;;; otp.el --- a one-time password creator for Emacs -*- emacs-lisp -*-

;; Copyright (C) 2006, 2007 Paul Huff <paul.huff@gmail.com>

;; Author: Paul Huff <paul.huff@gmail.com>
;; Keywords: convenience

;; otp.el is free software; you can redistribute it and/or
;; modify it under the terms of the GNU General Public License as
;; published by the Free Software Foundation; either version 2, or
;; {at your option} any later version.

;; otp.el is distributed in the hope that it will be useful, but
;; WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;; General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING, or type `C-h C-c'. If
;; not, write to the Free Software Foundation at this address:

;;   Free Software Foundation
;;   51 Franklin Street, Fifth Floor
;;   Boston, MA 02110-1301
;;   USA

;; A lot of this stuff was developed with tons of help from #emacs.  Thanks,
;; guys!

;; The canonical place to find out about this file is:
;; http://sf.net/projects/otp-el

;; I added the following functions to my .emacs in order to get tramp
;; to use this code to automatically handle my otp host in a multi-chain... It's
;; worked really well for me.  Enjoy!



;; (setq tramp-otp-prompt-regexp "\\(^.*[rR]esponse\\).*:\^@? *")
;; (defun tramp-action-otp-password (p multi-method method user host)
;;   "Query the user for a password."
;;   (let* ((otp-string (match-string 1))
;; 	(pw-prompt
;; 	 (format "Password for %s (otp: %s) "
;; 		 (tramp-make-tramp-file-name
;; 		  nil method user host "") otp-string)))
;;     (tramp-message 9 "Sending password")
;;     (tramp-enter-otp-password p pw-prompt user host otp-string)))
;; (defun tramp-multi-action-otp-password (p method user host)
;;   "Query the user for a password."
;;   (let* ((otp-string (match-string 1))
;; 	(pw-prompt
;; 	 (format "Password for %s (opt: %s) "
;; 		 (tramp-make-tramp-file-name
;; 		  nil method user host "") otp-string)))
;;     (tramp-message 9 "Sending password")
;;     (tramp-enter-otp-password p pw-prompt user host otp-string)))
;; (defun tramp-enter-otp-password (p prompt user host otp-string)
;;   "Prompt for a password and send it to the remote end.
;; Uses PROMPT as a prompt and sends the password to process P."
;;   (let ((pw (otp-password-filter otp-string (tramp-read-passwd user host prompt))))
;;     (erase-buffer)
;;     (process-send-string
;;      p (concat pw
;; 	       (or (tramp-get-method-parameter
;; 		    tramp-current-multi-method
;; 		    tramp-current-method
;; 		    tramp-current-user
;; 		    tramp-current-host
;; 		    'tramp-password-end-of-line)
;; 		   tramp-default-password-end-of-line)))))
;; (setq tramp-actions-before-shell (cons '(tramp-otp-prompt-regexp tramp-action-otp-password) tramp-actions-before-shell))
;; (setq tramp-multi-actions (cons '(tramp-otp-prompt-regexp tramp-multi-action-otp-password) tramp-multi-actions))

(setq otp-dict '("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"))

(defun otp-hex-string-to-binary-string (s)
  ;;From sachac on #emacs! Thanks for the help!!
  (mapconcat (lambda (x) (nth (string-to-number x 16)
			      '("0000" "0001" "0010" "0011" "0100" "0101" 
				"0110" "0111" "1000" "1001" "1010" "1011" 
				"1100" "1101" "1110" "1111"))) 
	     (split-string s "" t) ""))

(defun otp-fold (s)
  (let ((result "")
	(n 0))
    (while (< n 16)
      (setq result (concat result (format "%x" 
					  (logxor 
					   (string-to-number 
					    (substring s n (1+ n)) 16)
					   (string-to-number 
					    (substring s (+ n 16) (+ n 17)) 16)))))
      (setq n (1+ n)))
    result))

(defun otp-hex-string-to-string (s)
  (let ((n 0)
	(result ""))
    (while (< n (length s))
      (setq result (concat result 
			   (list (string-to-number (substring s n (+ n 2)) 16))))
      (setq n (+ n 2)))
    result))

(defun otp-add-checksum (s)
  (let ((sum 0)
	(n 0)
	(result ""))
	(while (< n (length s))
	  (setq sum (+ sum (string-to-number (substring s n (+ n 2)) 2)))
	  (setq n (+ n 2)))
	(setq result (otp-hex-string-to-binary-string (format "%x" sum)))
	
	(concat s (substring result (- (length result) 2) (length result)))))
 
(defun otp-hex-string-to-words (s)
  (let* ((binary-string (otp-hex-string-to-binary-string s))
	(binary-string-plus (otp-add-checksum binary-string))
	(dict-indices (otp-string-partition binary-string-plus 11)))
;;    (setq blah-indices dict-indices)
;;    (setq blah-array (mapcar (lambda (x) (string-to-number x 2)) dict-indices))
    (mapconcat (lambda (x) (nth (string-to-number x 2) otp-dict)) dict-indices " ")
    ))
(defun otp-string-partition (s slength)
  (if (= (length s) 0) '()
    (cons (substring s 0 (+ 0 slength))
	  (otp-string-partition (substring s slength (length s)) slength))))

(defun otp-gen (times seed secret)
  (let ((s (otp-fold (md5 (concat (downcase seed) secret))))
	(n 0))
    (while (< n times)
      (setq s (otp-fold (md5 (otp-hex-string-to-string s))))
      (setq n (+ n 1)))
  ;;  (setq blah s)
    (otp-hex-string-to-words s)))

(defun otp-password-filter (prompt-string password)
  (if (not (equal (string-match "^otp-md5 \\([0-9]+\\) \\(.*\\) ext, Response" prompt-string) 'nil))
      (let ((pw (otp-gen (string-to-number (match-string 1 prompt-string)) (match-string 2 prompt-string) password)))
	    pw)))


(provide 'otp)