YubiRuby 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -27,11 +27,11 @@
27
27
  # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
28
  # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
29
 
30
- require 'rubygems'
31
- require 'ruby-aes'
30
+ require 'securerandom'
31
+ require 'openssl'
32
32
  require 'bit-struct'
33
33
 
34
- # 1-complement is uses to computer crc field
34
+ # 1-complement is uses to compute crc field
35
35
  #
36
36
  #
37
37
  class Numeric
@@ -44,90 +44,85 @@ module YubiRuby
44
44
  #
45
45
  # This class simulate a yubikey allowing you to make some tests
46
46
  #
47
- class FakeYubikey
47
+ class FakeYubikey
48
48
  # Maximum allowed length for a modhex encoded public id
49
49
  PUBLIC_ID_MAX_LEN = 32
50
-
51
- #
52
- # Yubikey internal data
50
+
51
+ #
52
+ # Yubikey internal data
53
53
  #
54
54
  class Data < BitStruct
55
55
  YUBIKEY_BLOCK_SIZE = 16
56
56
  YUBIKEY_KEY_SIZE = 16
57
57
  YUBIKEY_UID_SIZE = 6
58
58
  SESSION_COUNTER_OVERFLOW = 0x7FFF
59
-
59
+
60
60
  hex_octets :uid, YUBIKEY_UID_SIZE*8, "User ID"
61
- unsigned :session_counter, 16, {:endian=>:little, :display_name=>"Session Counter"}
61
+ unsigned :session_counter, 16, {:endian=>:little, :display_name=>"Session Counter"}
62
62
  unsigned :timestamp_low, 16, {:endian=>:little, :display_name=>"Timestamp low"}
63
63
  unsigned :timestamp_high, 8, "Timestamp high"
64
64
  unsigned :session_use, 8, "Session Use"
65
65
  unsigned :random, 16, {:endian=>:little, :display_name=>"random"}
66
66
  unsigned :crc, 16, {:endian=>:little, :display_name=>"crc"}
67
-
67
+
68
68
  end
69
69
 
70
70
  attr_accessor :key
71
- #attr_reader :public_id
72
-
71
+ attr_reader :public_id, :data
72
+
73
73
  def initialize
74
74
  @public_id = ""
75
75
  @data = YubiRuby::FakeYubikey::Data.new
76
76
  @data.session_counter = 0
77
77
  init
78
78
  end
79
-
80
- #
81
- # Sets the public id of the key.
82
- #
79
+
80
+ #
81
+ # Sets the public id of the key.
82
+ #
83
83
  # public_id must be a modhex valid string no longer than
84
84
  # 32 char, if longer it will be truncated.
85
85
  #
86
- # @param [String, #read] value the new public_id
86
+ # @param [String, #read] value the new public_id
87
87
  # @return [String] the new public_id
88
88
  def public_id=(value)
89
89
  raise NoModHexEncodedError unless value.modhex?
90
-
90
+
91
91
  value = value[0, PUBLIC_ID_MAX_LEN] if value.length > PUBLIC_ID_MAX_LEN
92
92
  raise NoModHexEncodedError unless value.modhex?
93
-
93
+
94
94
  @public_id = value
95
95
  end
96
-
97
- # Returns the value of attribute public_id.
98
- def public_id
99
- @public_id
100
- end
101
-
96
+
102
97
  # Simaluates the power on sequence of a YubuKey.
103
- #
98
+ #
104
99
  # This will increase session_counter
105
100
  def init
106
101
  @data.session_counter += 1
107
102
  if (@data.session_counter == Data::SESSION_COUNTER_OVERFLOW+1)
108
- raise YubikeySessionCounterOverflow.new
103
+ raise YubikeySessionCounterOverflow.new
109
104
  end
110
105
  @data.session_use = 0
111
106
  @data.timestamp_low = rand(2**16)
112
107
  @data.timestamp_high = rand(2**8)
113
108
  end
114
-
109
+
115
110
  %w{session_use timestamp_low timestamp_high session_counter random crc}.each do |name|
116
- define_method name do
111
+ define_method name do
117
112
  @data.send name
118
113
  end
119
114
  end
120
-
115
+
121
116
  # Generates a random key attribute
122
117
  def set_random_key
123
118
  @key = produce_random_bytes_in_hex Data::YUBIKEY_KEY_SIZE
124
119
  end
125
-
120
+
126
121
  # Generates a random uid attribute
127
122
  def set_random_uid
128
123
  self.uid= produce_random_bytes_in_hex(Data::YUBIKEY_UID_SIZE)
129
124
  end
130
-
125
+
131
126
  # Sets the attribute uid
132
127
  def uid=(value)
133
128
  if YubiRuby::HEX.decode(value).size == Data::YUBIKEY_UID_SIZE
@@ -136,13 +131,13 @@ module YubiRuby
136
131
  raise NoHexEncodedError.new
137
132
  end
138
133
  end
139
-
134
+
140
135
  # Returns the value of attribute uid.
141
136
  def uid
142
137
  @data.uid.gsub(':','')
143
138
  end
144
-
145
- # Simulates the pression of the yubikey's button
139
+
140
+ # Simulates the pressing of the yubikey's button
146
141
  #
147
142
  # session_use will increase and if it overflows also
148
143
  # session_counter will be increased
@@ -152,12 +147,12 @@ module YubiRuby
152
147
  @data.session_counter +=1 if @data.session_use == 0
153
148
  generate_otp
154
149
  end
155
-
150
+
156
151
  def to_s
157
152
  @data.to_s
158
153
  end
159
-
160
- def self.generate_specific_otp_and_fake_yubikey(key, uid, session_counter,
154
+
155
+ def self.generate_specific_otp_and_fake_yubikey(key, uid, session_counter,
161
156
  timestamp_low, timestamp_high, session_use, random)
162
157
  y_key = FakeYubikey.new
163
158
  y_key.key = key
@@ -169,26 +164,29 @@ module YubiRuby
169
164
  y_key.data.random = random
170
165
  [y_key.generate_otp, y_key]
171
166
  end
172
-
173
- def data
174
- @data
175
- end
176
-
167
+
177
168
  # Generates an OTP without altering any internal data.
178
169
  def generate_otp
170
+ @cipher = OpenSSL::Cipher.new( "AES-128-ECB" ) unless @cipher
171
+ @cipher.encrypt
172
+ @cipher.key = YubiRuby::HEX.decode( @key )
173
+
179
174
  @data.crc = YubiRuby::CRC16.calculate(@data.to_s[0...-2]).ones_complement 16
180
- data = Aes.encrypt_block(128, 'ECB', YubiRuby::HEX.decode(@key), nil,
181
- @data.to_s).modhex_encode
175
+ data = @cipher.update( @data.to_s ).modhex_encode
176
+
182
177
  "#{@public_id}#{data}"
178
+
179
+ ensure
180
+ @cipher.reset
183
181
  end
184
-
185
- #serialization support
182
+
183
+ #serialization support
186
184
  def marshal_dump
187
185
  {'key' => key, 'uid' => uid, 'session_counter' => @data.session_counter,
188
186
  'public_id' => public_id }
189
187
  end
190
-
191
- #serialization support
188
+
189
+ #serialization support
192
190
  def marshal_load(data)
193
191
  @data = YubiRuby::FakeYubikey::Data.new
194
192
  self.key = data['key']
@@ -197,13 +195,11 @@ module YubiRuby
197
195
  self.public_id = data['public_id']
198
196
  init
199
197
  end
200
-
201
-
198
+
199
+
202
200
  private
203
201
  def produce_random_bytes_in_hex(size)
204
- tmp = " "*size
205
- 0.upto(size-1) { |i| tmp[i] = rand(2**8)}
206
- YubiRuby::HEX.encode(tmp)
202
+ YubiRuby::HEX.encode( SecureRandom.random_bytes(size) )
207
203
  end
208
204
  end
209
- end
205
+ end
data/lib/hex.rb CHANGED
@@ -39,26 +39,16 @@ module YubiRuby
39
39
  # "foo bar".hex_encode #=> "666f6f20626172"
40
40
  # "666f6f20626172".hex_decode #=> "foo bar"
41
41
  module HEX
42
-
42
+
43
43
  # call-seq:
44
44
  # YubiRuby::HEX.encode("string") -> "hex string"
45
45
  #
46
46
  # Encodes <tt>obj.to_str</tt> into an <tt>hex string</tt>.
47
47
  #
48
48
  def self.encode( obj )
49
- s = obj.to_str
50
- s.unpack('U'*s.length).collect {|x| tmp = x.to_s 16; tmp.length == 1 ? "0#{tmp}" : tmp }.join
51
- rescue ArgumentError
52
- #non UTF-8 string
53
- s = obj.to_str
54
- out = []
55
- 0.upto(s.length-1) do |i|
56
- tmp = s[i].to_s 16
57
- out << (tmp.length == 1 ? "0#{tmp}" : tmp )
58
- end
59
- out.join
49
+ return obj.unpack( 'H*' ).first
60
50
  end
61
-
51
+
62
52
  # call-seq:
63
53
  # hex_encode -> "hex string"
64
54
  #
@@ -66,26 +56,17 @@ module YubiRuby
66
56
  def hex_encode
67
57
  HEX.encode(self)
68
58
  end
69
-
59
+
70
60
  # call-seq:
71
- # YubiRuby::HEX.decode("hex string") -> "string"
61
+ # YubiRuby::HEX.decode("hex string") -> "string"
72
62
  #
73
63
  # Decodes <tt>obj.to_str</tt> into a <tt>string</tt>.
74
64
  #
75
- # An <tt>hex string</tt> length must be pair, if not a
76
- # NoHexEncodedError excpetion is raised
77
65
  def self.decode( obj )
78
- s = obj.to_str
79
- dec = ""
80
- if hex?(s)
81
- (s.length/2).times { |i| dec << s[i*2,2].hex.chr }
82
- else
83
- raise NoHexEncodedError.new
84
- end
85
-
86
- return dec
66
+ raise NoHexEncodedError unless self.hex?( obj )
67
+ return obj.to_s.scan(/[[:xdigit:]]{2}/).map{|h| h.hex.chr }.join
87
68
  end
88
-
69
+
89
70
  # call-seq:
90
71
  # hex_decode -> "string"
91
72
  #
@@ -93,7 +74,7 @@ module YubiRuby
93
74
  def hex_decode
94
75
  HEX.decode(self)
95
76
  end
96
-
77
+
97
78
  # call-seq:
98
79
  # YubiRuby::HEX.hex?("hex string") -> true or false
99
80
  #
@@ -105,7 +86,7 @@ module YubiRuby
105
86
  return false unless (s.length % 2 == 0)
106
87
  return (s.upcase =~ /[^A-F0-9]/).nil?
107
88
  end
108
-
89
+
109
90
  # call-seq:
110
91
  # hex? -> true or false
111
92
  #
@@ -0,0 +1,3 @@
1
+ module YubiRuby
2
+ VERSION = "1.1.0"
3
+ end
@@ -34,5 +34,5 @@ require 'fake_yubikey'
34
34
 
35
35
  module YubiRuby
36
36
  # C code version
37
- LIBYUBIKEY_VERSION = '1.5'
38
- end
37
+ LIBYUBIKEY_VERSION = '1.11'
38
+ end
@@ -1,4 +1,4 @@
1
- require 'test/path_loader'
1
+ require_relative 'path_loader'
2
2
 
3
3
  describe 'YubiRuby::FakeYubikey' do
4
4
  @@UID = 'ffa4f1fa55e0'
@@ -1,4 +1,4 @@
1
- require 'test/path_loader'
1
+ require_relative 'path_loader'
2
2
 
3
3
  describe 'YubiRuby::HEX' do
4
4
  describe '#encode' do
@@ -1,4 +1,4 @@
1
- require 'test/path_loader'
1
+ require_relative 'path_loader'
2
2
 
3
3
  describe 'YubiRuby::ModHex' do
4
4
 
@@ -78,4 +78,4 @@ describe 'String' do
78
78
  str.modhex_encode
79
79
  end
80
80
  end
81
- end
81
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'path_loader'
2
+
3
+ describe YubiRuby do
4
+ it 'has a version number' do
5
+ expect(YubiRuby::VERSION).not_to be nil
6
+ end
7
+ end
metadata CHANGED
@@ -1,134 +1,136 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: YubiRuby
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 1
7
- - 0
8
- - 0
9
- version: 1.0.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
10
5
  platform: ruby
11
- authors:
6
+ authors:
12
7
  - Alessio Caiazza
13
8
  autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
-
17
- date: 2010-03-21 00:00:00 +01:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: ruby-aes-normal
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ~>
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 1
29
- - 0
30
- version: "1.0"
31
- type: :runtime
32
- version_requirements: *id001
33
- - !ruby/object:Gem::Dependency
34
- name: bit-struct
11
+ date: 2014-07-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
35
21
  prerelease: false
36
- requirement: &id002 !ruby/object:Gem::Requirement
37
- requirements:
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
38
31
  - - ">="
39
- - !ruby/object:Gem::Version
40
- segments:
41
- - 0
42
- version: "0"
43
- type: :runtime
44
- version_requirements: *id002
45
- - !ruby/object:Gem::Dependency
46
- name: yard
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
47
35
  prerelease: false
48
- requirement: &id003 !ruby/object:Gem::Requirement
49
- requirements:
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake-compiler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
50
45
  - - ">="
51
- - !ruby/object:Gem::Version
52
- segments:
53
- - 0
54
- version: "0"
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
55
48
  type: :development
56
- version_requirements: *id003
57
- - !ruby/object:Gem::Dependency
58
- name: rspec
59
49
  prerelease: false
60
- requirement: &id004 !ruby/object:Gem::Requirement
61
- requirements:
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
62
52
  - - ">="
63
- - !ruby/object:Gem::Version
64
- segments:
65
- - 0
66
- version: "0"
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2'
67
62
  type: :development
68
- version_requirements: *id004
69
- description: |
70
- Yubikey integration -
71
-
72
- Includes Prototypes for low-level Yubikey OTP functions
73
- witten by Simon Josefsson <simon@josefsson.org>.
74
- Copyright (c) 2006, 2007, 2008, 2009 Yubico AB
75
- All rights reserved.
76
-
77
- Redistribution and use in source and binary forms, with or without
78
- modification, are permitted provided that the following conditions are
79
- met:
80
-
81
- * Redistributions of source code must retain the above copyright
82
- notice, this list of conditions and the following disclaimer.
83
-
84
- * Redistributions in binary form must reproduce the above
85
- copyright notice, this list of conditions and the following
86
- disclaimer in the documentation and/or other materials provided
87
- with the distribution.
88
-
89
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
90
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
91
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
92
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
93
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
94
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
95
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
96
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
97
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
98
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
99
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
100
-
101
- email: nolith@abisso.org
102
- executables:
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: yard
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.8'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.8'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bit-struct
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.15'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.15'
97
+ description: "Yubikey integration - \n\nIncludes Prototypes for low-level Yubikey
98
+ OTP functions \nwitten by Simon Josefsson <simon@josefsson.org>.\nCopyright (c)
99
+ 2006, 2007, 2008, 2009 Yubico AB\nAll rights reserved.\n\nRedistribution and use
100
+ in source and binary forms, with or without\nmodification, are permitted provided
101
+ that the following conditions are\nmet:\n\n * Redistributions of source code must
102
+ retain the above copyright\n notice, this list of conditions and the following
103
+ disclaimer.\n\n * Redistributions in binary form must reproduce the above\n copyright
104
+ notice, this list of conditions and the following\n disclaimer in the documentation
105
+ and/or other materials provided\n with the distribution.\n\nTHIS SOFTWARE IS
106
+ PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR
107
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
108
+ AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER
109
+ OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY,
110
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE
111
+ GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
112
+ CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
113
+ TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF
114
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
115
+ email:
116
+ - nolith@abisso.org
117
+ executables:
103
118
  - modhex
104
119
  - yubikey
105
- extensions:
120
+ extensions:
106
121
  - ext/libyubikey/extconf.rb
107
- extra_rdoc_files:
122
+ extra_rdoc_files: []
123
+ files:
124
+ - ".hgignore"
125
+ - ".hgtags"
126
+ - ".rspec"
108
127
  - CHANGELOG
128
+ - Gemfile
109
129
  - LICENSE
110
- - README
111
- - bin/modhex
112
- - bin/yubikey
113
- - ext/libyubikey/extconf.rb
114
- - ext/libyubikey/libyubikey.c
115
- - ext/libyubikey/ykaes.c
116
- - ext/libyubikey/ykcrc.c
117
- - ext/libyubikey/ykhex.c
118
- - ext/libyubikey/ykmodhex.c
119
- - ext/libyubikey/ykparse.c
120
- - ext/libyubikey/yubikey.h
121
- - lib/exceptions.rb
122
- - lib/fake_yubikey.rb
123
- - lib/hex.rb
124
- - lib/yubiruby.rb
125
- - tasks/yard_doc.rake
126
- files:
127
- - CHANGELOG
128
- - LICENSE
129
- - Manifest
130
- - README
130
+ - README.developer.txt
131
+ - README.md
131
132
  - Rakefile
133
+ - YubiRuby.gemspec
132
134
  - bin/modhex
133
135
  - bin/yubikey
134
136
  - ext/libyubikey/extconf.rb
@@ -138,10 +140,12 @@ files:
138
140
  - ext/libyubikey/ykhex.c
139
141
  - ext/libyubikey/ykmodhex.c
140
142
  - ext/libyubikey/ykparse.c
143
+ - ext/libyubikey/yktoken.c
141
144
  - ext/libyubikey/yubikey.h
142
145
  - lib/exceptions.rb
143
146
  - lib/fake_yubikey.rb
144
147
  - lib/hex.rb
148
+ - lib/version.rb
145
149
  - lib/yubiruby.rb
146
150
  - tasks/yard_doc.rake
147
151
  - test/fake_yubikey_spec.rb
@@ -153,43 +157,40 @@ files:
153
157
  - test/tc_hex.rb
154
158
  - test/tc_modhex.rb
155
159
  - test/test_helper.rb
156
- - YubiRuby.gemspec
157
- has_rdoc: true
160
+ - test/yubiruby_spec.rb
158
161
  homepage: http://bitbucket.org/nolith/yubiruby
159
- licenses: []
160
-
162
+ licenses:
163
+ - AS IS
164
+ metadata: {}
161
165
  post_install_message:
162
- rdoc_options:
163
- - --line-numbers
164
- - --inline-source
165
- - --title
166
- - YubiRuby
167
- - --main
168
- - README
169
- require_paths:
166
+ rdoc_options: []
167
+ require_paths:
170
168
  - lib
171
- - ext
172
- required_ruby_version: !ruby/object:Gem::Requirement
173
- requirements:
169
+ required_ruby_version: !ruby/object:Gem::Requirement
170
+ requirements:
174
171
  - - ">="
175
- - !ruby/object:Gem::Version
176
- segments:
177
- - 0
178
- version: "0"
179
- required_rubygems_version: !ruby/object:Gem::Requirement
180
- requirements:
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ required_rubygems_version: !ruby/object:Gem::Requirement
175
+ requirements:
181
176
  - - ">="
182
- - !ruby/object:Gem::Version
183
- segments:
184
- - 1
185
- - 2
186
- version: "1.2"
177
+ - !ruby/object:Gem::Version
178
+ version: '0'
187
179
  requirements: []
188
-
189
- rubyforge_project: yubiruby
190
- rubygems_version: 1.3.6
180
+ rubyforge_project:
181
+ rubygems_version: 2.2.2
191
182
  signing_key:
192
- specification_version: 3
193
- summary: "Yubikey integration - Includes Prototypes for low-level Yubikey OTP functions witten by Simon Josefsson <simon@josefsson.org>. Copyright (c) 2006, 2007, 2008, 2009 Yubico AB All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
194
- test_files:
183
+ specification_version: 4
184
+ summary: Yubico Server wrapper in Ruby
185
+ test_files:
186
+ - test/fake_yubikey_spec.rb
187
+ - test/hex_spec.rb
188
+ - test/modhex_spec.rb
189
+ - test/path_loader.rb
190
+ - test/tc_crc16.rb
191
+ - test/tc_fake_yubikey.rb
192
+ - test/tc_hex.rb
193
+ - test/tc_modhex.rb
195
194
  - test/test_helper.rb
195
+ - test/yubiruby_spec.rb
196
+ has_rdoc: