module RbNaCl::SelfTest

def box_common_test(box)

def box_common_test(box)
  nonce      = vector :box_nonce
  message    = vector :box_message
  ciphertext = vector :box_ciphertext
  raise SelfTestFailure, "failed to generate correct ciphertext" unless box.encrypt(nonce, message) == ciphertext
  raise SelfTestFailure, "failed to decrypt ciphertext correctly" unless box.decrypt(nonce, ciphertext) == message
  begin
    passed         = false
    corrupt_ct     = ciphertext.dup
    corrupt_ct[23] = " "
    box.decrypt(nonce, corrupt_ct)
  rescue CryptoError
    passed = true
  ensure
    passed || raise(SelfTestFailure, "failed to detect corrupt ciphertext")
  end
end

def box_test

def box_test
  alicepk = RbNaCl::PublicKey.new(vector(:alice_public))
  bobsk = RbNaCl::PrivateKey.new(vector(:bob_private))
  box = RbNaCl::Box.new(alicepk, bobsk)
  box_common_test(box)
end

def digital_signature_test

def digital_signature_test
  signing_key = SigningKey.new(vector(:sign_private))
  verify_key  = signing_key.verify_key
  unless verify_key.to_s == vector(:sign_public)
    # :nocov:
    raise SelfTestFailure, "failed to generate verify key correctly"
    # :nocov:
  end
  message   = vector :sign_message
  signature = signing_key.sign(message)
  unless signature == vector(:sign_signature)
    # :nocov:
    raise SelfTestFailure, "failed to generate correct signature"
    # :nocov:
  end
  unless verify_key.verify(signature, message)
    # :nocov:
    raise SelfTestFailure, "failed to verify a valid signature"
    # :nocov:
  end
  begin
    passed = false
    bad_signature = signature[0, 63] + "0"
    verify_key.verify(bad_signature, message)
  rescue CryptoError
    passed = true
  ensure
    passed || raise(SelfTestFailure, "failed to detect corrupt ciphertext")
  end
end

def hmac_test(klass, tag)

def hmac_test(klass, tag)
  authenticator = klass.new(vector("auth_key_#{klass.key_bytes}".to_sym))
  message = vector :auth_message
  raise SelfTestFailure, "#{klass} generated incorrect authentication tag" unless authenticator.auth(message) == vector(tag)
  raise SelfTestFailure, "#{klass} failed to verify authentication tag" unless authenticator.verify(vector(tag), message)
  begin
    passed = false
    authenticator.verify(vector(tag), message + " ")
  rescue CryptoError
    passed = true
  ensure
    passed || raise(SelfTestFailure, "failed to detect corrupt ciphertext")
  end
end

def secret_box_test

def secret_box_test
  box = SecretBox.new(vector(:secret_key))
  box_common_test(box)
end

def sha256_test

def sha256_test
  message = vector :sha256_message
  digest  = vector :sha256_digest
  raise SelfTestFailure, "failed to generate a correct SHA256 digest" unless RbNaCl::Hash.sha256(message) == digest
end

def vector(name)

def vector(name)
  [TEST_VECTORS[name]].pack("H*")
end