SRP::Authentication::Session holds the per session data
authorAzul <azul@leap.se>
Thu, 26 Jul 2012 09:33:29 +0000 (11:33 +0200)
committerAzul <azul@leap.se>
Thu, 26 Jul 2012 09:33:29 +0000 (11:33 +0200)
lib/srp/authentication.rb
lib/srp/client.rb

index f4b2e70..96f68fe 100644 (file)
@@ -5,21 +5,49 @@ module SRP
 
     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, PRIME_N) + multiplier * verifier) % PRIME_N
+        @verifier = verifier
+      end
+
+      def u
+        calculate_u(aa, bb, PRIME_N)
+      end
+
+      def secret
+        @s ||= calculate_secret
+      end
+
+      def m1
+        calculate_m(aa, bb, secret)
+      end
+
+      def m2
+        calculate_m(aa, m1, secret)
+      end
+
+      protected
+
+      def calculate_secret
+        base = (modpow(@verifier, u, PRIME_N) * aa) % PRIME_N
+        modpow(base, @b, PRIME_N)
+      end
+    end
 
     def initialize_auth(aa)
-      @aa = aa
-      @b = bigrand(32).hex
-      # B = g^b + k v (mod N)
-      @bb = (modpow(GENERATOR, @b, PRIME_N) + multiplier * verifier) % PRIME_N
-      return @bb
+      return Session.new(aa, verifier)
     end
 
-    def authenticate(m)
-      u = calculate_u(@aa, @bb, PRIME_N)
-      base = (modpow(verifier, u, PRIME_N) * @aa) % PRIME_N
-      server_s = modpow(base, @b, PRIME_N)
-      if(m == calculate_m(@aa, @bb, server_s))
-        return calculate_m(@aa, m, server_s)
+    def authenticate(m, session)
+      if(m == session.m1)
+        return session.m2
       end
     end
 
index 1be2461..667d5ba 100644 (file)
@@ -19,10 +19,10 @@ module SRP
       x = calculate_x(username, password, salt)
       a = bigrand(32).hex
       aa = modpow(GENERATOR, a, PRIME_N) # A = g^a (mod N)
-      bb = server.initialize_auth(aa)
-      u = calculate_u(aa, bb, PRIME_N)
-      client_s = calculate_client_s(x, a, bb, u)
-      server.authenticate(calculate_m(aa,bb,client_s))
+      session = server.initialize_auth(aa)
+      u = calculate_u(aa, session.bb, PRIME_N)
+      client_s = calculate_client_s(x, a, session.bb, u)
+      server.authenticate(calculate_m(aa,session.bb,client_s), session)
     end
 
     protected