diff options
Diffstat (limited to 'tests/helpers/srp_helper.rb')
-rw-r--r-- | tests/helpers/srp_helper.rb | 171 |
1 files changed, 0 insertions, 171 deletions
diff --git a/tests/helpers/srp_helper.rb b/tests/helpers/srp_helper.rb deleted file mode 100644 index b30fa768..00000000 --- a/tests/helpers/srp_helper.rb +++ /dev/null @@ -1,171 +0,0 @@ -# -# Here are some very stripped down helper methods for SRP, useful only for -# testing the client side. -# - -require 'digest' -require 'openssl' -require 'securerandom' -require 'base64' - -module SRP - - ## - ## UTIL - ## - - module Util - PRIME_N = <<-EOS.split.join.hex -115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3 - EOS - BIG_PRIME_N = <<-EOS.split.join.hex # 1024 bits modulus (N) -eeaf0ab9adb38dd69c33f80afa8fc5e86072618775ff3c0b9ea2314c9c25657 -6d674df7496ea81d3383b4813d692c6e0e0d5d8e250b98be48e495c1d6089da -d15dc7d7b46154d6b6ce8ef4ad69b15d4982559b297bcf1885c529f566660e5 -7ec68edbc3c05726cc02fd4cbf4976eaa9afd5138fe8376435b9fc61d2fc0eb -06e3 - EOS - GENERATOR = 2 # g - - def hn_xor_hg - byte_xor_hex(sha256_int(BIG_PRIME_N), sha256_int(GENERATOR)) - end - - # a^n (mod m) - def modpow(a, n, m = BIG_PRIME_N) - r = 1 - while true - r = r * a % m if n[0] == 1 - n >>= 1 - return r if n == 0 - a = a * a % m - end - end - - # Hashes the (long) int args - def sha256_int(*args) - sha256_hex(*args.map{|a| "%02x" % a}) - end - - # Hashes the hex args - def sha256_hex(*args) - h = args.map{|a| a.length.odd? ? "0#{a}" : a }.join('') - sha256_str([h].pack('H*')) - end - - def sha256_str(s) - Digest::SHA2.hexdigest(s) - end - - def bigrand(bytes) - OpenSSL::Random.random_bytes(bytes).unpack("H*")[0] - end - - def multiplier - @muliplier ||= calculate_multiplier - end - - protected - - def calculate_multiplier - sha256_int(BIG_PRIME_N, GENERATOR).hex - end - - def byte_xor_hex(a, b) - a = [a].pack('H*') - b = [b].pack('H*') - a.bytes.each_with_index.map do |a_byte, i| - (a_byte ^ (b[i].ord || 0)).chr - end.join - end - end - - ## - ## SESSION - ## - - class Session - include SRP::Util - attr_accessor :user - attr_accessor :bb - - def initialize(user, aa=nil) - @user = user - @a = bigrand(32).hex - end - - def m - @m ||= sha256_hex(n_xor_g_long, login_hash, @user.salt.to_s(16), aa, bb, k) - end - - def aa - @aa ||= modpow(GENERATOR, @a).to_s(16) # A = g^a (mod N) - end - - protected - - # client: K = H( (B - kg^x) ^ (a + ux) ) - def client_secret - base = bb.hex - base -= modpow(GENERATOR, @user.private_key) * multiplier - base = base % BIG_PRIME_N - modpow(base, @user.private_key * u.hex + @a) - end - - def k - @k ||= sha256_int(client_secret) - end - - def n_xor_g_long - @n_xor_g_long ||= hn_xor_hg.bytes.map{|b| "%02x" % b.ord}.join - end - - def login_hash - @login_hash ||= sha256_str(@user.username) - end - - def u - @u ||= sha256_hex(aa, bb) - end - end - - ## - ## Dummy USER - ## - - class User - include SRP::Util - - attr_accessor :username, :password, :salt, :verifier, :id, :session_token, :ok, :deleted - - def initialize(username=nil) - @username = username || "tmp_user_" + SecureRandom.urlsafe_base64(10).downcase.gsub(/[_-]/, '') - @password = "password_" + SecureRandom.urlsafe_base64(10) - @salt = bigrand(4).hex - @verifier = modpow(GENERATOR, private_key) - @ok = false - @deleted = false - end - - def private_key - @private_key ||= calculate_private_key - end - - def to_params - { - 'user[login]' => @username, - 'user[password_verifier]' => @verifier.to_s(16), - 'user[password_salt]' => @salt.to_s(16) - } - end - - private - - def calculate_private_key - shex = '%x' % [@salt] - inner = sha256_str([@username, @password].join(':')) - sha256_hex(shex, inner).hex - end - end - -end |