ruby_home-srp 1.1.1 → 1.2.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 +4 -4
- data/lib/ruby_home-srp.rb +65 -3
- data/lib/ruby_home-srp/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c2765c12b81526b0ac2b75ecb5a9fb72dc8eb9eacd15f202eae42b48173b7626
|
4
|
+
data.tar.gz: 1ce14f917cfb48914bf3672c86daf6f7eea433008818405acadc943dd68251ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6928695e8eddf92efce441554245f9fc434cd44da83225c25fa0c041ae87020acc14a375726094c9e746eb165a5994be68f991291efbab1e21171810aa0f6e1e
|
7
|
+
data.tar.gz: 345af332b94174d2fc10f16700be59a2d6a407dd8c53d49841efd862499d6150659ff0b09ad463e5614b1fb6f6d6a4064bbf0120d7b27eaffe875bf886db46e2
|
data/lib/ruby_home-srp.rb
CHANGED
@@ -26,7 +26,7 @@ module RubyHome
|
|
26
26
|
next unless s
|
27
27
|
shex = s.class == String ? s : '%x' % s
|
28
28
|
if shex.length > nlen
|
29
|
-
|
29
|
+
raise 'Bit width does not match - client uses different prime'
|
30
30
|
end
|
31
31
|
'0' * (nlen - shex.length) + shex
|
32
32
|
}.join('')
|
@@ -97,7 +97,7 @@ module RubyHome
|
|
97
97
|
|
98
98
|
class Verifier < ::SRP::Verifier
|
99
99
|
attr_reader :u
|
100
|
-
attr_writer :salt
|
100
|
+
attr_writer :salt, :b
|
101
101
|
|
102
102
|
def initialize group=3072
|
103
103
|
# select modulus (N) and generator (g)
|
@@ -173,7 +173,69 @@ module RubyHome
|
|
173
173
|
def generate_B xverifier
|
174
174
|
v = xverifier.to_i(16)
|
175
175
|
@b ||= random_bignum
|
176
|
-
@B = '%x' % SRP.calc_B(@b, k, v, @N, @g.hex)
|
176
|
+
@B = '%x' % SRP.calc_B(@b, @k, v, @N, @g.hex)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
class Client < ::SRP::Client
|
181
|
+
attr_writer :a
|
182
|
+
|
183
|
+
def initialize group=3072
|
184
|
+
# select modulus (N) and generator (g)
|
185
|
+
@N, @g = SRP.Ng group
|
186
|
+
@k = SRP.calc_k(@N, @g)
|
187
|
+
end
|
188
|
+
|
189
|
+
# Phase 1 : Step 1 : Start the authentication process by generating the
|
190
|
+
# client 'a' and 'A' values. Public 'A' should later be sent along with
|
191
|
+
# the username, to the server verifier to continue the auth process. The
|
192
|
+
# internal secret 'a' value should remain private.
|
193
|
+
#
|
194
|
+
# @return [String] the value of 'A' in hex
|
195
|
+
def start_authentication
|
196
|
+
@a ||= SecureRandom.hex(32).hex
|
197
|
+
@A = "%x" % SRP.calc_A(@a, @N, @g.hex)
|
198
|
+
end
|
199
|
+
|
200
|
+
# Phase 2 : Step 1 : Process the salt and B values provided by the server.
|
201
|
+
#
|
202
|
+
# @param username [String] the client provided authentication username
|
203
|
+
# @param password [String] the client provided authentication password
|
204
|
+
# @param xsalt [String] the server provided salt for the username in hex
|
205
|
+
# @param xbb [String] the server verifier 'B' value in hex
|
206
|
+
# @return [String] the client 'M' value in hex
|
207
|
+
def process_challenge(username, password, xsalt, xbb)
|
208
|
+
raise ArgumentError, 'username must be a string' unless username.is_a?(String) && !username.empty?
|
209
|
+
raise ArgumentError, 'password must be a string' unless password.is_a?(String) && !password.empty?
|
210
|
+
raise ArgumentError, 'xsalt must be a string' unless xsalt.is_a?(String)
|
211
|
+
raise ArgumentError, 'xsalt must be a hex string' unless xsalt =~ /^[a-fA-F0-9]+$/
|
212
|
+
raise ArgumentError, 'xbb must be a string' unless xbb.is_a?(String)
|
213
|
+
raise ArgumentError, 'xbb must be a hex string' unless xbb =~ /^[a-fA-F0-9]+$/
|
214
|
+
|
215
|
+
# Convert the 'B' hex value to an Integer
|
216
|
+
bb = xbb.to_i(16)
|
217
|
+
|
218
|
+
# SRP-6a safety check
|
219
|
+
return false if (bb % @N).zero?
|
220
|
+
|
221
|
+
x = SRP.calc_x(username, password, xsalt)
|
222
|
+
u = SRP.calc_u(@A, xbb, @N)
|
223
|
+
|
224
|
+
# SRP-6a safety check
|
225
|
+
return false if u.zero?
|
226
|
+
|
227
|
+
# Calculate session key 'S' and secret key 'K'
|
228
|
+
@S = '%x' % SRP.calc_client_S(bb, @a, @k, x, u, @N, @g.hex)
|
229
|
+
@K = SRP.sha512_hex(@S)
|
230
|
+
|
231
|
+
# Calculate the 'M' matcher
|
232
|
+
@M = SRP.calc_M(username, xsalt, @A, xbb, @K, @N, @g)
|
233
|
+
|
234
|
+
# Calculate the H(A,M,K) verifier
|
235
|
+
@H_AMK = '%x' % SRP.calc_H_AMK(@A, '%x' % @M, @K, @N, @g)
|
236
|
+
|
237
|
+
# Return the 'M' matcher to be sent to the server
|
238
|
+
'%x' % @M
|
177
239
|
end
|
178
240
|
end
|
179
241
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_home-srp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karl Entwistle
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: srp-rb
|