class Cinch::SASL::DiffieHellman
Attributes
e[R]
g[R]
p[R]
q[R]
x[R]
Public Class Methods
new(p, g, q)
click to toggle source
# File lib/cinch/sasl/diffie_hellman.rb, line 6 def initialize(p, g, q) @p = p @g = g @q = q end
Public Instance Methods
generate(tries = 16)
click to toggle source
# File lib/cinch/sasl/diffie_hellman.rb, line 12 def generate(tries = 16) tries.times do @x = rand(@q) @e = mod_exp(@g, @x, @p) return @e if valid? end raise ArgumentError, "can't generate valid e" end
secret(f)
click to toggle source
compute the shared secret, given the public key
# File lib/cinch/sasl/diffie_hellman.rb, line 22 def secret(f) mod_exp(f, @x, @p) end
Private Instance Methods
bits_set(e)
click to toggle source
# File lib/cinch/sasl/diffie_hellman.rb, line 32 def bits_set(e) ("%b" % e).count('1') end
mod_exp(b, e, m)
click to toggle source
# File lib/cinch/sasl/diffie_hellman.rb, line 36 def mod_exp(b, e, m) result = 1 while e > 0 result = (result * b) % m if e[0] == 1 e = e >> 1 b = (b * b) % m end return result end
valid?()
click to toggle source
validate a public key
# File lib/cinch/sasl/diffie_hellman.rb, line 28 def valid? @e && @e.between?(2, @p - 2) && bits_set(@e) > 1 end