summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAzul <azul@riseup.net>2013-07-14 14:22:31 +0200
committerAzul <azul@riseup.net>2013-07-14 14:22:31 +0200
commite4a577e45f36b3ed93d85fc466ae13217cca955c (patch)
treea99d9e926327cb01549a8ad0d5ef7ff62f53e004
parentd508b7eb1f372f8c8175cc16e7669435d1fe995f (diff)
store aa, bb and u as hex by default
-rw-r--r--lib/srp/session.rb27
-rw-r--r--test/session_test.rb2
2 files changed, 16 insertions, 13 deletions
diff --git a/lib/srp/session.rb b/lib/srp/session.rb
index 30ff15e..53d9a33 100644
--- a/lib/srp/session.rb
+++ b/lib/srp/session.rb
@@ -8,7 +8,7 @@ module SRP
# aa: SRPs A ephemeral value. encoded as a hex string.
def initialize(user, aa=nil)
@user = user
- aa ? initialize_server(aa.hex) : initialize_client
+ aa ? initialize_server(aa) : initialize_client
end
# client -> server: I, A = g^a
@@ -36,7 +36,7 @@ module SRP
if @authenticated
{ :M2 => m2 }
else
- { :B => bb.to_s(16),
+ { :B => bb,
# :b => @b.to_s(16), # only use for debugging
:salt => @user.salt.to_s(16)
}
@@ -53,8 +53,8 @@ module SRP
username: @user.username,
salt: @user.salt.to_s(16),
verifier: @user.verifier.to_s(16),
- aa: aa.to_s(16),
- bb: bb.to_s(16),
+ aa: aa,
+ bb: bb,
s: secret.to_s(16),
k: k,
m: m,
@@ -63,16 +63,19 @@ module SRP
end
def aa
- @aa ||= modpow(GENERATOR, @a) # A = g^a (mod N)
+ @aa ||= modpow(GENERATOR, @a).to_s(16) # A = g^a (mod N)
end
# B = g^b + k v (mod N)
def bb
- @bb ||= (modpow(GENERATOR, @b) + multiplier * @user.verifier) % BIG_PRIME_N
+ @bb ||= calculate_bb.to_s(16)
end
protected
+ def calculate_bb
+ (modpow(GENERATOR, @b) + multiplier * @user.verifier) % BIG_PRIME_N
+ end
# only seed b for testing purposes.
def initialize_server(aa, ephemeral = nil)
@@ -92,29 +95,29 @@ module SRP
# client: K = H( (B - kg^x) ^ (a + ux) )
def client_secret
- base = bb
+ base = bb.hex
# base += BIG_PRIME_N * @multiplier
base -= modpow(GENERATOR, @user.private_key) * multiplier
base = base % BIG_PRIME_N
- modpow(base, @user.private_key * u + @a)
+ modpow(base, @user.private_key * u.hex + @a)
end
# server: K = H( (Av^u) ^ b )
# do not cache this - it's secret and someone might store the
# session in a CookieStore
def server_secret
- base = (modpow(@user.verifier, u) * aa) % BIG_PRIME_N
+ base = (modpow(@user.verifier, u.hex) * aa.hex) % BIG_PRIME_N
modpow(base, @b)
end
# SRP 6a uses
# M = H(H(N) xor H(g), H(I), s, A, B, K)
def m
- @m ||= sha256_hex(n_xor_g_long, login_hash, @user.salt.to_s(16), aa.to_s(16), bb.to_s(16), k)
+ @m ||= sha256_hex(n_xor_g_long, login_hash, @user.salt.to_s(16), aa, bb, k)
end
def m2
- @m2 ||= sha256_hex(aa.to_s(16), m, k)
+ @m2 ||= sha256_hex(aa, m, k)
end
def k
@@ -130,7 +133,7 @@ module SRP
end
def u
- @u ||= sha256_int(aa, bb).hex
+ @u ||= sha256_hex(aa, bb)
end
end
diff --git a/test/session_test.rb b/test/session_test.rb
index 41d66b3..6864de7 100644
--- a/test/session_test.rb
+++ b/test/session_test.rb
@@ -54,7 +54,7 @@ class SessionTest < Test::Unit::TestCase
b = data[:b].hex
session = SRP::Session.new(client, aa)
# seed b to compare to py_srp
- session.send(:initialize_server, aa.hex, b)
+ session.send(:initialize_server, aa, b)
session
end