diff options
-rw-r--r-- | lib/srp/authentication.rb | 68 | ||||
-rw-r--r-- | lib/srp/session.rb | 14 | ||||
-rw-r--r-- | test/auth_test.rb | 18 |
3 files changed, 15 insertions, 85 deletions
diff --git a/lib/srp/authentication.rb b/lib/srp/authentication.rb deleted file mode 100644 index c87fe1d..0000000 --- a/lib/srp/authentication.rb +++ /dev/null @@ -1,68 +0,0 @@ -require File.expand_path(File.dirname(__FILE__) + '/util') - -module SRP - module Authentication - - include Util - - class Session - include Util - attr_accessor :aa, :bb - - def initialize(aa, verifier) - @aa = aa - @b = bigrand(32).hex - # B = g^b + k v (mod N) - @bb = (modpow(GENERATOR, @b) + multiplier * verifier) % BIG_PRIME_N - end - - def u - @u ||= calculate_u - end - - # do not cache this - it's secret and someone might store the - # session in a CookieStore - def secret(verifier) - base = (modpow(verifier, u) * aa) % BIG_PRIME_N - modpow(base, @b) - end - - def m1(verifier) - calculate_m(secret(verifier)) - end - - def m2(m1, verifier) - sha256_int(@aa, m1, secret(verifier)).hex - end - - protected - def calculate_u - sha256_int(@aa, @bb).hex - end - - def calculate_m(s) - sha256_int(@aa, @bb, s).hex - end - - end - - def initialize_auth(aa) - return Session.new(aa, verifier) - end - - def authenticate!(m, session) - authenticate(m, session) || raise(SRP::WrongPassword) - end - - def authenticate(m, session) - if(m == session.m1(verifier)) - return session.m2(m, verifier) - end - end - - - end - -end - - diff --git a/lib/srp/session.rb b/lib/srp/session.rb index b61058b..367f5e2 100644 --- a/lib/srp/session.rb +++ b/lib/srp/session.rb @@ -27,7 +27,7 @@ module SRP def authenticate(m) if(m == calculate_m(server_secret)) - return m2 + return calculate_m2(m, server_secret) end end @@ -63,20 +63,16 @@ module SRP modpow(base, @b) end - def m1 - calculate_m(server_secret) - end - - def m2 - sha256_int(@aa, m1, server_secret).hex - end - # this is outdated - SRP 6a uses # M = H(H(N) xor H(g), H(I), s, A, B, K) def calculate_m(s) sha256_int(@aa, @bb, s).hex end + def calculate_m2(m, secret) + sha256_int(@aa, m, secret).hex + end + def calculate_u sha256_int(@aa, @bb).hex end diff --git a/test/auth_test.rb b/test/auth_test.rb index c1bffd0..24bc42f 100644 --- a/test/auth_test.rb +++ b/test/auth_test.rb @@ -1,23 +1,25 @@ require File.expand_path(File.dirname(__FILE__) + '/test_helper') -class User +# single user test server. +# You obviously want sth. different for real life. +class Server - include SRP::Authentication + attr_accessor :salt, :verifier, :username - attr_accessor :salt, :verifier - - def initialize(salt, verifier) + def initialize(salt, verifier, username) @salt = salt @verifier = verifier + @username = username end def handshake(login, aa) - @session = initialize_auth(aa) + # this can be serialized and needs to be persisted between requests + @session = SRP::Session.new(self, aa) return @session.bb end def validate(m) - authenticate(m, @session) + @session.authenticate(m) end end @@ -28,7 +30,7 @@ class AuthTest < Test::Unit::TestCase @username = 'user' @password = 'opensesami' @client = SRP::Client.new(@username, @password) - @server = User.new(@client.salt, @client.verifier) + @server = Server.new(@client.salt, @client.verifier, @username) end def test_successful_auth |