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