const assert = require('nanoassert')

module.exports = {
  crypto_verify_16,
  crypto_verify_32,
  sodium_memcmp,
  sodium_is_zero
}

function vn (x, xi, y, yi, n) {
  var i, d = 0
  for (i = 0; i < n; i++) d |= x[xi + i] ^ y[yi + i]
  return (1 & ((d - 1) >>> 8)) - 1
}

function crypto_verify_16(x, xi, y, yi) {
  return vn(x, xi, y, yi, 16)
}

function crypto_verify_32(x, xi, y, yi) {
  return vn(x, xi, y, yi, 32)
}

function sodium_memcmp (a, b) {
  assert(a.byteLength === b.byteLength, 'buffers must be the same size')

  return vn(a, 0, b, 0, a.byteLength) === 0
}

function sodium_is_zero (arr) {
  var d = 0
  for (let i = 0; i < arr.length; i++) d |= arr[i]
  return d === 0
}
