#!/usr/bin/ruby

#####################################
#
# Marcin Woźniak
# s434812
#
#####################################

require 'socket'

load 'modul1.rb'

sock = TCPSocket.new("localhost",3000)
puts sock.gets


starting = Process.clock_gettime(Process::CLOCK_MONOTONIC)

# Generate public and priv key
def generateKeys
  p = 0
  q = 0

  pThread = Thread.new {
  while true
   p = generate(4072)
   if primalityTest(p)
    break
   end
  end
  }

  qThread = Thread.new {
  while true
    q = generate(4072)
    if primalityTest(q)
      break
    end
  end
  }

  pThread.join
  qThread.join

  n = p * q
  phi = (p-1)*(q-1)

  while true
    e = SecureRandom.random_number(0..phi)
    d = reciprocal_Phi_p(e,phi)
    if nwd(e,phi) == 1 && d > 1
      return [n,e,d]
    end
  end
end

keys = generateKeys
n = keys[0]
e = keys[1]
d = keys[2]
puts "d: " + d.inspect

pubKey = [n,e]
privKey = [n,d]

puts
puts "privKey " + privKey.inspect
puts "pubKey " + pubKey.inspect
puts

# Sending pubKey
sock.puts pubKey[0]
sock.puts pubKey[1]

# Getting cipher
cipher = sock.gets.gsub(/\n$/, '')
message = betterExponentiation(cipher.to_i,d.to_i,n.to_i)

puts "Cipher: " + cipher.inspect
puts "Message: " + message.inspect

# Close socket
sock.close

ending = Process.clock_gettime(Process::CLOCK_MONOTONIC)
elapsed = ending - starting
puts "Time " + elapsed.inspect
