Commit 7ba6afb53a2f6ac4bfb68c9bcc4b3a50e69d6254
0 parents
Initial commit. dependencies not resolved yet.
Showing
9 changed files
with
402 additions
and
0 deletions
.gitignore
0 → 100644
CMakeLists.txt
0 → 100644
| 1 | +++ a/CMakeLists.txt | ||
| 1 | +cmake_minimum_required(VERSION 3.0) | ||
| 2 | + | ||
| 3 | +# Check to see where cmake is located. | ||
| 4 | +if( IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/cmake ) | ||
| 5 | + LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) | ||
| 6 | +elseif( IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../cmake ) | ||
| 7 | + LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../cmake) | ||
| 8 | +else() | ||
| 9 | + return() | ||
| 10 | +endif() | ||
| 11 | + | ||
| 12 | +# Check to see if there is versioning information available | ||
| 13 | +if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/osdev_versioning/cmake) | ||
| 14 | + LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/osdev_versioning/cmake) | ||
| 15 | + include(osdevversion) | ||
| 16 | +endif() | ||
| 17 | + | ||
| 18 | +include(projectheader) | ||
| 19 | +project_header(osdev_crypter) | ||
| 20 | + | ||
| 21 | +add_subdirectory(src) | ||
| 22 | +add_subdirectory(tests) | ||
| 23 | + | ||
| 24 | +# include(packaging) | ||
| 25 | +# package_component() |
README.md
0 → 100644
| 1 | +++ a/README.md |
src/CMakeLists.txt
0 → 100644
| 1 | +++ a/src/CMakeLists.txt | ||
| 1 | +cmake_minimum_required(VERSION 3.0) | ||
| 2 | +LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../external/hsoa_create_version_include/cmake) | ||
| 3 | +include(projectheader) | ||
| 4 | +project_header(crypter) | ||
| 5 | + | ||
| 6 | +find_package( Qt5Core REQUIRED ) | ||
| 7 | + | ||
| 8 | +include_directories( SYSTEM | ||
| 9 | + ${Qt5Core_INCLUDE_DIRS} | ||
| 10 | +) | ||
| 11 | + | ||
| 12 | +include(compiler) | ||
| 13 | + | ||
| 14 | +set(SRC_LIST | ||
| 15 | + ${CMAKE_CURRENT_SOURCE_DIR}/crypter.h | ||
| 16 | + ${CMAKE_CURRENT_SOURCE_DIR}/crypter.cpp | ||
| 17 | + ${CMAKE_CURRENT_SOURCE_DIR}/scopeguard.h | ||
| 18 | + ${CMAKE_CURRENT_SOURCE_DIR}/scopeguard.cpp | ||
| 19 | +) | ||
| 20 | + | ||
| 21 | +link_directories( | ||
| 22 | + ${CMAKE_BINARY_DIR}/lib | ||
| 23 | +) | ||
| 24 | + | ||
| 25 | +include(library) | ||
| 26 | +add_libraries( | ||
| 27 | + ${Qt5Core_LIBRARIES} | ||
| 28 | + crypto | ||
| 29 | + logutils | ||
| 30 | +) | ||
| 31 | + | ||
| 32 | +include(installation) | ||
| 33 | +install_component() |
src/crypter.cpp
0 → 100644
| 1 | +++ a/src/crypter.cpp | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | + | ||
| 23 | +#include "crypter.h" | ||
| 24 | + | ||
| 25 | +// std | ||
| 26 | +#include <iomanip> | ||
| 27 | +#include <memory> | ||
| 28 | +#include <sstream> | ||
| 29 | +#include <stdexcept> | ||
| 30 | +#include <system_error> | ||
| 31 | + | ||
| 32 | +// openssl | ||
| 33 | +#include <openssl/evp.h> | ||
| 34 | + | ||
| 35 | +// osdev::components | ||
| 36 | +#include "log.h" | ||
| 37 | +#include "scopeguard.h" | ||
| 38 | + | ||
| 39 | +using namespace osdev::components; | ||
| 40 | + | ||
| 41 | +namespace { | ||
| 42 | + | ||
| 43 | +const EVP_MD* getAlgo( Crypter::AlgorithmEnum algo ) | ||
| 44 | +{ | ||
| 45 | + switch ( algo ) | ||
| 46 | + { | ||
| 47 | + case Crypter::AlgorithmEnum::MD0: | ||
| 48 | + return EVP_md_null(); | ||
| 49 | + case Crypter::AlgorithmEnum::MD2: | ||
| 50 | + // return EVP_md2(); | ||
| 51 | + case Crypter::AlgorithmEnum::MD5: | ||
| 52 | + return EVP_md5(); | ||
| 53 | + case Crypter::AlgorithmEnum::MDC2: | ||
| 54 | + // deprecated. | ||
| 55 | + // md = EVP_mdc2(); | ||
| 56 | + return EVP_md_null(); | ||
| 57 | + case Crypter::AlgorithmEnum::SHA1: | ||
| 58 | + return EVP_sha1(); | ||
| 59 | + case Crypter::AlgorithmEnum::SHA224: | ||
| 60 | + return EVP_sha224(); | ||
| 61 | + case Crypter::AlgorithmEnum::SHA256: | ||
| 62 | + return EVP_sha256(); | ||
| 63 | + case Crypter::AlgorithmEnum::SHA384: | ||
| 64 | + return EVP_sha384(); | ||
| 65 | + case Crypter::AlgorithmEnum::SHA512: | ||
| 66 | + return EVP_sha512(); | ||
| 67 | + case Crypter::AlgorithmEnum::RIPEMD160: | ||
| 68 | + return EVP_ripemd160(); | ||
| 69 | + } | ||
| 70 | + | ||
| 71 | + throw std::invalid_argument("Crypto algorithm not found."); | ||
| 72 | +} | ||
| 73 | + | ||
| 74 | +} // anonymous | ||
| 75 | + | ||
| 76 | +Crypter::Crypter() | ||
| 77 | +{ | ||
| 78 | +} | ||
| 79 | + | ||
| 80 | +std::string Crypter::encrypt( const std::string& message, Crypter::AlgorithmEnum algo ) | ||
| 81 | +{ | ||
| 82 | + // Create the environment | ||
| 83 | + auto md = getAlgo(algo); | ||
| 84 | + | ||
| 85 | +#if OPENSSL_VERSION_NUMBER >= 0x1010008fL | ||
| 86 | + auto mdContext = std::unique_ptr<EVP_MD_CTX, decltype(&EVP_MD_CTX_free)>( | ||
| 87 | + EVP_MD_CTX_create(), | ||
| 88 | + [](EVP_MD_CTX* ptr){EVP_MD_CTX_free(ptr);}); | ||
| 89 | + | ||
| 90 | + // This will call EVP_cleanup if the guard goes out of scope. | ||
| 91 | + ScopeGuard oGuard( &EVP_PBE_cleanup ); | ||
| 92 | +#else | ||
| 93 | + auto mdContext = std::unique_ptr<EVP_MD_CTX, decltype(&EVP_MD_CTX_destroy)>( | ||
| 94 | + EVP_MD_CTX_create(), | ||
| 95 | + [](EVP_MD_CTX* ptr){EVP_MD_CTX_destroy(ptr);}); | ||
| 96 | + | ||
| 97 | + // This will call EVP_cleanup if the guard goes out of scope. | ||
| 98 | + ScopeGuard oGuard( &EVP_cleanup ); | ||
| 99 | +#endif | ||
| 100 | + | ||
| 101 | + (void)oGuard; // Satisfy the compiler for unused variables. | ||
| 102 | + | ||
| 103 | + auto errorCode = EVP_DigestInit_ex( mdContext.get(), md, NULL ); | ||
| 104 | + if( 1 != errorCode ) | ||
| 105 | + { | ||
| 106 | + LogError( "[Crypter::encrypt]", QString( "No encryption digest environment created." ) ); | ||
| 107 | + throw std::system_error( errorCode, std::system_category(), "No encryption digest environment created." ); | ||
| 108 | + } | ||
| 109 | + | ||
| 110 | + // Update the environment with the message | ||
| 111 | + errorCode = EVP_DigestUpdate( mdContext.get(), message.c_str(), message.length() ); | ||
| 112 | + if( 1 != errorCode ) | ||
| 113 | + { | ||
| 114 | + LogError( "[Crypter::encrypt]", QString("Digest failed.") ); | ||
| 115 | + throw std::system_error( errorCode, std::system_category(), "Digest failed.." ); | ||
| 116 | + } | ||
| 117 | + | ||
| 118 | + // End the Digest so we can read the crypted message. | ||
| 119 | + unsigned int mdLen; | ||
| 120 | + unsigned char mdValue[EVP_MAX_MD_SIZE]; | ||
| 121 | + errorCode = EVP_DigestFinal_ex( mdContext.get(), mdValue, &mdLen ); | ||
| 122 | + if( 1 != errorCode ) | ||
| 123 | + { | ||
| 124 | + LogError( "[Crypter::encrypt]", QString("There was an error closing the digest environment.") ); | ||
| 125 | + throw std::system_error( errorCode, std::system_category(), "There was an error closing the digest environment." ); | ||
| 126 | + } | ||
| 127 | + | ||
| 128 | + // If we got here, all went well. We retrieve the crypted message | ||
| 129 | + // through a stringstream : convert to hex, padding and width and return the string. | ||
| 130 | + std::stringstream ss; | ||
| 131 | + for( unsigned int nIndex = 0; nIndex < mdLen; nIndex++ ) | ||
| 132 | + { | ||
| 133 | + ss << std::hex << std::setw( 2 ) << std::setfill( '0' ) << static_cast<int>( mdValue[nIndex] ); | ||
| 134 | + } | ||
| 135 | + | ||
| 136 | + return ss.str(); | ||
| 137 | +} |
src/crypter.h
0 → 100644
| 1 | +++ a/src/crypter.h | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | + | ||
| 23 | +#ifndef OSDEV_COMPONENTS_CRYPTER_H | ||
| 24 | +#define OSDEV_COMPONENTS_CRYPTER_H | ||
| 25 | + | ||
| 26 | +// std | ||
| 27 | +#include <string> | ||
| 28 | + | ||
| 29 | +namespace osdev { | ||
| 30 | +namespace components { | ||
| 31 | + | ||
| 32 | +/** | ||
| 33 | + * @brief Provides encryption/hashing functionality. | ||
| 34 | + */ | ||
| 35 | +class Crypter | ||
| 36 | +{ | ||
| 37 | +public: | ||
| 38 | + /** | ||
| 39 | + * @brief Defines the encryption/hashing algorithms. | ||
| 40 | + */ | ||
| 41 | + enum class AlgorithmEnum | ||
| 42 | + { | ||
| 43 | + MD0, ///< Empty initializer. | ||
| 44 | + MD2, | ||
| 45 | + MD5, | ||
| 46 | + MDC2, | ||
| 47 | + SHA1, | ||
| 48 | + SHA224, | ||
| 49 | + SHA256, | ||
| 50 | + SHA384, | ||
| 51 | + SHA512, | ||
| 52 | + RIPEMD160 | ||
| 53 | + }; | ||
| 54 | + | ||
| 55 | + /** | ||
| 56 | + * @brief Constructs a default instance of Crypter. | ||
| 57 | + */ | ||
| 58 | + Crypter(); | ||
| 59 | + | ||
| 60 | + /** | ||
| 61 | + * @brief Encrypts the specified message using the specified algorithm. | ||
| 62 | + * @param message The message to encrypt. | ||
| 63 | + * @param algo The encryption algorithm to use. The default value is SHA256. | ||
| 64 | + * @return The encrypted string. | ||
| 65 | + */ | ||
| 66 | + static std::string encrypt( const std::string& message, Crypter::AlgorithmEnum algo = Crypter::AlgorithmEnum::SHA256 ); | ||
| 67 | +}; | ||
| 68 | + | ||
| 69 | +} /* End namespace components */ | ||
| 70 | +} /* End namespace osdev */ | ||
| 71 | + | ||
| 72 | +#endif /* OSDEV_COMPONENTS_CRYPTER_H */ |
src/scopeguard.cpp
0 → 100644
| 1 | +++ a/src/scopeguard.cpp | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | + | ||
| 23 | +#include "scopeguard.h" | ||
| 24 | + | ||
| 25 | +using namespace osdev::components; | ||
| 26 | + | ||
| 27 | +ScopeGuard::ScopeGuard( const CleanUpFunction& cleanupFunc ) | ||
| 28 | + : m_cleanupFunc( cleanupFunc ) | ||
| 29 | +{ | ||
| 30 | +} | ||
| 31 | + | ||
| 32 | +ScopeGuard::~ScopeGuard() noexcept | ||
| 33 | +{ | ||
| 34 | + try | ||
| 35 | + { | ||
| 36 | + if( m_cleanupFunc ) | ||
| 37 | + { | ||
| 38 | + m_cleanupFunc(); | ||
| 39 | + } | ||
| 40 | + } | ||
| 41 | + catch (...) {} | ||
| 42 | +} |
src/scopeguard.h
0 → 100644
| 1 | +++ a/src/scopeguard.h | ||
| 1 | +/* **************************************************************************** | ||
| 2 | + * Copyright 2019 Open Systems Development BV * | ||
| 3 | + * * | ||
| 4 | + * Permission is hereby granted, free of charge, to any person obtaining a * | ||
| 5 | + * copy of this software and associated documentation files (the "Software"), * | ||
| 6 | + * to deal in the Software without restriction, including without limitation * | ||
| 7 | + * the rights to use, copy, modify, merge, publish, distribute, sublicense, * | ||
| 8 | + * and/or sell copies of the Software, and to permit persons to whom the * | ||
| 9 | + * Software is furnished to do so, subject to the following conditions: * | ||
| 10 | + * * | ||
| 11 | + * The above copyright notice and this permission notice shall be included in * | ||
| 12 | + * all copies or substantial portions of the Software. * | ||
| 13 | + * * | ||
| 14 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * | ||
| 15 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * | ||
| 16 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * | ||
| 17 | + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * | ||
| 18 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * | ||
| 19 | + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * | ||
| 20 | + * DEALINGS IN THE SOFTWARE. * | ||
| 21 | + * ***************************************************************************/ | ||
| 22 | + | ||
| 23 | +#ifndef OSDEV_COMPONENTS_SCOPEGUARD_H | ||
| 24 | +#define OSDEV_COMPONENTS_SCOPEGUARD_H | ||
| 25 | + | ||
| 26 | +#include <functional> | ||
| 27 | + | ||
| 28 | +namespace osdev { | ||
| 29 | +namespace components { | ||
| 30 | + | ||
| 31 | +using CleanUpFunction = std::function<void() noexcept>; | ||
| 32 | + | ||
| 33 | +/** | ||
| 34 | + * @brief Ensures that a cleanup function is called at the end of the current scope. | ||
| 35 | + */ | ||
| 36 | +class ScopeGuard | ||
| 37 | +{ | ||
| 38 | +public: | ||
| 39 | + | ||
| 40 | + /** | ||
| 41 | + * @brief Constructs a RAII instance that will call cleanupFunc in it's destructor. | ||
| 42 | + * @param cleanupFunc The cleanup function to call at the end of the current scope. | ||
| 43 | + * This cleanup function must not throw exceptions. If it does, the behaviour | ||
| 44 | + * is undefined. | ||
| 45 | + */ | ||
| 46 | + ScopeGuard( const CleanUpFunction& cleanupFunc ); | ||
| 47 | + | ||
| 48 | + // not copyable | ||
| 49 | + ScopeGuard( const ScopeGuard& ) = delete; | ||
| 50 | + ScopeGuard& operator=( const ScopeGuard& ) = delete; | ||
| 51 | + | ||
| 52 | + ~ScopeGuard() noexcept; | ||
| 53 | + | ||
| 54 | +private: | ||
| 55 | + CleanUpFunction m_cleanupFunc; | ||
| 56 | +}; | ||
| 57 | + | ||
| 58 | +} /* End namespace components */ | ||
| 59 | +} /* End namespace osdev */ | ||
| 60 | + | ||
| 61 | +#endif /* OSDEV_COMPONENTS_SCOPEGUARD_H */ |
tests/CMakeLists.txt
0 → 100644
| 1 | +++ a/tests/CMakeLists.txt | ||
| 1 | +cmake_minimum_required(VERSION 3.0) | ||
| 2 | +LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../cmake) | ||
| 3 | + | ||
| 4 | +include(projectheader) | ||
| 5 | +project_header(test_logutils) | ||
| 6 | + | ||
| 7 | +include_directories( SYSTEM | ||
| 8 | + ${CMAKE_CURRENT_SOURCE_DIR}/../../src | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +include(compiler) | ||
| 12 | +set(SRC_LIST | ||
| 13 | +) | ||
| 14 | + | ||
| 15 | +# add_executable( ${PROJECT_NAME} | ||
| 16 | +# ${SRC_LIST} | ||
| 17 | +# ) | ||
| 18 | + | ||
| 19 | +# target_link_libraries( | ||
| 20 | +# ${PROJECT_NAME} | ||
| 21 | +# ) | ||
| 22 | + | ||
| 23 | +# set_target_properties( ${PROJECT_NAME} PROPERTIES | ||
| 24 | +# RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin | ||
| 25 | +# LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib | ||
| 26 | +# ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/archive | ||
| 27 | +# ) | ||
| 28 | + | ||
| 29 | +# include(installation) | ||
| 30 | +# install_application() |