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