initial commit - testing srp auth
[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 = bigrand(10).hex
14       @multiplier = multiplier # let's cache it
15       calculate_verifier
16     end
17
18     def authenticate(server, username, password)
19       x = calculate_x(username, password, salt)
20       a = bigrand(32).hex
21       aa = modpow(GENERATOR, a, PRIME_N) # A = g^a (mod N)
22       bb, u = server.initialize_auth(aa)
23       client_s = calculate_client_s(x, a, bb, u)
24       server.authenticate(aa, client_s)
25     end
26
27     protected
28     def calculate_verifier
29       x = calculate_x(@username, @password, @salt)
30       @verifier = modpow(GENERATOR, x, PRIME_N)
31     end
32
33     def calculate_x(username, password, salt)
34       shex = '%x' % [salt]
35       spad = if shex.length.odd? then '0' else '' end
36       sha1_hex(spad + shex + sha1_str([username, password].join(':'))).hex
37     end
38
39     def calculate_client_s(x, a, bb, u)
40       base = bb
41       base += PRIME_N * @multiplier
42       base -= modpow(GENERATOR, x, PRIME_N) * @multiplier
43       base = base % PRIME_N
44       modpow(base, x * u + a, PRIME_N)
45     end
46   end
47 end
48