class CryptoToolchain::BlackBoxes::DSAKeypair

Attributes

g[R]
p[R]
q[R]
safe[R]

Public Class Methods

new(p: DSA_P, q: DSA_Q, g: DSA_G, private_key: nil, dangerous: false) click to toggle source
# File lib/crypto_toolchain/black_boxes/dsa_keypair.rb, line 4
def initialize(p: DSA_P, q: DSA_Q, g: DSA_G, private_key: nil, dangerous: false)
  @p = p
  @q = q
  @g = g
  @private_key = numberize(private_key) unless private_key.nil?
  @safe = !dangerous
end

Public Instance Methods

private_key() click to toggle source
# File lib/crypto_toolchain/black_boxes/dsa_keypair.rb, line 41
def private_key
  @private_key ||= rand(1..DSA_Q)
end
public_key() click to toggle source
# File lib/crypto_toolchain/black_boxes/dsa_keypair.rb, line 45
def public_key
  @public_key ||= g.modpow(private_key, p)
end
sign(m, k: nil) click to toggle source
# File lib/crypto_toolchain/black_boxes/dsa_keypair.rb, line 14
def sign(m, k: nil)
  r = s = 0
  k ||= rand(2...q)
  loop do
    r = g.modpow(k, p) % q
    next if safe && r == 0
    digest = CryptoToolchain::Utilities::SHA1.digest(m).to_number
    s = k.modinv(q) * ( digest + (private_key * r)) % q
    next if safe && s == 0
    return [r.to_bin_string, s.to_bin_string]
  end
end
verify(m, r: , s: , public_key: self.public_key) click to toggle source
# File lib/crypto_toolchain/black_boxes/dsa_keypair.rb, line 27
def verify(m, r: , s: , public_key: self.public_key)
  s = s.to_number
  r = r.to_number
  if safe && !(0 < r && r < q) && (0 < s && s < q)
    return false
  end
  w = s.invmod(q)
  u_1 = (CryptoToolchain::Utilities::SHA1.digest(m).to_number * w) % q
  u_2 = (r * w) % q
  # a*b % n = [(a % n) * (b % n)] % m
  v = ((g.modpow(u_1, p) * public_key.modpow(u_2, p)) % p) % q
  v == r
end