Class: RubyHome::SRP::Verifier

Inherits:
SRP::Verifier
  • Object
show all
Defined in:
lib/ruby_home-srp.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(group = 3072) ⇒ Verifier

Returns a new instance of Verifier.



102
103
104
105
106
# File 'lib/ruby_home-srp.rb', line 102

def initialize group=3072
  # select modulus (N) and generator (g)
  @N, @g = SRP.Ng group
  @k = SRP.calc_k(@N, @g)
end

Instance Attribute Details

#b=(value) ⇒ Object (writeonly)

Sets the attribute b

Parameters:

  • value

    the value to set the attribute b to.



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

Parameters:

  • value

    the value to set the attribute salt to.



100
101
102
# File 'lib/ruby_home-srp.rb', line 100

def salt=(value)
  @salt = value
end

#uObject (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_bignumObject



163
164
165
# File 'lib/ruby_home-srp.rb', line 163

def random_bignum
  SecureRandom.hex(32).hex
end

#random_saltObject



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