adopted srp algo to srp-js way of doing things.
[ruby_srp.git] / lib / srp / server.rb
1 require File.expand_path(File.dirname(__FILE__) + '/util')
2
3 module SRP
4   class Server
5
6     include Util
7
8     def initialize(salt, verifier)
9       @salt = salt
10       @verifier = verifier
11     end
12
13     def initialize_auth(aa)
14       @aa = aa
15       @b = bigrand(32).hex
16       # B = g^b + k v (mod N)
17       @bb = (modpow(GENERATOR, @b, PRIME_N) + multiplier * @verifier) % PRIME_N
18       u = calculate_u(@aa, @bb, PRIME_N)
19       return @bb, u
20     end
21
22     def authenticate(m)
23       u = calculate_u(@aa, @bb, PRIME_N)
24       base = (modpow(@verifier, u, PRIME_N) * @aa) % PRIME_N
25       server_s = modpow(base, @b, PRIME_N)
26       if(m == calculate_m(@aa, @bb, server_s))
27         puts "A = %x" % [@aa]
28         puts "M = %x" % [m]
29         puts "s = %x" % [server_s]
30         return calculate_m(@aa, m, server_s)
31       end
32     end
33
34
35     protected
36
37     def calculate_u(aa, bb, n)
38       nlen = 2 * ((('%x' % [n]).length * 4 + 7) >> 3)
39       aahex = '%x' % [aa]
40       bbhex = '%x' % [bb]
41       return sha256_str("%x%x" % [aa, bb]).hex
42       hashin = '0' * (nlen - aahex.length) + aahex \
43         + '0' * (nlen - bbhex.length) + bbhex
44       sha256_str(hashin).hex
45     end
46
47   end
48 end
49
50