initial commit - testing srp auth
[ruby_srp.git] / lib / srp / util.rb
1 require 'digest'
2 require 'openssl'
3
4 module SRP
5   module Util
6
7     # constants both sides know
8     PRIME_N = <<-EOS.split.join.hex # 1024 bits modulus (N)
9 eeaf0ab9adb38dd69c33f80afa8fc5e86072618775ff3c0b9ea2314c9c25657
10 6d674df7496ea81d3383b4813d692c6e0e0d5d8e250b98be48e495c1d6089da
11 d15dc7d7b46154d6b6ce8ef4ad69b15d4982559b297bcf1885c529f566660e5
12 7ec68edbc3c05726cc02fd4cbf4976eaa9afd5138fe8376435b9fc61d2fc0eb
13 06e3
14     EOS
15     GENERATOR = 2 # g
16
17     # a^n (mod m)
18     def modpow(a, n, m)
19       r = 1
20       while true
21         r = r * a % m if n[0] == 1
22         n >>= 1
23         return r if n == 0
24         a = a * a % m
25       end
26     end
27
28     def sha1_hex(h)
29       Digest::SHA1.hexdigest([h].pack('H*'))
30     end
31
32     def sha1_str(s)
33       Digest::SHA1.hexdigest(s)
34     end
35
36     def bigrand(bytes)
37       OpenSSL::Random.random_bytes(bytes).unpack("H*")[0]
38     end
39
40     def multiplier
41       n = PRIME_N
42       g = GENERATOR
43       nhex = '%x' % [n]
44       nlen = nhex.length + (nhex.length.odd? ? 1 : 0 )
45       ghex = '%x' % [g]
46       hashin = '0' * (nlen - nhex.length) + nhex \
47         + '0' * (nlen - ghex.length) + ghex
48       sha1_hex(hashin).hex % n
49     end
50   end
51
52 end
53