ruby-otp 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +3 -0
- data/Manifest.txt +7 -0
- data/README.txt +47 -0
- data/Rakefile +37 -0
- data/lib/otp.rb +188 -0
- data/test/fixtures.yml +35 -0
- data/test/test_ruby-otp.rb +23 -0
- metadata +72 -0
data/History.txt
ADDED
data/Manifest.txt
ADDED
data/README.txt
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
= ruby-otp
|
2
|
+
|
3
|
+
by Guillaume Pierronnet
|
4
|
+
* http://ruby-otp.rubyforge.org
|
5
|
+
* http://rubyforge.org/projects/ruby-otp/
|
6
|
+
|
7
|
+
== DESCRIPTION:
|
8
|
+
|
9
|
+
ruby-otp is a One Time Password library, compatible with OPIE and S/KEY, and RFC 1760 compliant.
|
10
|
+
|
11
|
+
== FEATURES/PROBLEMS:
|
12
|
+
|
13
|
+
* pure ruby
|
14
|
+
* RFC 1760 compliant
|
15
|
+
* OPIE and S/KEY compatible
|
16
|
+
|
17
|
+
== SYNOPSIS:
|
18
|
+
|
19
|
+
seq_num = 497
|
20
|
+
seed = "aa3423"
|
21
|
+
otp = OTP.new(seq_num, seed, "my really private password", "md5")
|
22
|
+
expected_sentence = otp.to_s.downcase
|
23
|
+
|
24
|
+
puts "please enter the sentence from your OTP calculator seq_num: #{seq_num}, seed: #{seed}"
|
25
|
+
sentence = gets.chop
|
26
|
+
|
27
|
+
if expected_sentence == sentence.downcase
|
28
|
+
puts "access granted"
|
29
|
+
else
|
30
|
+
puts "you're not authorized"
|
31
|
+
end
|
32
|
+
|
33
|
+
== TODO
|
34
|
+
|
35
|
+
* RFC 2289 support
|
36
|
+
|
37
|
+
== REQUIREMENTS:
|
38
|
+
|
39
|
+
* openssl for OpenSSL::Digest::MD4
|
40
|
+
|
41
|
+
== INSTALL:
|
42
|
+
|
43
|
+
* sudo gem install ruby-otp
|
44
|
+
|
45
|
+
== LICENSE:
|
46
|
+
|
47
|
+
GPL
|
data/Rakefile
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
require './lib/otp.rb'
|
6
|
+
|
7
|
+
Hoe.new('ruby-otp', OTP::VERSION) do |p|
|
8
|
+
p.rubyforge_name = 'ruby-otp'
|
9
|
+
p.author = 'Guillaume Pierronnet'
|
10
|
+
p.email = 'moumar@rubyforge.org'
|
11
|
+
p.summary = p.description = p.paragraphs_of('README.txt', 3).first
|
12
|
+
p.url = p.paragraphs_of('README.txt', 1).first
|
13
|
+
p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
|
14
|
+
p.remote_rdoc_dir = ''
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "generate the test fixtures"
|
18
|
+
task :generate_fixtures do
|
19
|
+
require "yaml"
|
20
|
+
|
21
|
+
fixtures = {}
|
22
|
+
%w{md4 md5}.each do |algo|
|
23
|
+
fixtures[algo] = []
|
24
|
+
['this is a pass', 'aqsdf234qsdf ,;:,sqdfp")q', 'eeazqsd123123123', 'sqdklmfvxcwvBU(/ysdfqsdf$' ].each do |passphrase|
|
25
|
+
seq_num = rand(500) + 1
|
26
|
+
seed = "fs9332"
|
27
|
+
|
28
|
+
sentence = open("|opiekey -#{algo[-1].chr} -n 1 #{seq_num} #{seed} 2>/dev/null", "r+") do |io|
|
29
|
+
io.puts(passphrase)
|
30
|
+
io.read.chop
|
31
|
+
end
|
32
|
+
fixtures[algo] << { "seed" => seed, "seq_num" => seq_num, "passphrase" => passphrase, "sentence" => sentence }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
File.open("test/fixtures.yml", "w") { |f| f.write(fixtures.to_yaml) }
|
36
|
+
end
|
37
|
+
# vim: syntax=ruby
|
data/lib/otp.rb
ADDED
@@ -0,0 +1,188 @@
|
|
1
|
+
require "digest/md5"
|
2
|
+
require "openssl"
|
3
|
+
|
4
|
+
class OTP
|
5
|
+
VERSION = "0.1"
|
6
|
+
|
7
|
+
WORDS = %w{A ABE ACE ACT AD ADA ADD AGO AID AIM AIR ALL ALP AM AMY AN ANA AND ANN ANT ANY APE APS
|
8
|
+
APT ARC ARE ARK ARM ART AS ASH ASK AT ATE AUG AUK AVE AWE AWK AWL AWN AX AYE BAD BAG BAH BAM
|
9
|
+
BAN BAR BAT BAY BE BED BEE BEG BEN BET BEY BIB BID BIG BIN BIT BOB BOG BON BOO BOP BOW BOY BUB
|
10
|
+
BUD BUG BUM BUN BUS BUT BUY BY BYE CAB CAL CAM CAN CAP CAR CAT CAW COD COG COL CON COO COP COT
|
11
|
+
COW COY CRY CUB CUE CUP CUR CUT DAB DAD DAM DAN DAR DAY DEE DEL DEN DES DEW DID DIE DIG DIN DIP
|
12
|
+
DO DOE DOG DON DOT DOW DRY DUB DUD DUE DUG DUN EAR EAT ED EEL EGG EGO ELI ELK ELM ELY EM END
|
13
|
+
EST ETC EVA EVE EWE EYE FAD FAN FAR FAT FAY FED FEE FEW FIB FIG FIN FIR FIT FLO FLY FOE FOG FOR
|
14
|
+
FRY FUM FUN FUR GAB GAD GAG GAL GAM GAP GAS GAY GEE GEL GEM GET GIG GIL GIN GO GOT GUM GUN GUS
|
15
|
+
GUT GUY GYM GYP HA HAD HAL HAM HAN HAP HAS HAT HAW HAY HE HEM HEN HER HEW HEY HI HID HIM HIP
|
16
|
+
HIS HIT HO HOB HOC HOE HOG HOP HOT HOW HUB HUE HUG HUH HUM HUT I ICY IDA IF IKE ILL INK INN
|
17
|
+
IO ION IQ IRA IRE IRK IS IT ITS IVY JAB JAG JAM JAN JAR JAW JAY JET JIG JIM JO JOB JOE JOG
|
18
|
+
JOT JOY JUG JUT KAY KEG KEN KEY KID KIM KIN KIT LA LAB LAC LAD LAG LAM LAP LAW LAY LEA LED LEE
|
19
|
+
LEG LEN LEO LET LEW LID LIE LIN LIP LIT LO LOB LOG LOP LOS LOT LOU LOW LOY LUG LYE MA MAC MAD
|
20
|
+
MAE MAN MAO MAP MAT MAW MAY ME MEG MEL MEN MET MEW MID MIN MIT MOB MOD MOE MOO MOP MOS MOT MOW
|
21
|
+
MUD MUG MUM MY NAB NAG NAN NAP NAT NAY NE NED NEE NET NEW NIB NIL NIP NIT NO NOB NOD NON NOR
|
22
|
+
NOT NOV NOW NU NUN NUT O OAF OAK OAR OAT ODD ODE OF OFF OFT OH OIL OK OLD ON ONE OR ORB
|
23
|
+
ORE ORR OS OTT OUR OUT OVA OW OWE OWL OWN OX PA PAD PAL PAM PAN PAP PAR PAT PAW PAY PEA PEG
|
24
|
+
PEN PEP PER PET PEW PHI PI PIE PIN PIT PLY PO POD POE POP POT POW PRO PRY PUB PUG PUN PUP PUT
|
25
|
+
QUO RAG RAM RAN RAP RAT RAW RAY REB RED REP RET RIB RID RIG RIM RIO RIP ROB ROD ROE RON ROT ROW
|
26
|
+
ROY RUB RUE RUG RUM RUN RYE SAC SAD SAG SAL SAM SAN SAP SAT SAW SAY SEA SEC SEE SEN SET SEW SHE
|
27
|
+
SHY SIN SIP SIR SIS SIT SKI SKY SLY SO SOB SOD SON SOP SOW SOY SPA SPY SUB SUD SUE SUM SUN SUP
|
28
|
+
TAB TAD TAG TAN TAP TAR TEA TED TEE TEN THE THY TIC TIE TIM TIN TIP TO TOE TOG TOM TON TOO TOP
|
29
|
+
TOW TOY TRY TUB TUG TUM TUN TWO UN UP US USE VAN VAT VET VIE WAD WAG WAR WAS WAY WE WEB WED
|
30
|
+
WEE WET WHO WHY WIN WIT WOK WON WOO WOW WRY WU YAM YAP YAW YE YEA YES YET YOU ABED ABEL ABET ABLE
|
31
|
+
ABUT ACHE ACID ACME ACRE ACTA ACTS ADAM ADDS ADEN AFAR AFRO AGEE AHEM AHOY AIDA
|
32
|
+
AIDE AIDS AIRY AJAR AKIN ALAN ALEC ALGA ALIA ALLY ALMA ALOE ALSO ALTO ALUM ALVA
|
33
|
+
AMEN AMES AMID AMMO AMOK AMOS AMRA ANDY ANEW ANNA ANNE ANTE ANTI AQUA ARAB ARCH
|
34
|
+
AREA ARGO ARID ARMY ARTS ARTY ASIA ASKS ATOM AUNT AURA AUTO AVER AVID AVIS AVON
|
35
|
+
AVOW AWAY AWRY BABE BABY BACH BACK BADE BAIL BAIT BAKE BALD BALE BALI BALK BALL
|
36
|
+
BALM BAND BANE BANG BANK BARB BARD BARE BARK BARN BARR BASE BASH BASK BASS BATE
|
37
|
+
BATH BAWD BAWL BEAD BEAK BEAM BEAN BEAR BEAT BEAU BECK BEEF BEEN BEER BEET BELA
|
38
|
+
BELL BELT BEND BENT BERG BERN BERT BESS BEST BETA BETH BHOY BIAS BIDE BIEN BILE
|
39
|
+
BILK BILL BIND BING BIRD BITE BITS BLAB BLAT BLED BLEW BLOB BLOC BLOT BLOW BLUE
|
40
|
+
BLUM BLUR BOAR BOAT BOCA BOCK BODE BODY BOGY BOHR BOIL BOLD BOLO BOLT BOMB BONA
|
41
|
+
BOND BONE BONG BONN BONY BOOK BOOM BOON BOOT BORE BORG BORN BOSE BOSS BOTH BOUT
|
42
|
+
BOWL BOYD BRAD BRAE BRAG BRAN BRAY BRED BREW BRIG BRIM BROW BUCK BUDD BUFF BULB
|
43
|
+
BULK BULL BUNK BUNT BUOY BURG BURL BURN BURR BURT BURY BUSH BUSS BUST BUSY BYTE
|
44
|
+
CADY CAFE CAGE CAIN CAKE CALF CALL CALM CAME CANE CANT CARD CARE CARL CARR CART
|
45
|
+
CASE CASH CASK CAST CAVE CEIL CELL CENT CERN CHAD CHAR CHAT CHAW CHEF CHEN CHEW
|
46
|
+
CHIC CHIN CHOU CHOW CHUB CHUG CHUM CITE CITY CLAD CLAM CLAN CLAW CLAY CLOD CLOG
|
47
|
+
CLOT CLUB CLUE COAL COAT COCA COCK COCO CODA CODE CODY COED COIL COIN COKE COLA
|
48
|
+
COLD COLT COMA COMB COME COOK COOL COON COOT CORD CORE CORK CORN COST COVE COWL
|
49
|
+
CRAB CRAG CRAM CRAY CREW CRIB CROW CRUD CUBA CUBE CUFF CULL CULT CUNY CURB CURD
|
50
|
+
CURE CURL CURT CUTS DADE DALE DAME DANA DANE DANG DANK DARE DARK DARN DART DASH
|
51
|
+
DATA DATE DAVE DAVY DAWN DAYS DEAD DEAF DEAL DEAN DEAR DEBT DECK DEED DEEM DEER
|
52
|
+
DEFT DEFY DELL DENT DENY DESK DIAL DICE DIED DIET DIME DINE DING DINT DIRE DIRT
|
53
|
+
DISC DISH DISK DIVE DOCK DOES DOLE DOLL DOLT DOME DONE DOOM DOOR DORA DOSE DOTE
|
54
|
+
DOUG DOUR DOVE DOWN DRAB DRAG DRAM DRAW DREW DRUB DRUG DRUM DUAL DUCK DUCT DUEL
|
55
|
+
DUET DUKE DULL DUMB DUNE DUNK DUSK DUST DUTY EACH EARL EARN EASE EAST EASY EBEN
|
56
|
+
ECHO EDDY EDEN EDGE EDGY EDIT EDNA EGAN ELAN ELBA ELLA ELSE EMIL EMIT EMMA ENDS
|
57
|
+
ERIC EROS EVEN EVER EVIL EYED FACE FACT FADE FAIL FAIN FAIR FAKE FALL FAME FANG
|
58
|
+
FARM FAST FATE FAWN FEAR FEAT FEED FEEL FEET FELL FELT FEND FERN FEST FEUD FIEF
|
59
|
+
FIGS FILE FILL FILM FIND FINE FINK FIRE FIRM FISH FISK FIST FITS FIVE FLAG FLAK
|
60
|
+
FLAM FLAT FLAW FLEA FLED FLEW FLIT FLOC FLOG FLOW FLUB FLUE FOAL FOAM FOGY FOIL
|
61
|
+
FOLD FOLK FOND FONT FOOD FOOL FOOT FORD FORE FORK FORM FORT FOSS FOUL FOUR FOWL
|
62
|
+
FRAU FRAY FRED FREE FRET FREY FROG FROM FUEL FULL FUME FUND FUNK FURY FUSE FUSS
|
63
|
+
GAFF GAGE GAIL GAIN GAIT GALA GALE GALL GALT GAME GANG GARB GARY GASH GATE GAUL
|
64
|
+
GAUR GAVE GAWK GEAR GELD GENE GENT GERM GETS GIBE GIFT GILD GILL GILT GINA GIRD
|
65
|
+
GIRL GIST GIVE GLAD GLEE GLEN GLIB GLOB GLOM GLOW GLUE GLUM GLUT GOAD GOAL GOAT
|
66
|
+
GOER GOES GOLD GOLF GONE GONG GOOD GOOF GORE GORY GOSH GOUT GOWN GRAB GRAD GRAY
|
67
|
+
GREG GREW GREY GRID GRIM GRIN GRIT GROW GRUB GULF GULL GUNK GURU GUSH GUST GWEN
|
68
|
+
GWYN HAAG HAAS HACK HAIL HAIR HALE HALF HALL HALO HALT HAND HANG HANK HANS HARD
|
69
|
+
HARK HARM HART HASH HAST HATE HATH HAUL HAVE HAWK HAYS HEAD HEAL HEAR HEAT HEBE
|
70
|
+
HECK HEED HEEL HEFT HELD HELL HELM HERB HERD HERE HERO HERS HESS HEWN HICK HIDE
|
71
|
+
HIGH HIKE HILL HILT HIND HINT HIRE HISS HIVE HOBO HOCK HOFF HOLD HOLE HOLM HOLT
|
72
|
+
HOME HONE HONK HOOD HOOF HOOK HOOT HORN HOSE HOST HOUR HOVE HOWE HOWL HOYT HUCK
|
73
|
+
HUED HUFF HUGE HUGH HUGO HULK HULL HUNK HUNT HURD HURL HURT HUSH HYDE HYMN IBIS
|
74
|
+
ICON IDEA IDLE IFFY INCA INCH INTO IONS IOTA IOWA IRIS IRMA IRON ISLE ITCH ITEM
|
75
|
+
IVAN JACK JADE JAIL JAKE JANE JAVA JEAN JEFF JERK JESS JEST JIBE JILL JILT JIVE
|
76
|
+
JOAN JOBS JOCK JOEL JOEY JOHN JOIN JOKE JOLT JOVE JUDD JUDE JUDO JUDY JUJU JUKE
|
77
|
+
JULY JUNE JUNK JUNO JURY JUST JUTE KAHN KALE KANE KANT KARL KATE KEEL KEEN KENO
|
78
|
+
KENT KERN KERR KEYS KICK KILL KIND KING KIRK KISS KITE KLAN KNEE KNEW KNIT KNOB
|
79
|
+
KNOT KNOW KOCH KONG KUDO KURD KURT KYLE LACE LACK LACY LADY LAID LAIN LAIR LAKE
|
80
|
+
LAMB LAME LAND LANE LANG LARD LARK LASS LAST LATE LAUD LAVA LAWN LAWS LAYS LEAD
|
81
|
+
LEAF LEAK LEAN LEAR LEEK LEER LEFT LEND LENS LENT LEON LESK LESS LEST LETS LIAR
|
82
|
+
LICE LICK LIED LIEN LIES LIEU LIFE LIFT LIKE LILA LILT LILY LIMA LIMB LIME LIND
|
83
|
+
LINE LINK LINT LION LISA LIST LIVE LOAD LOAF LOAM LOAN LOCK LOFT LOGE LOIS LOLA
|
84
|
+
LONE LONG LOOK LOON LOOT LORD LORE LOSE LOSS LOST LOUD LOVE LOWE LUCK LUCY LUGE
|
85
|
+
LUKE LULU LUND LUNG LURA LURE LURK LUSH LUST LYLE LYNN LYON LYRA MACE MADE MAGI
|
86
|
+
MAID MAIL MAIN MAKE MALE MALI MALL MALT MANA MANN MANY MARC MARE MARK MARS MART
|
87
|
+
MARY MASH MASK MASS MAST MATE MATH MAUL MAYO MEAD MEAL MEAN MEAT MEEK MEET MELD
|
88
|
+
MELT MEMO MEND MENU MERT MESH MESS MICE MIKE MILD MILE MILK MILL MILT MIMI MIND
|
89
|
+
MINE MINI MINK MINT MIRE MISS MIST MITE MITT MOAN MOAT MOCK MODE MOLD MOLE MOLL
|
90
|
+
MOLT MONA MONK MONT MOOD MOON MOOR MOOT MORE MORN MORT MOSS MOST MOTH MOVE MUCH
|
91
|
+
MUCK MUDD MUFF MULE MULL MURK MUSH MUST MUTE MUTT MYRA MYTH NAGY NAIL NAIR NAME
|
92
|
+
NARY NASH NAVE NAVY NEAL NEAR NEAT NECK NEED NEIL NELL NEON NERO NESS NEST NEWS
|
93
|
+
NEWT NIBS NICE NICK NILE NINA NINE NOAH NODE NOEL NOLL NONE NOOK NOON NORM NOSE
|
94
|
+
NOTE NOUN NOVA NUDE NULL NUMB OATH OBEY OBOE ODIN OHIO OILY OINT OKAY OLAF OLDY
|
95
|
+
OLGA OLIN OMAN OMEN OMIT ONCE ONES ONLY ONTO ONUS ORAL ORGY OSLO OTIS OTTO OUCH
|
96
|
+
OUST OUTS OVAL OVEN OVER OWLY OWNS QUAD QUIT QUOD RACE RACK RACY RAFT RAGE RAID
|
97
|
+
RAIL RAIN RAKE RANK RANT RARE RASH RATE RAVE RAYS READ REAL REAM REAR RECK REED
|
98
|
+
REEF REEK REEL REID REIN RENA REND RENT REST RICE RICH RICK RIDE RIFT RILL RIME
|
99
|
+
RING RINK RISE RISK RITE ROAD ROAM ROAR ROBE ROCK RODE ROIL ROLL ROME ROOD ROOF
|
100
|
+
ROOK ROOM ROOT ROSA ROSE ROSS ROSY ROTH ROUT ROVE ROWE ROWS RUBE RUBY RUDE RUDY
|
101
|
+
RUIN RULE RUNG RUNS RUNT RUSE RUSH RUSK RUSS RUST RUTH SACK SAFE SAGE SAID SAIL
|
102
|
+
SALE SALK SALT SAME SAND SANE SANG SANK SARA SAUL SAVE SAYS SCAN SCAR SCAT SCOT
|
103
|
+
SEAL SEAM SEAR SEAT SEED SEEK SEEM SEEN SEES SELF SELL SEND SENT SETS SEWN SHAG
|
104
|
+
SHAM SHAW SHAY SHED SHIM SHIN SHOD SHOE SHOT SHOW SHUN SHUT SICK SIDE SIFT SIGH
|
105
|
+
SIGN SILK SILL SILO SILT SINE SING SINK SIRE SITE SITS SITU SKAT SKEW SKID SKIM
|
106
|
+
SKIN SKIT SLAB SLAM SLAT SLAY SLED SLEW SLID SLIM SLIT SLOB SLOG SLOT SLOW SLUG
|
107
|
+
SLUM SLUR SMOG SMUG SNAG SNOB SNOW SNUB SNUG SOAK SOAR SOCK SODA SOFA SOFT SOIL
|
108
|
+
SOLD SOME SONG SOON SOOT SORE SORT SOUL SOUR SOWN STAB STAG STAN STAR STAY STEM
|
109
|
+
STEW STIR STOW STUB STUN SUCH SUDS SUIT SULK SUMS SUNG SUNK SURE SURF SWAB SWAG
|
110
|
+
SWAM SWAN SWAT SWAY SWIM SWUM TACK TACT TAIL TAKE TALE TALK TALL TANK TASK TATE
|
111
|
+
TAUT TEAL TEAM TEAR TECH TEEM TEEN TEET TELL TEND TENT TERM TERN TESS TEST THAN
|
112
|
+
THAT THEE THEM THEN THEY THIN THIS THUD THUG TICK TIDE TIDY TIED TIER TILE TILL
|
113
|
+
TILT TIME TINA TINE TINT TINY TIRE TOAD TOGO TOIL TOLD TOLL TONE TONG TONY TOOK
|
114
|
+
TOOL TOOT TORE TORN TOTE TOUR TOUT TOWN TRAG TRAM TRAY TREE TREK TRIG TRIM TRIO
|
115
|
+
TROD TROT TROY TRUE TUBA TUBE TUCK TUFT TUNA TUNE TUNG TURF TURN TUSK TWIG TWIN
|
116
|
+
TWIT ULAN UNIT URGE USED USER USES UTAH VAIL VAIN VALE VARY VASE VAST VEAL VEDA
|
117
|
+
VEIL VEIN VEND VENT VERB VERY VETO VICE VIEW VINE VISE VOID VOLT VOTE WACK WADE
|
118
|
+
WAGE WAIL WAIT WAKE WALE WALK WALL WALT WAND WANE WANG WANT WARD WARM WARN WART
|
119
|
+
WASH WAST WATS WATT WAVE WAVY WAYS WEAK WEAL WEAN WEAR WEED WEEK WEIR WELD WELL
|
120
|
+
WELT WENT WERE WERT WEST WHAM WHAT WHEE WHEN WHET WHOA WHOM WICK WIFE WILD WILL
|
121
|
+
WIND WINE WING WINK WINO WIRE WISE WISH WITH WOLF WONT WOOD WOOL WORD WORE WORK
|
122
|
+
WORM WORN WOVE WRIT WYNN YALE YANG YANK YARD YARN YAWL YAWN YEAH YEAR YELL YOGA
|
123
|
+
YOKE}
|
124
|
+
|
125
|
+
ALGO_MAP = { 'md4' => OpenSSL::Digest::MD4,
|
126
|
+
'md5' => Digest::MD5 }.freeze
|
127
|
+
|
128
|
+
# generate a pseudo-random seed like "gh1234" or "zf4326"
|
129
|
+
def self.generate_seed
|
130
|
+
( (0..1).collect { (rand(26) + 97).chr } +
|
131
|
+
(0..3).collect { (rand(10) + 48).chr }).join("")
|
132
|
+
end
|
133
|
+
|
134
|
+
# create an OTP instance.
|
135
|
+
# +passphrase+ length must be >= 10 and <= 63.
|
136
|
+
# +passphrase+ must only contains pure ascii characters (7 bits).
|
137
|
+
# +seed+ should only contains alpha-numeric characters.
|
138
|
+
# +algo_str+ can be "md4" or "md5" (default).
|
139
|
+
def initialize(seq_num, seed, passphrase, algo_str = 'md5')
|
140
|
+
raise ArgumentError, 'passphrase must be from 10 to 63 characters long' unless (10..63).include?(passphrase.size)
|
141
|
+
|
142
|
+
passphrase.each_byte do |b|
|
143
|
+
raise ArgumentError, 'passphrase contains non-ASCII characters' if b > 127
|
144
|
+
end
|
145
|
+
|
146
|
+
if seed !~ /^\w+$/
|
147
|
+
raise ArgumentError, "seed contains non alpha-numeric characters"
|
148
|
+
end
|
149
|
+
|
150
|
+
@hash = seed+passphrase
|
151
|
+
|
152
|
+
algo = ALGO_MAP[algo_str]
|
153
|
+
|
154
|
+
(seq_num+1).times do
|
155
|
+
regs = algo.digest(@hash).unpack("V4")
|
156
|
+
ac = regs[0] ^ regs[2]
|
157
|
+
bd = regs[1] ^ regs[3]
|
158
|
+
@hash = [ac, bd].pack("V2")
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
# return integer for this OTP
|
163
|
+
def to_i
|
164
|
+
(0...8).inject(0) do |sum, i|
|
165
|
+
sum <<= 8
|
166
|
+
sum |= (@hash[i] & 0xff)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
# return words sentence for this OTP
|
171
|
+
def to_s
|
172
|
+
parity = 0
|
173
|
+
wi = tmplong = to_i
|
174
|
+
sentence = ""
|
175
|
+
|
176
|
+
32.times do |i|
|
177
|
+
parity += tmplong & 3
|
178
|
+
tmplong >>= 2
|
179
|
+
end
|
180
|
+
|
181
|
+
4.downto(0) do |i|
|
182
|
+
sentence << WORDS[ ((wi >> (i * 11 + 9)) & 0x7ff)] + " "
|
183
|
+
end
|
184
|
+
|
185
|
+
sentence << WORDS[ ((wi << 2) & 0x7fc) | (parity & 3) ]
|
186
|
+
sentence
|
187
|
+
end
|
188
|
+
end
|
data/test/fixtures.yml
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
---
|
2
|
+
md4:
|
3
|
+
- seq_num: 377
|
4
|
+
seed: fs9332
|
5
|
+
sentence: COCK BAIT BIAS DOLL CURB ROOD
|
6
|
+
passphrase: this is a pass
|
7
|
+
- seq_num: 232
|
8
|
+
seed: fs9332
|
9
|
+
sentence: FACE WYNN HONE SEC SITE OAF
|
10
|
+
passphrase: aqsdf234qsdf ,;:,sqdfp")q
|
11
|
+
- seq_num: 330
|
12
|
+
seed: fs9332
|
13
|
+
sentence: ROAD SIN THE RUN FUME DO
|
14
|
+
passphrase: eeazqsd123123123
|
15
|
+
- seq_num: 218
|
16
|
+
seed: fs9332
|
17
|
+
sentence: HAIL BAG LEEK SLUG RUDE HEAL
|
18
|
+
passphrase: sqdklmfvxcwvBU(/ysdfqsdf$
|
19
|
+
md5:
|
20
|
+
- seq_num: 299
|
21
|
+
seed: fs9332
|
22
|
+
sentence: SAND FIRE HESS FLEW GALE AVER
|
23
|
+
passphrase: this is a pass
|
24
|
+
- seq_num: 108
|
25
|
+
seed: fs9332
|
26
|
+
sentence: CITY BUSY PHI CEIL HAUL RUSS
|
27
|
+
passphrase: aqsdf234qsdf ,;:,sqdfp")q
|
28
|
+
- seq_num: 483
|
29
|
+
seed: fs9332
|
30
|
+
sentence: RUG EYE FEAT AM DOLL MILK
|
31
|
+
passphrase: eeazqsd123123123
|
32
|
+
- seq_num: 192
|
33
|
+
seed: fs9332
|
34
|
+
sentence: BUNK SLOG SAYS SKIT ALTO WU
|
35
|
+
passphrase: sqdklmfvxcwvBU(/ysdfqsdf$
|
@@ -0,0 +1,23 @@
|
|
1
|
+
$:.unshift(File.dirname($0)+"/../lib")
|
2
|
+
require "otp"
|
3
|
+
|
4
|
+
require "test/unit"
|
5
|
+
require "yaml"
|
6
|
+
|
7
|
+
class OTPTest < Test::Unit::TestCase
|
8
|
+
def test_all
|
9
|
+
fixtures = YAML::load_file(File.dirname(__FILE__)+"/fixtures.yml")
|
10
|
+
fixtures.each do |algo, expected_otps|
|
11
|
+
expected_otps.each do |expected_otp|
|
12
|
+
otp = OTP.new(expected_otp["seq_num"], expected_otp["seed"], expected_otp["passphrase"], algo)
|
13
|
+
assert_equal expected_otp["sentence"], otp.to_s
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_generate_seed
|
19
|
+
10.times do
|
20
|
+
assert_match(/^[a-z]{2}\d{4}$/, OTP.generate_seed)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruby-otp
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "0.1"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Guillaume Pierronnet
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-03-15 00:00:00 +01:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: hoe
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.5.1
|
23
|
+
version:
|
24
|
+
description: ruby-otp is a One Time Password library, compatible with OPIE and S/KEY, and RFC 1760 compliant.
|
25
|
+
email: moumar@rubyforge.org
|
26
|
+
executables: []
|
27
|
+
|
28
|
+
extensions: []
|
29
|
+
|
30
|
+
extra_rdoc_files:
|
31
|
+
- History.txt
|
32
|
+
- Manifest.txt
|
33
|
+
- README.txt
|
34
|
+
files:
|
35
|
+
- History.txt
|
36
|
+
- Manifest.txt
|
37
|
+
- README.txt
|
38
|
+
- Rakefile
|
39
|
+
- lib/otp.rb
|
40
|
+
- test/fixtures.yml
|
41
|
+
- test/test_ruby-otp.rb
|
42
|
+
has_rdoc: true
|
43
|
+
homepage: |
|
44
|
+
by Guillaume Pierronnet
|
45
|
+
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options:
|
48
|
+
- --main
|
49
|
+
- README.txt
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: "0"
|
57
|
+
version:
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: "0"
|
63
|
+
version:
|
64
|
+
requirements: []
|
65
|
+
|
66
|
+
rubyforge_project: ruby-otp
|
67
|
+
rubygems_version: 1.0.1
|
68
|
+
signing_key:
|
69
|
+
specification_version: 2
|
70
|
+
summary: ruby-otp is a One Time Password library, compatible with OPIE and S/KEY, and RFC 1760 compliant.
|
71
|
+
test_files:
|
72
|
+
- test/test_ruby-otp.rb
|