This is an automated email from the ASF dual-hosted git repository.
giorgio pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-milagro-crypto-c.git
The following commit(s) were added to refs/heads/master by this push:
new 5218216 new file: CMakeLists.txt new file: aes_test.c
new file: cmake/AddCmockaTest.cmake new file: cmake/Amcl.cmake new
file: cmake/Cmocka.cmake new file: cmake/CodeCoverage.cmake new file:
crypto_context.c new file: include/aes_test.h new file:
include/crypto_context.h new file: test_main.c
5218216 is described below
commit 52182165ba977bbac7d760438a5811c03cbbde64
Author: Giorgio Zoppi <[email protected]>
AuthorDate: Thu Jun 13 21:32:27 2019 +0200
new file: CMakeLists.txt
new file: aes_test.c
new file: cmake/AddCmockaTest.cmake
new file: cmake/Amcl.cmake
new file: cmake/Cmocka.cmake
new file: cmake/CodeCoverage.cmake
new file: crypto_context.c
new file: include/aes_test.h
new file: include/crypto_context.h
new file: test_main.c
---
cmocka_tests/CMakeLists.txt | 66 +++++++++
cmocka_tests/aes_test.c | 92 +++++++++++++
cmocka_tests/cmake/AddCmockaTest.cmake | 51 +++++++
cmocka_tests/cmake/Amcl.cmake | 45 +++++++
cmocka_tests/cmake/Cmocka.cmake | 47 +++++++
cmocka_tests/cmake/CodeCoverage.cmake | 237 +++++++++++++++++++++++++++++++++
cmocka_tests/cmake_install.cmake | 49 +++++++
cmocka_tests/crypto_context.c | 76 +++++++++++
cmocka_tests/include/aes_test.h | 26 ++++
cmocka_tests/include/crypto_context.h | 63 +++++++++
cmocka_tests/test_main.c | 19 +++
11 files changed, 771 insertions(+)
diff --git a/cmocka_tests/CMakeLists.txt b/cmocka_tests/CMakeLists.txt
new file mode 100644
index 0000000..a4fc0db
--- /dev/null
+++ b/cmocka_tests/CMakeLists.txt
@@ -0,0 +1,66 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
+get_filename_component(PROJECT_ROOT ${CMAKE_CURRENT_LIST_FILE} DIRECTORY)
+set(CMAKE_C_STANDARD 99)
+set(CMAKE_C_STANDARD_REQUIRED ON)
+set(CMAKE_MODULE_PATH "${PROJECT_ROOT}/cmake")
+include(${PROJECT_ROOT}/cmake/Cmocka.cmake)
+include(${PROJECT_ROOT}/cmake/AddCmockaTest.cmake)
+include(${PROJECT_ROOT}/cmake/Amcl.cmake)
+
+set(OPENSSL_USE_STATIC_LIBS TRUE)
+find_package(OpenSSL REQUIRED)
+
+function(ADD_CMOCKA_TEST_ENVIRONMENT _TARGET_NAME)
+ if (WIN32 OR CYGWIN OR MINGW)
+ file(TO_NATIVE_PATH "${cmocka-library_BINARY_DIR}" CMOCKA_DLL_PATH)
+
+ if (TARGET_SYSTEM_EMULATOR)
+ set(DLL_PATH_ENV "WINEPATH=${CMOCKA_DLL_PATH};$ENV{WINEPATH}")
+ else()
+ set(DLL_PATH_ENV "PATH=${CMOCKA_DLL_PATH};$ENV{PATH}")
+ endif()
+ #
+ # IMPORTANT NOTE: The set_tests_properties(), below, internally
+ # stores its name/value pairs with a semicolon delimiter.
+ # because of this we must protect the semicolons in the path
+ #
+ string(REPLACE ";" "\\;" DLL_PATH_ENV "${DLL_PATH_ENV}")
+
+ set_tests_properties(${_TARGET_NAME}
+ PROPERTIES
+ ENVIRONMENT
+ "${DLL_PATH_ENV}")
+ endif()
+endfunction()
+
+set_source_files_properties(aes_test.c crypto_context.c test_main.c
+ PROPERTIES
+ COMPILE_DEFINITIONS
+ UNIT_TESTING=1)
+enable_testing()
+include_directories(${CMOCKA_INCLUDE_DIR} ${PROJECT_ROOT} include ../include)
+### The most simple test
+add_cmocka_test(aes_test
+ SOURCES crypto_context.c test_main.c aes_test.c
+ COMPILE_OPTIONS ${DEFAULT_C_COMPILE_FLAGS}
+ LINK_LIBRARIES ${CMOCKA_LIBRARY} ${AMCL_LIBRARY}
OpenSSL::Crypto)
+add_cmocka_test_environment(aes_test)
+
+
diff --git a/cmocka_tests/aes_test.c b/cmocka_tests/aes_test.c
new file mode 100644
index 0000000..61f1910
--- /dev/null
+++ b/cmocka_tests/aes_test.c
@@ -0,0 +1,92 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+#include <arch.h>
+#include <amcl.h>
+#include <setjmp.h>
+#include <cmocka.h>
+#include <aes_test.h>
+#include <crypto_context.h>
+
+int aes_setup(void **state)
+{
+ crypto_context_t* context = calloc(1, sizeof(crypto_context_t));
+ *state = context;
+ return 0;
+}
+
+int aes_teardown(void **state)
+{
+ crypto_context_t* context = *state;
+ free(context);
+ return 0;
+}
+
+void should_encrypt_aes_ecb_128_correctly(void **state)
+{
+ crypto_context_t *ctx = *state;
+ assert_non_null(ctx);
+ ctx->mode = encrypt
+}
+
+void should_fail_aes_ecb_128_with_invalidkey(void **state)
+{
+
+}
+
+void should_encrypt_aes_cbc_128_correctly(void **state)
+{
+}
+
+void should_encrypt_aes_ctr_128_correctly(void **state)
+{
+}
+
+void should_encrypt_aes_cfb_1_correctly(void **state)
+{
+}
+
+static void
+test_encryption_aes(struct crypto_context *context,
+ char *plain_text, size_t plain_text_size)
+{
+ // arrange test
+ amcl_aes block_cipher;
+ uint8_t valid_aes_init;
+ int i = 0;
+ size_t block_size = get_block_size("aes",context->mode);
+ size_t n_blocks = plain_text_size / block_size;
+ valid_aes_init = AES_init(&block_cipher,
+ convert_mode(context->mode),
+ context->key_length,
+ context->key, context->init_vector);
+ // act & assert.
+ for (i = 0; i < n_blocks; i++) {
+ AES_encrypt(&block_cipher, &plain_text[i * block_size]);
+ }
+ octet ciphertext_octect =
+ { plain_text_size, plain_text_size, plain_text };
+ octet expected_ciphertext = { context->ciphertext_length,
+ context->ciphertext_length,
+ context->ciphertext
+ };
+ int ret = OCT_comp(&expected_ciphertext, &ciphertext_octect);
+ assert_int_equal(1, ret);
+
+}
diff --git a/cmocka_tests/cmake/AddCmockaTest.cmake
b/cmocka_tests/cmake/AddCmockaTest.cmake
new file mode 100644
index 0000000..e02d48f
--- /dev/null
+++ b/cmocka_tests/cmake/AddCmockaTest.cmake
@@ -0,0 +1,51 @@
+
+
+function(ADD_CMOCKA_TEST _TARGET_NAME)
+
+ set(one_value_arguments
+ )
+
+ set(multi_value_arguments
+ SOURCES
+ COMPILE_OPTIONS
+ LINK_LIBRARIES
+ LINK_OPTIONS
+ )
+
+ cmake_parse_arguments(_add_cmocka_test
+ ""
+ "${one_value_arguments}"
+ "${multi_value_arguments}"
+ ${ARGN}
+ )
+
+ if (NOT DEFINED _add_cmocka_test_SOURCES)
+ message(FATAL_ERROR "No sources provided for target ${_TARGET_NAME}")
+ endif()
+
+ add_executable(${_TARGET_NAME} ${_add_cmocka_test_SOURCES})
+
+ if (DEFINED _add_cmocka_test_COMPILE_OPTIONS)
+ target_compile_options(${_TARGET_NAME}
+ PRIVATE ${_add_cmocka_test_COMPILE_OPTIONS}
+ )
+ endif()
+
+ if (DEFINED _add_cmocka_test_LINK_LIBRARIES)
+ target_link_libraries(${_TARGET_NAME}
+ PRIVATE ${_add_cmocka_test_LINK_LIBRARIES}
+ )
+ endif()
+
+ if (DEFINED _add_cmocka_test_LINK_OPTIONS)
+ set_target_properties(${_TARGET_NAME}
+ PROPERTIES LINK_FLAGS
+ ${_add_cmocka_test_LINK_OPTIONS}
+ )
+ endif()
+
+ add_test(${_TARGET_NAME}
+ ${TARGET_SYSTEM_EMULATOR} ${_TARGET_NAME}
+ )
+
+endfunction (ADD_CMOCKA_TEST)
diff --git a/cmocka_tests/cmake/Amcl.cmake b/cmocka_tests/cmake/Amcl.cmake
new file mode 100644
index 0000000..f600d8c
--- /dev/null
+++ b/cmocka_tests/cmake/Amcl.cmake
@@ -0,0 +1,45 @@
+IF(UNIX)
+ FIND_PATH(AMCL_INCLUDE_DIR amcl.h
+ "../include"
+ "${PROJECT_ROOT}/../include"
+ "${CMAKE_SOURCE_DIR}/../include"
+ NO_DEFAULT_PATH
+ )
+
+ SET(CMAKE_FIND_LIBRARY_PREFIXES "" "lib")
+ SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a" ".lib")
+ FIND_LIBRARY(AMCL_LIBRARY NAMES amcl_core PATHS
+ $ENV{LIB}
+ ../lib
+ /usr/lib/x86_64-linux-gnu
+ "$ENV{LIB_DIR}/lib"
+ "${CMAKE_SOURCE_DIR}/lib"
+ #mingw
+ c:/msys/local/lib
+ NO_DEFAULT_PATH
+ )
+ELSE()
+ FIND_PATH(AMCL_INCLUDE_DIR amcl.h
+ "${PROJECT_ROOT}/include"
+ "${PROJECT_ROOT}/../include"
+ )
+
+ FILE(GLOB AMCL_LIBRARY NAMES
+ "${PROJECT_ROOT}/../lib/*amcl_core.lib"
+ "${CMAKE_SOURCE_DIR}/../lib/*amcl_core.so"
+ )
+ENDIF()
+
+
+IF (AMCL_INCLUDE_DIR AND AMCL_LIBRARY)
+ SET(AMCL_FOUND TRUE)
+ENDIF (AMCL_INCLUDE_DIR AND AMCL_LIBRARY)
+
+MESSAGE(STATUS "Apache Milagro Include: ${AMCL_INCLUDE_DIR}")
+
+
+IF (AMCL_FOUND)
+ MESSAGE(STATUS "Found Apache Milagro: ${AMCL_LIBRARY}")
+ELSE (AMCL_FOUND)
+ MESSAGE(FATAL_ERROR "Could not find Apache Milagro")
+ENDIF (AMCL_FOUND)
diff --git a/cmocka_tests/cmake/Cmocka.cmake b/cmocka_tests/cmake/Cmocka.cmake
new file mode 100644
index 0000000..d500796
--- /dev/null
+++ b/cmocka_tests/cmake/Cmocka.cmake
@@ -0,0 +1,47 @@
+
+IF(UNIX)
+ FIND_PATH(CMOCKA_INCLUDE_DIR cmocka.h
+ "$ENV{LIB_DIR}/include"
+ "/usr/include"
+ "/usr/include/cmockery"
+ "${CMAKE_SOURCE_DIR}/include"
+ "${CMAKE_SOURCE_DIR}/include/cmocka"
+ NO_DEFAULT_PATH
+ )
+
+ SET(CMAKE_FIND_LIBRARY_PREFIXES "" "lib")
+ SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a" ".lib")
+ FIND_LIBRARY(CMOCKA_LIBRARY NAMES cmocka PATHS
+ $ENV{LIB}
+ /usr/lib
+ /usr/lib/x86_64-linux-gnu
+ "$ENV{LIB_DIR}/lib"
+ "${CMAKE_SOURCE_DIR}/lib"
+ #mingw
+ c:/msys/local/lib
+ NO_DEFAULT_PATH
+ )
+ELSE()
+ FIND_PATH(CMOCKA_INCLUDE_DIR cmocka.h
+ "${PROJECT_ROOT}/include"
+ )
+
+ FILE(GLOB CMOCKA_LIBRARY NAMES
+ "${PROJECT_ROOT}/lib/cmocka*.lib"
+ "${PROJECT_ROOT}/lib/cmocka*.a"
+ )
+ENDIF()
+
+
+IF (CMOCKA_INCLUDE_DIR AND CMOCKA_LIBRARY)
+ SET(CMOCKA_FOUND TRUE)
+ENDIF (CMOCKA_INCLUDE_DIR AND CMOCKA_LIBRARY)
+
+MESSAGE(STATUS "CMocka Include: ${CMOCKA_INCLUDE_DIR}")
+
+
+IF (CMOCKA_FOUND)
+ MESSAGE(STATUS "Found CMocka: ${CMOCKA_LIBRARY}")
+ELSE (CMOCKA_FOUND)
+ MESSAGE(FATAL_ERROR "Could not find Cmocka")
+ENDIF (CMOCKA_FOUND)
diff --git a/cmocka_tests/cmake/CodeCoverage.cmake
b/cmocka_tests/cmake/CodeCoverage.cmake
new file mode 100644
index 0000000..4d8bd43
--- /dev/null
+++ b/cmocka_tests/cmake/CodeCoverage.cmake
@@ -0,0 +1,237 @@
+include(CMakeParseArguments)
+
+ # Check prereqs
+ find_program( GCOV_PATH gcov )
+ find_program( LCOV_PATH NAMES lcov lcov.bat lcov.exe lcov.perl)
+ find_program( GENHTML_PATH NAMES genhtml genhtml.perl genhtml.bat )
+ find_program( GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/scripts/test)
+ find_package (Python COMPONENTS Interpreter Development)
+
+ if(NOT GCOV_PATH)
+ message(FATAL_ERROR "gcov not found! Aborting...")
+ endif() # NOT GCOV_PATH
+
+ if("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang")
+ if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 3)
+ message(FATAL_ERROR "Clang version must be 3.0.0 or greater!
Aborting...")
+ endif()
+ elseif(NOT CMAKE_COMPILER_IS_GNUCXX)
+ message(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
+ endif()
+
+ set(COVERAGE_COMPILER_FLAGS "-g --coverage -fprofile-arcs -ftest-coverage"
+ CACHE INTERNAL "")
+
+ set(CMAKE_CXX_FLAGS_COVERAGE
+ ${COVERAGE_COMPILER_FLAGS}
+ CACHE STRING "Flags used by the C++ compiler during coverage builds."
+ FORCE )
+ set(CMAKE_C_FLAGS_COVERAGE
+ ${COVERAGE_COMPILER_FLAGS}
+ CACHE STRING "Flags used by the C compiler during coverage builds."
+ FORCE )
+ set(CMAKE_EXE_LINKER_FLAGS_COVERAGE
+ ""
+ CACHE STRING "Flags used for linking binaries during coverage builds."
+ FORCE )
+ set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
+ ""
+ CACHE STRING "Flags used by the shared libraries linker during coverage
builds."
+ FORCE )
+ mark_as_advanced(
+ CMAKE_CXX_FLAGS_COVERAGE
+ CMAKE_C_FLAGS_COVERAGE
+ CMAKE_EXE_LINKER_FLAGS_COVERAGE
+ CMAKE_SHARED_LINKER_FLAGS_COVERAGE )
+
+ if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
+ message(WARNING "Code coverage results with an optimised (non-Debug)
build may be misleading")
+ endif() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug"
+
+ if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
+ link_libraries(gcov)
+ else()
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
+ endif()
+
+ # Defines a target for running and collection code coverage information
+ # Builds dependencies, runs the given executable and outputs reports.
+ # NOTE! The executable should always have a ZERO as exit code otherwise
+ # the coverage generation will not complete.
+ #
+ # SETUP_TARGET_FOR_COVERAGE_LCOV(
+ # NAME testrunner_coverage # New target name
+ # EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in
PROJECT_BINARY_DIR
+ # DEPENDENCIES testrunner # Dependencies to build
first
+ # )
+ function(SETUP_TARGET_FOR_COVERAGE_LCOV)
+
+ set(options NONE)
+ set(oneValueArgs NAME)
+ set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES LCOV_ARGS
GENHTML_ARGS)
+ cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN})
+
+ if(NOT LCOV_PATH)
+ message(FATAL_ERROR "lcov not found! Aborting...")
+ endif() # NOT LCOV_PATH
+
+ if(NOT GENHTML_PATH)
+ message(FATAL_ERROR "genhtml not found! Aborting...")
+ endif() # NOT GENHTML_PATH
+
+ # Setup target
+ add_custom_target(${Coverage_NAME}
+
+ # Cleanup lcov
+ COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH}
-directory . --zerocounters
+ # Create baseline to make sure untouched files show up in the report
+ COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH}
-c -i -d . -o ${Coverage_NAME}.base
+
+ # Run tests
+ COMMAND ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}
+
+ # Capturing lcov counters and generating report
+ COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH}
--directory . --capture --output-file ${Coverage_NAME}.info
+ # add baseline counters
+ COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH}
-a ${Coverage_NAME}.base -a ${Coverage_NAME}.info --output-file
${Coverage_NAME}.total
+ COMMAND ${LCOV_PATH} ${Coverage_LCOV_ARGS} --gcov-tool ${GCOV_PATH}
--remove ${Coverage_NAME}.total ${COVERAGE_LCOV_EXCLUDES} --output-file
${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
+ COMMAND ${GENHTML_PATH} ${Coverage_GENHTML_ARGS} -o ${Coverage_NAME}
${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
+ COMMAND ${CMAKE_COMMAND} -E remove ${Coverage_NAME}.base
${Coverage_NAME}.total ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
+
+ WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+ DEPENDS ${Coverage_DEPENDENCIES}
+ COMMENT "Resetting code coverage counters to zero.\nProcessing code
coverage counters and generating report."
+ )
+
+ # Show where to find the lcov info report
+ add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
+ COMMAND ;
+ COMMENT "Lcov code coverage info report saved in
${Coverage_NAME}.info."
+ )
+
+ # Show info where to find the report
+ add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
+ COMMAND ;
+ COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view
the coverage report."
+ )
+
+ endfunction() # SETUP_TARGET_FOR_COVERAGE_LCOV
+
+ # Defines a target for running and collection code coverage information
+ # Builds dependencies, runs the given executable and outputs reports.
+ # NOTE! The executable should always have a ZERO as exit code otherwise
+ # the coverage generation will not complete.
+ #
+ # SETUP_TARGET_FOR_COVERAGE_GCOVR_XML(
+ # NAME ctest_coverage # New target name
+ # EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in
PROJECT_BINARY_DIR
+ # DEPENDENCIES executable_target # Dependencies to build first
+ # )
+ function(SETUP_TARGET_FOR_COVERAGE_GCOVR_XML)
+
+ set(options NONE)
+ set(oneValueArgs NAME)
+ set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
+ cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN})
+
+ if(NOT Python_FOUND)
+ message(FATAL_ERROR "python not found! Aborting...")
+ endif()
+
+ if(NOT GCOVR_PATH)
+ message(FATAL_ERROR "gcovr not found! Aborting...")
+ endif() # NOT GCOVR_PATH
+
+ # Combine excludes to several -e arguments
+ set(GCOVR_EXCLUDES "")
+ foreach(EXCLUDE ${COVERAGE_GCOVR_EXCLUDES})
+ string(REPLACE "*" "\\*" EXCLUDE_REPLACED ${EXCLUDE})
+ list(APPEND GCOVR_EXCLUDES "-e")
+ list(APPEND GCOVR_EXCLUDES "${EXCLUDE_REPLACED}")
+ endforeach()
+
+ add_custom_target(${Coverage_NAME}
+ # Run tests
+ ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}
+
+ # Running gcovr
+ COMMAND ${GCOVR_PATH} --xml
+ -r ${PROJECT_SOURCE_DIR} ${GCOVR_EXCLUDES}
+ --object-directory=${PROJECT_BINARY_DIR}
+ -o ${Coverage_NAME}.xml
+ WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+ DEPENDS ${Coverage_DEPENDENCIES}
+ COMMENT "Running gcovr to produce Cobertura code coverage report."
+ )
+
+ # Show info where to find the report
+ add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
+ COMMAND ;
+ COMMENT "Cobertura code coverage report saved in
${Coverage_NAME}.xml."
+ )
+
+ endfunction() # SETUP_TARGET_FOR_COVERAGE_GCOVR_XML
+
+ # Defines a target for running and collection code coverage information
+ # Builds dependencies, runs the given executable and outputs reports.
+ # NOTE! The executable should always have a ZERO as exit code otherwise
+ # the coverage generation will not complete.
+ #
+ # SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML(
+ # NAME ctest_coverage # New target name
+ # EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in
PROJECT_BINARY_DIR
+ # DEPENDENCIES executable_target # Dependencies to build first
+ # )
+ function(SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML)
+
+ set(options NONE)
+ set(oneValueArgs NAME)
+ set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
+ cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN})
+
+ if(NOT Python_FOUND)
+ message(FATAL_ERROR "python not found! Aborting...")
+ endif()
+
+ if(NOT GCOVR_PATH)
+ message(FATAL_ERROR "gcovr not found! Aborting...")
+ endif() # NOT GCOVR_PATH
+
+ # Combine excludes to several -e arguments
+ set(GCOVR_EXCLUDES "")
+ foreach(EXCLUDE ${COVERAGE_GCOVR_EXCLUDES})
+ string(REPLACE "*" "\\*" EXCLUDE_REPLACED ${EXCLUDE})
+ list(APPEND GCOVR_EXCLUDES "-e")
+ list(APPEND GCOVR_EXCLUDES "${EXCLUDE_REPLACED}")
+ endforeach()
+
+ add_custom_target(${Coverage_NAME}
+ # Run tests
+ ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}
+
+ # Create folder
+ COMMAND ${CMAKE_COMMAND} -E make_directory
${PROJECT_BINARY_DIR}/${Coverage_NAME}
+
+ # Running gcovr
+ COMMAND ${Python_EXECUTABLE} ${GCOVR_PATH} --html --html-details
+ -r ${PROJECT_SOURCE_DIR} ${GCOVR_EXCLUDES}
+ --object-directory=${PROJECT_BINARY_DIR}
+ -o ${Coverage_NAME}/index.html
+ WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+ DEPENDS ${Coverage_DEPENDENCIES}
+ COMMENT "Running gcovr to produce HTML code coverage report."
+ )
+
+ # Show info where to find the report
+ add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
+ COMMAND ;
+ COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view
the coverage report."
+ )
+
+ endfunction() # SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML
+
+ function(APPEND_COVERAGE_COMPILER_FLAGS)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}"
PARENT_SCOPE)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}"
PARENT_SCOPE)
+ message(STATUS "Appending code coverage compiler flags:
${COVERAGE_COMPILER_FLAGS}")
+ endfunction() # APPEND_COVERAGE_COMPILER_FLAGS
diff --git a/cmocka_tests/cmake_install.cmake b/cmocka_tests/cmake_install.cmake
new file mode 100644
index 0000000..d4d94e8
--- /dev/null
+++ b/cmocka_tests/cmake_install.cmake
@@ -0,0 +1,49 @@
+# Install script for directory:
/home/jozoppi/projects/incubator-milagro-crypto-c/unit_test
+
+# Set the install prefix
+if(NOT DEFINED CMAKE_INSTALL_PREFIX)
+ set(CMAKE_INSTALL_PREFIX "/usr/local")
+endif()
+string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
+
+# Set the install configuration name.
+if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
+ if(BUILD_TYPE)
+ string(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
+ CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
+ else()
+ set(CMAKE_INSTALL_CONFIG_NAME "")
+ endif()
+ message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
+endif()
+
+# Set the component getting installed.
+if(NOT CMAKE_INSTALL_COMPONENT)
+ if(COMPONENT)
+ message(STATUS "Install component: \"${COMPONENT}\"")
+ set(CMAKE_INSTALL_COMPONENT "${COMPONENT}")
+ else()
+ set(CMAKE_INSTALL_COMPONENT)
+ endif()
+endif()
+
+# Install shared libraries without execute permission?
+if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
+ set(CMAKE_INSTALL_SO_NO_EXE "1")
+endif()
+
+# Is this installation the result of a crosscompile?
+if(NOT DEFINED CMAKE_CROSSCOMPILING)
+ set(CMAKE_CROSSCOMPILING "FALSE")
+endif()
+
+if(CMAKE_INSTALL_COMPONENT)
+ set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt")
+else()
+ set(CMAKE_INSTALL_MANIFEST "install_manifest.txt")
+endif()
+
+string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT
+ "${CMAKE_INSTALL_MANIFEST_FILES}")
+file(WRITE
"/home/jozoppi/projects/incubator-milagro-crypto-c/unit_test/${CMAKE_INSTALL_MANIFEST}"
+ "${CMAKE_INSTALL_MANIFEST_CONTENT}")
diff --git a/cmocka_tests/crypto_context.c b/cmocka_tests/crypto_context.c
new file mode 100644
index 0000000..959d00d
--- /dev/null
+++ b/cmocka_tests/crypto_context.c
@@ -0,0 +1,76 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <stdlib.h>
+#include <crypto_context.h>
+
+/* @brief Create a new encryption context assigning the loader
+* @param encryption_mode Mode of encryption (ECB, CBC, CFB, CTR)
+* @param loader Init function to be used for parsing the vector
file.
+*/
+crypto_context_t *new_context(encryption_mode mode,
+ void (*loader) (crypto_context_t *))
+{
+ crypto_context_t *ctx = calloc(1, sizeof(struct crypto_context));
+ ctx->parse_vector_file = loader;
+ ctx->mode = mode;
+ return ctx;
+}
+
+/*
+* @brief Delete the memory for crypto context
+* @param ctx Context to be used.
+*/
+void delete_context(crypto_context_t * ctx)
+{
+ free(ctx->ciphertext);
+ free(ctx->key);
+ free(ctx->init_vector);
+}
+
+/*
+* @brief Convert the encryption mode to an integer;
+* @param mode encryption_mode Mode of encryption (ECB, CBC, CFB, CTR)
+*/
+int convert_mode(encryption_mode mode)
+{
+ return (int)mode;
+}
+
+/*
+ * @brief Compute the block_size foreach algorithm;
+ * @param algo Block Cipher Algorithm name
+ * @param mode Mode for encryption
+ */
+size_t get_block_size(char *algo, encryption_mode mode)
+{
+ if (!strcmp("aes", algo)) {
+ // we are aes
+ switch (mode) {
+ case cbc_mode:
+ case ecb_mode:
+ case ctr_mode:
+ {
+ return 16;
+ }
+ case cfb_mode:
+ {
+ return 1;
+ }
+ }
+ }
+ return 16;
+}
diff --git a/cmocka_tests/include/aes_test.h b/cmocka_tests/include/aes_test.h
new file mode 100644
index 0000000..42f156d
--- /dev/null
+++ b/cmocka_tests/include/aes_test.h
@@ -0,0 +1,26 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef AES_TEST_H
+#define AES_TEST_H
+#include <string.h>
+#include <crypto_context.h>
+extern void parse_aes_vectorfile(struct crypto_context* context);
+extern void should_encrypt_aes_ecb_128_correctly(void** state);
+extern void should_encrypt_aes_cbc_128_correctly(void** state);
+extern void should_encrypt_aes_ctr_128_correctly(void** state);
+extern void should_encrypt_aes_cfb_1_correctly(void** state);
+#endif
diff --git a/cmocka_tests/include/crypto_context.h
b/cmocka_tests/include/crypto_context.h
new file mode 100644
index 0000000..40ce528
--- /dev/null
+++ b/cmocka_tests/include/crypto_context.h
@@ -0,0 +1,63 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef CRYPTO_CONTEXT
+#define CRYPTO_CONTEXT
+#include <stdlib.h>
+#define CRYPTO_VEC_PATH_MAX 256
+typedef enum e_mode
+{
+ ecb_mode,
+ cbc_mode,
+ cfb_mode,
+ ctr_mode
+} encryption_mode;
+typedef struct crypto_context
+{
+ char* ciphertext; /*<!-- Ciphertext to be compared */
+ size_t ciphertext_length; /*<!-- Ciphertext lenght */
+ char filename[CRYPTO_VEC_PATH_MAX]; /*<!-- Path of the vector test
filename */
+ char* key; /*<!-- Key to be used */
+ size_t key_length; /*<!-- Key length */
+ char* init_vector; /*<!-- IV */
+ size_t init_vector_length; /*<!-- Vector length */
+ encryption_mode mode; /*<!-- Kind of encryption mode */
+ void (*parse_vector_file)(struct crypto_context* self); /*<!-- function for
loading
+ the file and
init the structure */
+} crypto_context_t;
+
+/* @brief Create a new encryption context assigning the loader
+* @param encryption_mode Mode of encryption (ECB, CBC, CFB, CTR)
+* @param loader Init function to be used for parsing the vector
file.
+*/
+extern crypto_context_t* new_context(encryption_mode mode, void
(*loader)(crypto_context_t*));
+/*
+* @brief Delete the memory for crypto context
+* @param ctx Context to be used.
+*/
+extern void delete_context(crypto_context_t* ctx);
+/*
+* @brief Convert the encryption mode to an integer;
+* @param mode encryption_mode Mode of encryption (ECB, CBC, CFB, CTR)
+*/
+extern int convert_mode(encryption_mode mode);
+/*
+ * @brief Compute the block_size foreach algorithm;
+ * @param algo Block Cipher Algorithm name
+ * @param mode Mode for encryption
+ */
+extern size_t get_block_size(char* algo, encryption_mode mode);
+#endif
diff --git a/cmocka_tests/test_main.c b/cmocka_tests/test_main.c
new file mode 100644
index 0000000..089f7d2
--- /dev/null
+++ b/cmocka_tests/test_main.c
@@ -0,0 +1,19 @@
+
+#include <aes_test.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <setjmp.h>
+#include <cmocka.h>
+
+
+int main(void)
+{
+ const struct CMUnitTest tests[] = {
+ cmocka_unit_test(should_encrypt_aes_ecb_128_correctly),
+ cmocka_unit_test(should_encrypt_aes_cbc_128_correctly),
+ cmocka_unit_test(should_encrypt_aes_ctr_128_correctly),
+ cmocka_unit_test(should_encrypt_aes_cfb_1_correctly)
+ };
+ return cmocka_run_group_tests(tests, NULL, NULL);
+}