package diffiehellman

import (
	"math/big"
	"math/rand"
	"time"
)

// Random number generator
var rnd = rand.New(rand.NewSource(time.Now().UnixNano()))

// PrivateKey generates a number greater than 1 and less than p
func PrivateKey(p *big.Int) *big.Int {
	ret := &big.Int{}
	return ret.Add(big.NewInt(2), ret.Rand(rnd, ret.Sub(p, big.NewInt(2))))
}

// PublicKey generates the public key for private key p
func PublicKey(pKey, p *big.Int, g int64) *big.Int {
	ret := big.NewInt(g)
	return ret.Exp(ret, pKey, p)
}

// NewPair generates a public/private key pair from given primes p & g
func NewPair(p *big.Int, g int64) (*big.Int, *big.Int) {
	priv := PrivateKey(p)
	return priv, PublicKey(priv, p, g)
}

// SecretKey returns a secret key given private & public keys and the prime p
func SecretKey(priv, pub, p *big.Int) *big.Int {
	ret := &big.Int{}
	return ret.Exp(pub, priv, p)
}
