ruby-otp 0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,3 @@
1
+ === 0.1 / 2008-03-14
2
+
3
+ * first release
@@ -0,0 +1,7 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ lib/otp.rb
6
+ test/fixtures.yml
7
+ test/test_ruby-otp.rb
@@ -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
@@ -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
@@ -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
@@ -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