var test = require('tape')
var crypto = require('diffie-hellman/browser')

test('diffie-hellman mod groups', function (t) {
  [
    'modp1', 'modp2', 'modp5', 'modp14', 'modp15', 'modp16'
  ].forEach(function (mod) {
    t.test(mod, function (t) {
      t.plan(3)
      var dh1 = crypto.getDiffieHellman(mod)
      var p1 = dh1.getPrime().toString('hex')
      dh1.generateKeys()
      var dh2 = crypto.getDiffieHellman(mod)
      var p2 = dh2.getPrime().toString('hex')
      dh2.generateKeys()
      t.equals(p1, p2, 'equal primes')
      var pubk1 = dh1.getPublicKey()
      var pubk2 = dh2.getPublicKey()
      t.notEquals(pubk1, pubk2, 'diff public keys')
      var pub1 = dh1.computeSecret(pubk2).toString('hex')
      var pub2 = dh2.computeSecret(dh1.getPublicKey()).toString('hex')
      t.equals(pub1, pub2, 'equal secrets')
    })
  })
})

test('diffie-hellman key lengths', function (t) {
  [
    64, 65, 192
  ].forEach(function (len) {
    t.test('' + len, function (t) {
      t.plan(3)
      var dh2 = crypto.createDiffieHellman(len)
      var prime2 = dh2.getPrime()
      var p2 = prime2.toString('hex')
      var dh1 = crypto.createDiffieHellman(prime2)
      var p1 = dh1.getPrime().toString('hex')
      dh1.generateKeys()
      dh2.generateKeys()
      t.equals(p1, p2, 'equal primes')
      var pubk1 = dh1.getPublicKey()
      var pubk2 = dh2.getPublicKey()
      t.notEquals(pubk1, pubk2, 'diff public keys')
      var pub1 = dh1.computeSecret(pubk2).toString('hex')
      var pub2 = dh2.computeSecret(dh1.getPublicKey()).toString('hex')
      t.equals(pub1, pub2, 'equal secrets')
    })
  })
})
