/* eslint-disable camelcase */
const test = require('brittle')
const sodium = require('..')

test('crypto_kdf_keygen', function (t) {
  const key = Buffer.alloc(sodium.crypto_kdf_KEYBYTES)

  t.exception.all(function () {
    sodium.crypto_kdf_keygen(Buffer.alloc(1))
  })

  sodium.crypto_kdf_keygen(key)

  t.not(key, Buffer.alloc(key.length))
})

test('crypto_kdf_derive_from_key', function (t) {
  const key = Buffer.alloc(sodium.crypto_kdf_KEYBYTES)

  sodium.crypto_kdf_keygen(key)

  const subkey = Buffer.alloc(sodium.crypto_kdf_BYTES_MIN)

  sodium.crypto_kdf_derive_from_key(subkey, 0, Buffer.from('context_'), key)
  t.not(subkey, Buffer.alloc(subkey.length))

  const subkey2 = Buffer.alloc(sodium.crypto_kdf_BYTES_MIN)

  sodium.crypto_kdf_derive_from_key(subkey2, 1, Buffer.from('context_'), key)
  t.not(subkey, subkey2)

  sodium.crypto_kdf_derive_from_key(subkey2, 0, Buffer.from('context_'), key)
  t.alike(subkey, subkey2)
})

test('test vectors', function (assert) {
  const fixtures = require('./fixtures/crypto_kdf.json')

  for (let i = 0; i < fixtures.length; i++) {
    const key = Buffer.from(fixtures[i].key, 'hex')
    const subkeyLen = fixtures[i].subkey_len
    const id = fixtures[i].id
    const context = Buffer.from(fixtures[i].context, 'hex')

    const shouldError = fixtures[i].error

    const actual = Buffer.alloc(subkeyLen)

    try {
      sodium.crypto_kdf_derive_from_key(actual, id, context, key)
      const expected = Buffer.from(fixtures[i].subkey, 'hex')
      if (Buffer.compare(actual, expected) !== 0) {
        assert.fail('Failed on fixture #' + i)
      }
    } catch (ex) {
      if (shouldError === false) assert.fail('Failed on fixture #' + i)
    }
  }

  assert.pass('Passed all fixtures')
  assert.end()
})

test('constants', function (t) {
  t.ok(sodium.crypto_kdf_PRIMITIVE)
  t.ok(sodium.crypto_kdf_BYTES_MAX > 0)
  t.ok(sodium.crypto_kdf_BYTES_MIN <= sodium.crypto_kdf_BYTES_MAX)
  t.ok(sodium.crypto_kdf_CONTEXTBYTES > 0)
  t.ok(sodium.crypto_kdf_KEYBYTES >= 16)
  t.end()
})
