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() | ... | ... |