adopted srp algo to srp-js way of doing things.
[ruby_srp.git] / lib / srp / client.rb
1 require File.expand_path(File.dirname(__FILE__) + '/util')
2
3 module SRP
4   class Client
5
6     include Util
7
8     attr_reader :salt, :verifier
9
10     def initialize(username, password)
11       @username = username
12       @password = password
13       @salt = "5d3055e0acd3ddcfc15".hex # bigrand(10).hex
14       puts "salt = %i" %@salt
15       @multiplier = multiplier # let's cache it
16       calculate_verifier
17     end
18
19     def authenticate(server, username, password)
20       x = calculate_x(username, password, salt)
21       a = bigrand(32).hex
22       aa = modpow(GENERATOR, a, PRIME_N) # A = g^a (mod N)
23       bb, u = server.initialize_auth(aa)
24       client_s = calculate_client_s(x, a, bb, u)
25       server.authenticate(aa, calculate_m(aa,bb,client_s))
26     end
27
28     protected
29     def calculate_verifier
30       x = calculate_x(@username, @password, @salt)
31       puts "x = %i" % x
32       @verifier = modpow(GENERATOR, x, PRIME_N)
33       puts "verifier = %i" % @verifier
34       @verifier
35     end
36
37     def calculate_x(username, password, salt)
38       shex = '%x' % [salt]
39       spad = "" # if shex.length.odd? then '0' else '' end
40       sha256_str(spad + shex + sha256_str([username, password].join(':'))).hex
41     end
42
43     def calculate_client_s(x, a, bb, u)
44       base = bb
45       base += PRIME_N * @multiplier
46       base -= modpow(GENERATOR, x, PRIME_N) * @multiplier
47       base = base % PRIME_N
48       modpow(base, x * u + a, PRIME_N)
49     end
50   end
51 end
52