YubiRuby 1.0.0 → 1.1.0
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.
- checksums.yaml +7 -0
- data/.hgignore +30 -0
- data/.hgtags +4 -0
- data/.rspec +2 -0
- data/CHANGELOG +3 -1
- data/Gemfile +4 -0
- data/LICENSE +1 -1
- data/README.developer.txt +17 -0
- data/README.md +43 -0
- data/Rakefile +64 -50
- data/YubiRuby.gemspec +31 -45
- data/bin/modhex +1 -1
- data/bin/yubikey +1 -1
- data/ext/libyubikey/libyubikey.c +14 -14
- data/ext/libyubikey/ykaes.c +101 -1
- data/ext/libyubikey/ykcrc.c +3 -3
- data/ext/libyubikey/ykhex.c +3 -5
- data/ext/libyubikey/ykmodhex.c +3 -5
- data/ext/libyubikey/ykparse.c +115 -9
- data/ext/libyubikey/yktoken.c +52 -0
- data/ext/libyubikey/yubikey.h +23 -8
- data/lib/fake_yubikey.rb +51 -55
- data/lib/hex.rb +10 -29
- data/lib/version.rb +3 -0
- data/lib/yubiruby.rb +2 -2
- data/test/fake_yubikey_spec.rb +1 -1
- data/test/hex_spec.rb +1 -1
- data/test/modhex_spec.rb +2 -2
- data/test/yubiruby_spec.rb +7 -0
- metadata +144 -143
- data/Manifest +0 -29
- data/README +0 -44
data/lib/fake_yubikey.rb
CHANGED
@@ -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 '
|
31
|
-
require '
|
30
|
+
require 'securerandom'
|
31
|
+
require 'openssl'
|
32
32
|
require 'bit-struct'
|
33
33
|
|
34
|
-
# 1-complement is uses to
|
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
|
-
|
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
|
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 =
|
181
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
79
|
-
|
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
|
#
|
data/lib/version.rb
ADDED
data/lib/yubiruby.rb
CHANGED
data/test/fake_yubikey_spec.rb
CHANGED
data/test/hex_spec.rb
CHANGED
data/test/modhex_spec.rb
CHANGED
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
|
-
|
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
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
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
|
-
|
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
|
-
|
41
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
61
|
-
requirements:
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
62
52
|
- - ">="
|
63
|
-
- !ruby/object:Gem::Version
|
64
|
-
|
65
|
-
|
66
|
-
|
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
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
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
|
-
-
|
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
|
-
-
|
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
|
-
|
164
|
-
- --inline-source
|
165
|
-
- --title
|
166
|
-
- YubiRuby
|
167
|
-
- --main
|
168
|
-
- README
|
169
|
-
require_paths:
|
166
|
+
rdoc_options: []
|
167
|
+
require_paths:
|
170
168
|
- lib
|
171
|
-
|
172
|
-
|
173
|
-
requirements:
|
169
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
174
171
|
- - ">="
|
175
|
-
- !ruby/object:Gem::Version
|
176
|
-
|
177
|
-
|
178
|
-
|
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
|
-
|
184
|
-
- 1
|
185
|
-
- 2
|
186
|
-
version: "1.2"
|
177
|
+
- !ruby/object:Gem::Version
|
178
|
+
version: '0'
|
187
179
|
requirements: []
|
188
|
-
|
189
|
-
|
190
|
-
rubygems_version: 1.3.6
|
180
|
+
rubyforge_project:
|
181
|
+
rubygems_version: 2.2.2
|
191
182
|
signing_key:
|
192
|
-
specification_version:
|
193
|
-
summary:
|
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:
|