Class: RubyHome::SRP::Verifier
- Inherits:
-
SRP::Verifier
- Object
- SRP::Verifier
- RubyHome::SRP::Verifier
- Defined in:
- lib/ruby_home-srp.rb
Instance Attribute Summary collapse
-
#b ⇒ Object
writeonly
Sets the attribute b.
-
#salt ⇒ Object
writeonly
Sets the attribute salt.
-
#u ⇒ Object
readonly
Returns the value of attribute u.
Instance Method Summary collapse
-
#generate_B(xverifier) ⇒ Object
generates challenge input verifier in hex.
-
#generate_userauth(username, password) ⇒ Object
Initial user creation for the persistance layer.
-
#get_challenge_and_proof(username, xverifier, xsalt) ⇒ Object
Authentication phase 1 - create challenge.
-
#initialize(group = 3072) ⇒ Verifier
constructor
A new instance of Verifier.
- #random_bignum ⇒ Object
- #random_salt ⇒ Object
-
#verify_session(proof, client_M) ⇒ Object
returns H_AMK on success, None on failure User -> Host: M = H(H(N) xor H(g), H(I), s, A, B, K) Host -> User: H(A, M, K).
Constructor Details
Instance Attribute Details
#b=(value) ⇒ Object (writeonly)
Sets the attribute b
100 101 102 |
# File 'lib/ruby_home-srp.rb', line 100 def b=(value) @b = value end |
#salt=(value) ⇒ Object (writeonly)
Sets the attribute salt
100 101 102 |
# File 'lib/ruby_home-srp.rb', line 100 def salt=(value) @salt = value end |
#u ⇒ Object (readonly)
Returns the value of attribute u.
99 100 101 |
# File 'lib/ruby_home-srp.rb', line 99 def u @u end |
Instance Method Details
#generate_B(xverifier) ⇒ Object
generates challenge input verifier in hex
173 174 175 176 177 |
# File 'lib/ruby_home-srp.rb', line 173 def generate_B xverifier v = xverifier.to_i(16) @b ||= random_bignum @B = '%x' % SRP.calc_B(@b, @k, v, @N, @g.hex) end |
#generate_userauth(username, password) ⇒ Object
Initial user creation for the persistance layer. Not part of the authentication process. Returns { <username>, <password verifier>, <salt> }
111 112 113 114 115 116 |
# File 'lib/ruby_home-srp.rb', line 111 def generate_userauth username, password @salt ||= random_salt x = SRP.calc_x(username, password, @salt) v = SRP.calc_v(x, @N, @g.hex) return {:username => username, :verifier => '%x' % v, :salt => @salt} end |
#get_challenge_and_proof(username, xverifier, xsalt) ⇒ Object
Authentication phase 1 - create challenge. Returns Hash with challenge for client and proof to be stored on server. Parameters should be given in hex.
121 122 123 124 125 126 127 |
# File 'lib/ruby_home-srp.rb', line 121 def get_challenge_and_proof username, xverifier, xsalt generate_B(xverifier) return { :challenge => {:B => @B, :salt => xsalt}, :proof => {:B => @B, :b => '%x' % @b, :I => username, :s => xsalt, :v => xverifier} } end |
#random_bignum ⇒ Object
163 164 165 |
# File 'lib/ruby_home-srp.rb', line 163 def random_bignum SecureRandom.hex(32).hex end |
#random_salt ⇒ Object
159 160 161 |
# File 'lib/ruby_home-srp.rb', line 159 def random_salt SecureRandom.hex(16) end |
#verify_session(proof, client_M) ⇒ Object
returns H_AMK on success, None on failure User -> Host: M = H(H(N) xor H(g), H(I), s, A, B, K) Host -> User: H(A, M, K)
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
# File 'lib/ruby_home-srp.rb', line 132 def verify_session proof, client_M @A = proof[:A] @B = proof[:B] @b = proof[:b].to_i(16) username = proof[:I] xsalt = proof[:s] v = proof[:v].to_i(16) @u = SRP.calc_u(@A, @B, @N) # SRP-6a safety check return false if @u == 0 # calculate session key @S = '%x' % SRP.calc_server_S(@A.to_i(16), @b, v, @u, @N) @K = SRP.sha512_hex(@S) # calculate match @M = '%x' % SRP.calc_M(username, xsalt, @A, @B, @K, @N, @g) if @M == client_M # authentication succeeded @H_AMK = '%x' % SRP.calc_H_AMK(@A, @M, @K, @N, @g) return @H_AMK end return false end |