# Tests

# Add the binary tree directory to the search path for linking and include files
link_directories (${PROJECT_BINARY_DIR}/src)
include_directories (${CMAKE_CURRENT_BINARY_DIR} ${PROJECT_BINARY_DIR}/include )

#define macro to simplify adding tests
macro (do_test arg result)
  add_test (${arg} ${TARGET_SYSTEM_EMULATOR} ${arg}${CMAKE_EXECUTABLE_SUFFIX})
  set_tests_properties (${arg}
    PROPERTIES PASS_REGULAR_EXPRESSION ${result}
    )
endmacro ()

# smoke tests  
add_executable (test_rsa test_rsa.c)
add_executable (test_ecc test_ecc.c)
add_executable (test_version test_version.c)
add_executable (test_big_consistency test_big_consistency.c)
add_executable (test_octet_consistency test_octet_consistency.c)
# Link the executable to the libraries
target_link_libraries (test_rsa amcl_rsa) 
target_link_libraries (test_ecc amcl_ecc) 
target_link_libraries (test_version amcl_curve) 
target_link_libraries (test_octet_consistency amcl_core)
target_link_libraries (test_big_consistency amcl_curve)
# run tests
do_test (test_rsa "SUCCESS")
do_test (test_ecc "SUCCESS")
do_test (test_version "Version: ${AMCL_VERSION_MAJOR}.${AMCL_VERSION_MINOR}.${AMCL_VERSION_PATCH}")
do_test (test_octet_consistency "SUCCESS")
do_test (test_big_consistency "SUCCESS")

# Arithmetics tests big
message(STATUS "Run ${AMCL_CHOICE} Arithmetics Tests")
add_executable (test_big_arithmetics test_big_arithmetics.c)
# Link the executable to the libraries
target_link_libraries (test_big_arithmetics amcl_curve)
# test
add_test(NAME test_big_arithmetics COMMAND ${TARGET_SYSTEM_EMULATOR} test_big_arithmetics ${PROJECT_SOURCE_DIR}/testVectors/big/test_vector_big.txt)
set_tests_properties (test_big_arithmetics PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)

# Arithmetics test fp
add_executable (test_fp_arithmetics test_fp_arithmetics.c)
add_test(NAME test_fp_arithmetics COMMAND ${TARGET_SYSTEM_EMULATOR} test_fp_arithmetics ${PROJECT_SOURCE_DIR}/testVectors/fp/test_vector_${AMCL_CHOICE}.txt)
target_link_libraries (test_fp_arithmetics amcl_curve)
set_tests_properties (test_fp_arithmetics PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)

# Arithmetics test fp2 and fp4 for pairing-friendly curves
if(AMCL_CHOICE MATCHES "BN" OR AMCL_CHOICE MATCHES "BLS")
  add_executable (test_fp2_arithmetics test_fp2_arithmetics.c)
  add_executable (test_fp4_arithmetics test_fp4_arithmetics.c)
  add_test(NAME test_fp2_arithmetics COMMAND ${TARGET_SYSTEM_EMULATOR} test_fp2_arithmetics ${PROJECT_SOURCE_DIR}/testVectors/fp2/test_vector_${AMCL_CHOICE}.txt)
  add_test(NAME test_fp4_arithmetics COMMAND ${TARGET_SYSTEM_EMULATOR} test_fp4_arithmetics ${PROJECT_SOURCE_DIR}/testVectors/fp4/test_vector_${AMCL_CHOICE}.txt)
  target_link_libraries (test_fp2_arithmetics amcl_pairing)
  target_link_libraries (test_fp4_arithmetics amcl_pairing)
  set_tests_properties (test_fp2_arithmetics PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  set_tests_properties (test_fp4_arithmetics PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
endif(AMCL_CHOICE MATCHES "BN" OR AMCL_CHOICE MATCHES "BLS")

# Aritmetics test for ecp 
add_executable (test_ecp_arithmetics test_ecp_arithmetics.c)
add_test(NAME test_ecp_arithmetics COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecp_arithmetics ${PROJECT_SOURCE_DIR}/testVectors/ecp/test_vector_${AMCL_CHOICE}_${AMCL_CURVETYPE}.txt)
target_link_libraries (test_ecp_arithmetics amcl_curve)
set_tests_properties (test_ecp_arithmetics PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)

# Aritmetics test for ecp2 for pairing-friendly curves
if(AMCL_CHOICE MATCHES "BN" OR AMCL_CHOICE MATCHES "BLS")
  add_executable (test_ecp2_arithmetics test_ecp2_arithmetics.c)
  add_test(NAME test_ecp2_arithmetics COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecp2_arithmetics ${PROJECT_SOURCE_DIR}/testVectors/ecp2/test_vector_${AMCL_CHOICE}_${AMCL_CURVETYPE}.txt)
  target_link_libraries (test_ecp2_arithmetics amcl_pairing)
  set_tests_properties (test_ecp2_arithmetics PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
endif(AMCL_CHOICE MATCHES "BN" OR AMCL_CHOICE MATCHES "BLS")

if(${CMAKE_SYSTEM_NAME} MATCHES "Linux" AND (AMCL_CHOICE MATCHES "BN" OR AMCL_CHOICE MATCHES "BLS"))
# Aritmetics test output functions (used only for debug) - Linux specific code
add_executable (test_output_functions test_output_functions.c)
add_test(NAME test_output_functions COMMAND ${TARGET_SYSTEM_EMULATOR} test_output_functions ${PROJECT_SOURCE_DIR}/testVectors/output/test_vector_${AMCL_CHOICE}_${AMCL_CURVETYPE}_${AMCL_CHUNK}.txt ${PROJECT_BINARY_DIR}/Testing/Temporary/stdout.out)
target_link_libraries (test_output_functions amcl_pairing)
set_tests_properties (test_output_functions PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux" AND (AMCL_CHOICE MATCHES "BN" OR AMCL_CHOICE MATCHES "BLS"))

# curve independent tests
add_executable (test_hash test_hash.c)
add_executable (test_gcm_encrypt test_gcm_encrypt.c)
add_executable (test_gcm_decrypt test_gcm_decrypt.c)
add_executable (test_aes_encrypt test_aes_encrypt.c)
add_executable (test_aes_decrypt test_aes_decrypt.c)
# Link the executable to the libraries
target_link_libraries (test_hash amcl_core) 
target_link_libraries (test_gcm_encrypt amcl_core) 
target_link_libraries (test_gcm_decrypt amcl_core) 
target_link_libraries (test_aes_encrypt amcl_core) 
target_link_libraries (test_aes_decrypt amcl_core)
 
# hash tests
add_test(NAME test_hash_256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_hash ${PROJECT_SOURCE_DIR}/testVectors/sha/256/SHA256ShortMsg.rsp sha256)
set_tests_properties (test_hash_256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_hash_384 COMMAND ${TARGET_SYSTEM_EMULATOR} test_hash ${PROJECT_SOURCE_DIR}/testVectors/sha/384/SHA384ShortMsg.rsp sha384)
set_tests_properties (test_hash_384 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_hash_512 COMMAND ${TARGET_SYSTEM_EMULATOR} test_hash ${PROJECT_SOURCE_DIR}/testVectors/sha/512/SHA512ShortMsg.rsp sha512)
set_tests_properties (test_hash_512 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)

# AES-GCM tests
add_test(NAME test_gcm_encrypt_128 COMMAND ${TARGET_SYSTEM_EMULATOR} test_gcm_encrypt ${PROJECT_SOURCE_DIR}/testVectors/gcm/gcmEncryptExtIV128.rsp)
set_tests_properties (test_gcm_encrypt_128 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_gcm_encrypt_256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_gcm_encrypt ${PROJECT_SOURCE_DIR}/testVectors/gcm/gcmEncryptExtIV256.rsp)
set_tests_properties (test_gcm_encrypt_256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_gcm_decrypt_128 COMMAND ${TARGET_SYSTEM_EMULATOR} test_gcm_decrypt ${PROJECT_SOURCE_DIR}/testVectors/gcm/gcmDecrypt128.rsp)
set_tests_properties (test_gcm_decrypt_128 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_gcm_decrypt_256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_gcm_decrypt ${PROJECT_SOURCE_DIR}/testVectors/gcm/gcmDecrypt256.rsp)
set_tests_properties (test_gcm_decrypt_256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)

# AES tests
add_test(NAME test_aes_encrypt_ECB_128 COMMAND ${TARGET_SYSTEM_EMULATOR} test_aes_encrypt ${PROJECT_SOURCE_DIR}/testVectors/aes/ECBMMT128.rsp  ECB)
set_tests_properties (test_aes_encrypt_ECB_128 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_aes_encrypt_ECB_256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_aes_encrypt ${PROJECT_SOURCE_DIR}/testVectors/aes/ECBMMT256.rsp  ECB)
set_tests_properties (test_aes_encrypt_ECB_256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_aes_encrypt_CBC_128 COMMAND ${TARGET_SYSTEM_EMULATOR} test_aes_encrypt ${PROJECT_SOURCE_DIR}/testVectors/aes/CBCMMT128.rsp  CBC)
set_tests_properties (test_aes_encrypt_CBC_128 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_aes_encrypt_CFB1_128 COMMAND ${TARGET_SYSTEM_EMULATOR} test_aes_encrypt ${PROJECT_SOURCE_DIR}/testVectors/aes/CFB8MMT128.rsp  CFB1)
set_tests_properties (test_aes_encrypt_CFB1_128 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_aes_encrypt_CBC_256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_aes_encrypt ${PROJECT_SOURCE_DIR}/testVectors/aes/CBCMMT256.rsp  CBC)
set_tests_properties (test_aes_encrypt_CBC_256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_aes_encrypt_CTR_128 COMMAND ${TARGET_SYSTEM_EMULATOR} test_aes_encrypt ${PROJECT_SOURCE_DIR}/testVectors/aes/amcl_CTRMCL128.rsp  CTR)
set_tests_properties (test_aes_encrypt_CTR_128 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_aes_encrypt_CTR_256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_aes_encrypt ${PROJECT_SOURCE_DIR}/testVectors/aes/amcl_CTRMCL256.rsp  CTR)
set_tests_properties (test_aes_encrypt_CTR_256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_aes_encrypt_CFB1_256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_aes_encrypt ${PROJECT_SOURCE_DIR}/testVectors/aes/CFB8MMT256.rsp  CFB1)
set_tests_properties (test_aes_encrypt_CFB1_256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)

add_test(NAME test_aes_decrypt_ECB_128 COMMAND ${TARGET_SYSTEM_EMULATOR} test_aes_decrypt ${PROJECT_SOURCE_DIR}/testVectors/aes/ECBMMT128.rsp  ECB)
set_tests_properties (test_aes_decrypt_ECB_128 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_aes_decrypt_ECB_256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_aes_decrypt ${PROJECT_SOURCE_DIR}/testVectors/aes/ECBMMT256.rsp  ECB)
set_tests_properties (test_aes_decrypt_ECB_256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_aes_decrypt_CBC_128 COMMAND ${TARGET_SYSTEM_EMULATOR} test_aes_decrypt ${PROJECT_SOURCE_DIR}/testVectors/aes/CBCMMT128.rsp  CBC)
set_tests_properties (test_aes_decrypt_CBC_128 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_aes_decrypt_CFB1_128 COMMAND ${TARGET_SYSTEM_EMULATOR} test_aes_decrypt ${PROJECT_SOURCE_DIR}/testVectors/aes/CFB8MMT128.rsp  CFB1)
set_tests_properties (test_aes_decrypt_CFB1_128 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_aes_decrypt_CBC_256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_aes_decrypt ${PROJECT_SOURCE_DIR}/testVectors/aes/CBCMMT256.rsp  CBC)
set_tests_properties (test_aes_decrypt_CBC_256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_aes_decrypt_CTR_128 COMMAND ${TARGET_SYSTEM_EMULATOR} test_aes_decrypt ${PROJECT_SOURCE_DIR}/testVectors/aes/amcl_CTRMCL128.rsp  CTR)
set_tests_properties (test_aes_decrypt_CTR_128 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_aes_decrypt_CTR_256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_aes_decrypt ${PROJECT_SOURCE_DIR}/testVectors/aes/amcl_CTRMCL256.rsp  CTR)
set_tests_properties (test_aes_decrypt_CTR_256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
add_test(NAME test_aes_decrypt_CFB1_256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_aes_decrypt ${PROJECT_SOURCE_DIR}/testVectors/aes/CFB8MMT256.rsp  CFB1)
set_tests_properties (test_aes_decrypt_CFB1_256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)

if(BUILD_MPIN)
  add_executable (test_mpin test_mpin.c)
  add_executable (test_mpin_sign test_mpin_sign.c)
  add_executable (test_mpin_good test_mpin_good.c)
  add_executable (test_mpin_bad_pin test_mpin_bad_pin.c)
  add_executable (test_mpin_bad_token test_mpin_bad_token.c)
  add_executable (test_mpin_expired_tp test_mpin_expired_tp.c)
  add_executable (test_mpin_tp test_mpin_tp.c)
  add_executable (test_mpin_random test_mpin_random.c)
  add_executable (test_mpinfull_sha256 test_mpinfull.c)
  add_executable (test_mpinfull_sha384 test_mpinfull.c)
  add_executable (test_mpinfull_sha512 test_mpinfull.c)
  add_executable (test_mpinfull_onepass test_mpinfull_onepass.c)
  add_executable (test_mpinfull_random test_mpinfull_random.c)
if(AMCL_CHOICE STREQUAL "BN254_CX")
  add_executable (test_mpin_vectors test_mpin_vectors.c)
endif(AMCL_CHOICE STREQUAL "BN254_CX")
  add_executable (test_utils test_utils.c)
  # Link the executable to the libraries
  target_link_libraries (test_mpin amcl_mpin) 
  target_link_libraries (test_mpin_sign amcl_mpin) 
  target_link_libraries (test_mpin_good amcl_mpin) 
  target_link_libraries (test_mpin_bad_pin amcl_mpin) 
  target_link_libraries (test_mpin_bad_token amcl_mpin) 
  target_link_libraries (test_mpin_expired_tp amcl_mpin) 
  target_link_libraries (test_mpin_tp amcl_mpin) 
  target_link_libraries (test_mpin_random amcl_mpin) 
  target_link_libraries (test_mpinfull_sha256 amcl_mpin)
  target_link_libraries (test_mpinfull_sha384 amcl_mpin)
  target_link_libraries (test_mpinfull_sha512 amcl_mpin)
  target_link_libraries (test_mpinfull_onepass amcl_mpin) 
  target_link_libraries (test_mpinfull_random amcl_mpin)
if(AMCL_CHOICE STREQUAL "BN254_CX")
  target_link_libraries (test_mpin_vectors amcl_mpin)
endif(AMCL_CHOICE STREQUAL "BN254_CX")
  target_link_libraries (test_utils amcl_mpin)
  # tests
  do_test (test_mpin "SUCCESS Error Code 0")
  do_test (test_mpin_sign "TEST PASSED")
  do_test (test_mpin_good "SUCCESS Error Code 0")
  do_test (test_mpin_bad_pin "FAILURE")
  do_test (test_mpin_bad_token "FAILURE Invalid Token Error Code -19")
  do_test (test_mpin_expired_tp "FAILURE Invalid Token Error Code -19")
  do_test (test_mpin_tp "Iteration ${MPIN_TIME_PERMIT_TESTS} SUCCESS Error Code 0")
  do_test (test_mpin_random "Iteration ${MPIN_RANDOM_TESTS} SUCCESS Error Code 0")
  add_test(NAME test_mpinfull_sha256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_mpinfull_sha256 sha256)
  set_tests_properties (test_mpinfull_sha256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_mpinfull_sha384 COMMAND ${TARGET_SYSTEM_EMULATOR} test_mpinfull_sha384 sha384)
  set_tests_properties (test_mpinfull_sha384 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_mpinfull_sha512 COMMAND ${TARGET_SYSTEM_EMULATOR} test_mpinfull_sha512 sha512)
  set_tests_properties (test_mpinfull_sha512 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  do_test (test_mpinfull_onepass "SUCCESS")
  do_test (test_mpinfull_random "Iteration ${MPIN_RANDOM_TESTS} SUCCESS")
if(AMCL_CHOICE STREQUAL "BN254_CX")
  add_test(NAME test_mpin_vectors COMMAND ${TARGET_SYSTEM_EMULATOR} test_mpin_vectors ${PROJECT_SOURCE_DIR}/testVectors/mpin/BN254_CX.txt)
  set_tests_properties (test_mpin_vectors PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
endif(AMCL_CHOICE STREQUAL "BN254_CX")
  do_test (test_utils "SUCCESS")
endif(BUILD_MPIN)

if(BUILD_WCC)
  add_executable (test_wcc_gcm test_wcc_gcm.c)
  add_executable (test_wcc_sha256 test_wcc.c)
  add_executable (test_wcc_sha384 test_wcc.c)
  add_executable (test_wcc_sha512 test_wcc.c)
  add_executable (test_wcc_random test_wcc_random.c)
  # Link the executable to the libraries
  target_link_libraries (test_wcc_gcm amcl_wcc) 
  target_link_libraries (test_wcc_sha256 amcl_wcc)
  target_link_libraries (test_wcc_sha384 amcl_wcc) 
  target_link_libraries (test_wcc_sha512 amcl_wcc) 
  target_link_libraries (test_wcc_random amcl_wcc) 
  # tests  
  add_test(NAME test_wcc_sha256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_wcc_sha256 sha256)
  set_tests_properties (test_wcc_sha256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_wcc_sha384 COMMAND ${TARGET_SYSTEM_EMULATOR} test_wcc_sha384 sha384)
  set_tests_properties (test_wcc_sha384 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_wcc_sha512 COMMAND ${TARGET_SYSTEM_EMULATOR} test_wcc_sha512 sha512)
  set_tests_properties (test_wcc_sha512 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  do_test (test_wcc_gcm "SUCCESS")
  do_test (test_wcc_random "SUCCESS")
endif(BUILD_WCC)  

if(AMCL_CHOICE STREQUAL "NIST256")
  message(STATUS "Run ${AMCL_CHOICE} ECC Tests")
  add_executable (test_ecdh test_ecdh.c)
  add_executable (test_ecdsa_keypair test_ecdsa_keypair.c)
  add_executable (test_ecdsa_sign test_ecdsa_sign.c)
  add_executable (test_ecdsa_verify test_ecdsa_verify.c)
  # Link the executable to the libraries
  target_link_libraries (test_ecdh amcl_ecc) 
  target_link_libraries (test_ecdsa_keypair amcl_ecc) 
  target_link_libraries (test_ecdsa_sign amcl_ecc) 
  target_link_libraries (test_ecdsa_verify amcl_ecc) 
  # test
  add_test(NAME test_ecdh_NIST256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdh ${PROJECT_SOURCE_DIR}/testVectors/ecdh/P-256/KAS_ECC_CDH_PrimitiveTest.txt)
  set_tests_properties (test_ecdh_NIST256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_ecdsa_keypair_NIST256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdsa_keypair ${PROJECT_SOURCE_DIR}/testVectors/ecdsa/P-256/KeyPair.rsp)
  set_tests_properties (test_ecdsa_keypair_NIST256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_ecdsa_sign_NIST256_SHA256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdsa_sign ${PROJECT_SOURCE_DIR}/testVectors/ecdsa/P-256/sha256Sign.rsp sha256)
  set_tests_properties (test_ecdsa_sign_NIST256_SHA256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_ecdsa_sign_NIST256_SHA512 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdsa_sign ${PROJECT_SOURCE_DIR}/testVectors/ecdsa/P-256/sha512Sign.rsp sha512)
  set_tests_properties (test_ecdsa_sign_NIST256_SHA512 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_ecdsa_verify_NIST256_SHA256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdsa_verify ${PROJECT_SOURCE_DIR}/testVectors/ecdsa/P-256/sha256Verify.rsp sha256)
  set_tests_properties (test_ecdsa_verify_NIST256_SHA256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_ecdsa_verify_NIST256_SHA512 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdsa_verify ${PROJECT_SOURCE_DIR}/testVectors/ecdsa/P-256/sha512Verify.rsp sha512)
  set_tests_properties (test_ecdsa_verify_NIST256_SHA512 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
endif(AMCL_CHOICE STREQUAL "NIST256")

if(AMCL_CHOICE STREQUAL "NIST521")
  message(STATUS "Run ${AMCL_CHOICE} ECC Tests")
  add_executable (test_ecdh test_ecdh.c)
  add_executable (test_ecdsa_keypair test_ecdsa_keypair.c)
  add_executable (test_ecdsa_sign test_ecdsa_sign.c)
  add_executable (test_ecdsa_verify test_ecdsa_verify.c)
  # Link the executable to the libraries
  target_link_libraries (test_ecdh amcl_ecc) 
  target_link_libraries (test_ecdsa_keypair amcl_ecc) 
  target_link_libraries (test_ecdsa_sign amcl_ecc) 
  target_link_libraries (test_ecdsa_verify amcl_ecc)
  # test
  add_test(NAME test_ecdh_NIST521 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdh ${PROJECT_SOURCE_DIR}/testVectors/ecdh/P-521/KAS_ECC_CDH_PrimitiveTest.txt)
  set_tests_properties (test_ecdh_NIST521 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_ecdsa_keypair_NIST521 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdsa_keypair ${PROJECT_SOURCE_DIR}/testVectors/ecdsa/P-521/KeyPair.rsp)
  set_tests_properties (test_ecdsa_keypair_NIST521 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_ecdsa_sign_NIST521_SHA256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdsa_sign ${PROJECT_SOURCE_DIR}/testVectors/ecdsa/P-521/sha256Sign.rsp sha256)
  set_tests_properties (test_ecdsa_sign_NIST521_SHA256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_ecdsa_sign_NIST521_SHA512 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdsa_sign ${PROJECT_SOURCE_DIR}/testVectors/ecdsa/P-521/sha512Sign.rsp sha512)
  set_tests_properties (test_ecdsa_sign_NIST521_SHA512 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_ecdsa_verify_NIST521_SHA256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdsa_verify ${PROJECT_SOURCE_DIR}/testVectors/ecdsa/P-521/sha256Verify.rsp sha256)
  set_tests_properties (test_ecdsa_verify_NIST521_SHA256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_ecdsa_verify_NIST521_SHA512 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdsa_verify ${PROJECT_SOURCE_DIR}/testVectors/ecdsa/P-521/sha512Verify.rsp sha512)
  set_tests_properties (test_ecdsa_verify_NIST521_SHA512 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
endif(AMCL_CHOICE STREQUAL "NIST521")

if((AMCL_CHOICE STREQUAL "NIST521")  AND (AMCL_FFLEN STREQUAL "8") AND (BUILD_X509))
  message(STATUS "Run ${AMCL_CHOICE} x509 Tests")
  add_executable (test_x509 test_x509.c)
  # Link the executable to the libraries
  target_link_libraries (test_x509 x509)
  # test
  add_test(NAME test_x509_NIST521 COMMAND ${TARGET_SYSTEM_EMULATOR} test_x509 ${PROJECT_SOURCE_DIR}/testVectors/x509/P521/x509-vect.txt)
  set_tests_properties (test_x509_NIST521 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
endif((AMCL_CHOICE STREQUAL "NIST521")  AND (AMCL_FFLEN STREQUAL "8") AND (BUILD_X509))

if(AMCL_CHOICE STREQUAL "NIST384")
  message(STATUS "Run ${AMCL_CHOICE} ECC Tests")
  add_executable (test_ecdh test_ecdh.c)
  add_executable (test_ecdsa_keypair test_ecdsa_keypair.c)
  add_executable (test_ecdsa_sign test_ecdsa_sign.c)
  add_executable (test_ecdsa_verify test_ecdsa_verify.c)
  # Link the executable to the libraries
  target_link_libraries (test_ecdh amcl_ecc) 
  target_link_libraries (test_ecdsa_keypair amcl_ecc) 
  target_link_libraries (test_ecdsa_sign amcl_ecc) 
  target_link_libraries (test_ecdsa_verify amcl_ecc)
  # test
  add_test(NAME test_ecdh_NIST384 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdh ${PROJECT_SOURCE_DIR}/testVectors/ecdh/P-384/KAS_ECC_CDH_PrimitiveTest.txt)
  set_tests_properties (test_ecdh_NIST384 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_ecdsa_keypair_NIST384 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdsa_keypair ${PROJECT_SOURCE_DIR}/testVectors/ecdsa/P-384/KeyPair.rsp)
  set_tests_properties (test_ecdsa_keypair_NIST384 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_ecdsa_sign_NIST384_SHA256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdsa_sign ${PROJECT_SOURCE_DIR}/testVectors/ecdsa/P-384/sha256Sign.rsp sha256)
  set_tests_properties (test_ecdsa_sign_NIST384_SHA256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_ecdsa_sign_NIST384_SHA384 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdsa_sign ${PROJECT_SOURCE_DIR}/testVectors/ecdsa/P-384/sha384Sign.rsp sha384)
  set_tests_properties (test_ecdsa_sign_NIST384_SHA384 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_ecdsa_sign_NIST384_SHA512 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdsa_sign ${PROJECT_SOURCE_DIR}/testVectors/ecdsa/P-384/sha512Sign.rsp sha512)
  set_tests_properties (test_ecdsa_sign_NIST384_SHA512 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_ecdsa_verify_NIST384_SHA256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdsa_verify ${PROJECT_SOURCE_DIR}/testVectors/ecdsa/P-384/sha256Verify.rsp sha256)
  set_tests_properties (test_ecdsa_verify_NIST384_SHA256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_ecdsa_verify_NIST384_SHA384 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdsa_verify ${PROJECT_SOURCE_DIR}/testVectors/ecdsa/P-384/sha384Verify.rsp sha384)
  set_tests_properties (test_ecdsa_verify_NIST384_SHA384 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_ecdsa_verify_NIST384_SHA512 COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdsa_verify ${PROJECT_SOURCE_DIR}/testVectors/ecdsa/P-384/sha512Verify.rsp sha512)
  set_tests_properties (test_ecdsa_verify_NIST384_SHA512 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
endif(AMCL_CHOICE STREQUAL "NIST384")

if((AMCL_CHOICE STREQUAL "NIST256") AND (AMCL_FFLEN STREQUAL "8"))
  message(STATUS "Run ${AMCL_CHOICE} RSA2048 Tests")
  add_executable (test_rsa_sign test_rsa_sign.c)
  # Link the executable to the libraries
  target_link_libraries (test_rsa_sign amcl_x509) 
  # test
  add_test(NAME test_rsa_sign COMMAND ${TARGET_SYSTEM_EMULATOR} test_rsa_sign ${PROJECT_SOURCE_DIR}/testVectors/rsa/2048/pkcs-vect.txt)
  set_tests_properties (test_rsa_sign PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
endif((AMCL_CHOICE STREQUAL "NIST256") AND (AMCL_FFLEN STREQUAL "8"))

if((AMCL_CHOICE STREQUAL "NIST256") AND (AMCL_FFLEN STREQUAL "8") AND (BUILD_X509))
  message(STATUS "Run ${AMCL_CHOICE} x509 Tests")
  add_executable (test_x509 test_x509.c)
  # Link the executable to the libraries
  target_link_libraries (test_x509 amcl_x509) 
  # test
  add_test(NAME test_x509_NIST256_1 COMMAND ${TARGET_SYSTEM_EMULATOR} test_x509 ${PROJECT_SOURCE_DIR}/testVectors/x509/2048_P256/pkits-vect.txt)
  set_tests_properties (test_x509_NIST256_1 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
  add_test(NAME test_x509_NIST256_2 COMMAND ${TARGET_SYSTEM_EMULATOR} test_x509 ${PROJECT_SOURCE_DIR}/testVectors/x509/2048_P256/x509-vect.txt)
  set_tests_properties (test_x509_NIST256_2 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
endif((AMCL_CHOICE STREQUAL "NIST256") AND (AMCL_FFLEN STREQUAL "8") AND (BUILD_X509))

if((AMCL_CHOICE STREQUAL "NIST384") AND (AMCL_FFLEN STREQUAL "8"))
  message(STATUS "Run ${AMCL_CHOICE} RSA3072 Tests")
  add_executable (test_rsa_sign test_rsa_sign.c)
  # Link the executable to the libraries
  target_link_libraries (test_rsa_sign amcl_x509)
  # test
  add_test(NAME test_rsa_sign COMMAND ${TARGET_SYSTEM_EMULATOR} test_rsa_sign ${PROJECT_SOURCE_DIR}/testVectors/rsa/3072/pkcs-vect.txt)
  set_tests_properties (test_rsa_sign PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
endif((AMCL_CHOICE STREQUAL "NIST384") AND (AMCL_FFLEN STREQUAL "8"))

if((AMCL_CHOICE STREQUAL "NIST384") AND (AMCL_FFLEN STREQUAL "8") AND (BUILD_X509))
  message(STATUS "Run ${AMCL_CHOICE} RSA3072 Tests")
  add_executable (test_x509 test_x509.c)
  # Link the executable to the libraries
  target_link_libraries (test_x509 amcl_x509)
  # test
  add_test(NAME test_x509_NIST384 COMMAND ${TARGET_SYSTEM_EMULATOR} test_x509 ${PROJECT_SOURCE_DIR}/testVectors/x509/3072_P384/x509-vect.txt)
  set_tests_properties (test_x509_NIST384 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
endif((AMCL_CHOICE STREQUAL "NIST384") AND (AMCL_FFLEN STREQUAL "8") AND (BUILD_X509))

if((AMCL_CHOICE STREQUAL "NIST256") AND (AMCL_FFLEN STREQUAL "16"))
  message(STATUS "Run ${AMCL_CHOICE} RSA4096 Tests")
  add_executable (test_rsa_sign test_rsa_sign.c)
  # Link the executable to the libraries
  target_link_libraries (test_rsa_sign amcl_x509)
  # test
  add_test(NAME test_rsa_sign COMMAND ${TARGET_SYSTEM_EMULATOR} test_rsa_sign ${PROJECT_SOURCE_DIR}/testVectors/rsa/4096/pkcs-vect.txt)
  set_tests_properties (test_rsa_sign PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
endif((AMCL_CHOICE STREQUAL "NIST256") AND (AMCL_FFLEN STREQUAL "16"))

if((AMCL_CHOICE STREQUAL "NIST256") AND (AMCL_FFLEN STREQUAL "16") AND (BUILD_X509))
  message(STATUS "Run ${AMCL_CHOICE} x509 Tests")
  add_executable (test_x509 test_x509.c)
  # Link the executable to the libraries
  target_link_libraries (test_x509 amcl_x509) 
  # test
  add_test(NAME test_x509_NIST256 COMMAND ${TARGET_SYSTEM_EMULATOR} test_x509 ${PROJECT_SOURCE_DIR}/testVectors/x509/4096/x509-vect.txt)
  set_tests_properties (test_x509_NIST256 PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
endif((AMCL_CHOICE STREQUAL "NIST256") AND (AMCL_FFLEN STREQUAL "16") AND (BUILD_X509))

if((AMCL_CHOICE STREQUAL "C25519") AND (AMCL_FFLEN STREQUAL "8") AND (AMCL_CURVETYPE STREQUAL "EDWARDS"))
  message(STATUS "Run ${AMCL_CHOICE} RSA2048 Tests")
  add_executable (test_rsa_sign test_rsa_sign.c)
  # Link the executable to the libraries
  target_link_libraries (test_rsa_sign amcl_x509) 
  # test
  add_test(NAME test_rsa_sign COMMAND ${TARGET_SYSTEM_EMULATOR} test_rsa_sign ${PROJECT_SOURCE_DIR}/testVectors/rsa/2048/pkcs-vect.txt)
  set_tests_properties (test_rsa_sign PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
endif((AMCL_CHOICE STREQUAL "C25519") AND (AMCL_FFLEN STREQUAL "8") AND (AMCL_CURVETYPE STREQUAL "EDWARDS"))

if((AMCL_CHOICE STREQUAL "C25519") AND (AMCL_FFLEN STREQUAL "8") AND (AMCL_CURVETYPE STREQUAL "MONTGOMERY"))
  message(STATUS "Run ${AMCL_CHOICE} ECDH Tests")
  add_executable (test_ecdh test_ecdh.c)
  # Link the executable to the libraries
  target_link_libraries (test_ecdh amcl_ecc) 
  # test
  add_test(NAME test_ecdh COMMAND ${TARGET_SYSTEM_EMULATOR} test_ecdh ${PROJECT_SOURCE_DIR}/testVectors/ecdh/C25519/KAS_ECC_CDH_PrimitiveTest.txt)
  set_tests_properties (test_ecdh PROPERTIES PASS_REGULAR_EXPRESSION SUCCESS)
endif((AMCL_CHOICE STREQUAL "C25519") AND (AMCL_FFLEN STREQUAL "8") AND (AMCL_CURVETYPE STREQUAL "MONTGOMERY"))
