ruby-otp 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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