Mercurial > code
changeset 595:b46305a783ef
Hash: move to bitbucket
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 27 Sep 2016 22:39:07 +0200 |
parents | 2457d0f97243 |
children | b747700dd63d |
files | CMakeLists.txt modules/hash/CMakeLists.txt modules/hash/doc/mainpage.cpp modules/hash/hash.hpp modules/hash/test/main.cpp |
diffstat | 5 files changed, 0 insertions(+), 385 deletions(-) [+] |
line wrap: on
line diff
--- a/CMakeLists.txt Tue Sep 06 21:47:37 2016 +0200 +++ b/CMakeLists.txt Tue Sep 27 22:39:07 2016 +0200 @@ -51,7 +51,6 @@ add_subdirectory(modules/elapsed-timer) add_subdirectory(modules/fs) -add_subdirectory(modules/hash) add_subdirectory(modules/js) add_subdirectory(modules/net) add_subdirectory(modules/options)
--- a/modules/hash/CMakeLists.txt Tue Sep 06 21:47:37 2016 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -# -# CMakeLists.txt -- code building for common code -# -# Copyright (c) 2013-2016 David Demelier <markand@malikania.fr> -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -# - -find_package(OpenSSL) - -if (OPENSSL_FOUND) - code_define_module( - NAME hash - SOURCES hash.hpp - LIBRARIES ${OPENSSL_LIBRARIES} - INCLUDES ${OPENSSL_INCLUDE_DIR} - ) -endif ()
--- a/modules/hash/doc/mainpage.cpp Tue Sep 06 21:47:37 2016 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ -/** - * \mainpage - * - * Welcome to the hash library. - * - * ## Introduction - * - * With the hash functions you can easily hash any string with OpenSSL. - * - * ## Requirements - * - * - C++11, - * - [OpenSSL](http://openssl.org). - * - * ## Installation - * - * Just copy file hash.hpp and add it to your project. - * - * ## Overview - * - * ```` - * #include "hash.hpp" - * - * int main(void) - * { - * hash::sha1("Hello World!"); - * - * return 0; - * } - * ```` - */
--- a/modules/hash/hash.hpp Tue Sep 06 21:47:37 2016 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,261 +0,0 @@ -/* - * hash.hpp -- hash functions - * - * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr> - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef HASH_HPP -#define HASH_HPP - -/** - * \file hash.hpp - * \brief Hash functions. - * \author David Demelier <markand@malikania.fr> - */ - -/** - * \brief Define buffer size. - */ -#if !defined(HASH_BUFFER_SIZE) -# define HASH_BUFFER_SIZE 2048 -#endif - -#include <cassert> -#include <istream> -#include <iterator> -#include <sstream> -#include <string> - -#include <openssl/sha.h> -#include <openssl/md5.h> - -/** - * \brief Hash namespace. - */ -namespace hash { - -/** - * \cond HASH_HIDDEN_SYMBOLS - */ - -namespace detail { - -template <typename Context> -using Init = int (*)(Context *); - -template <typename Context> -using Update = int (*)(Context *, const void *, size_t); - -template <typename Context> -using Final = int (*)(unsigned char *, Context *); - -template <typename Context, size_t Length, typename InputIt> -inline std::string convert(InputIt it, - InputIt end, - Init<Context> init, - Update<Context> update, - Final<Context> finalize) -{ - unsigned char digest[Length] = { 0 }; - char hash[Length * 2 + 1]; - char buf[HASH_BUFFER_SIZE]; - - Context ctx; - init(&ctx); - - while (it != end) { - unsigned i; - - for (i = 0; it != end && i < HASH_BUFFER_SIZE; ++i) - buf[i] = *it++; - - update(&ctx, buf, i); - } - - finalize(digest, &ctx); - - for (unsigned long i = 0; i < Length; i++) - std::snprintf(&hash[i * 2], 2 + 1, "%02x", static_cast<unsigned>(digest[i])); - - return std::string(hash); -} - -} // !namespace - -/** - * \endcond - */ - -/** - * \enum Scheme - * \brief The scheme to use. - */ -enum Scheme { - Md5, //!< MD5 - Sha1, //!< SHA-1 - Sha256, //!< SHA-256 - Sha512 //!< SHA-512 -}; - -/** - * Generic function. - * - * \param scheme the scheme to use - * \param it the first character - * \param end the last character - * \return the string - */ -template <typename InputIt> -inline std::string toString(Scheme scheme, InputIt it, InputIt end) -{ - assert(scheme >= Scheme::Md5 && scheme <= Scheme::Sha512); - - std::string result; - - switch (scheme) { - case Scheme::Md5: - result = detail::convert<MD5_CTX, MD5_DIGEST_LENGTH>(it, end, MD5_Init, MD5_Update, MD5_Final); - break; - case Scheme::Sha1: - result = detail::convert<SHA_CTX, SHA_DIGEST_LENGTH>(it, end, SHA1_Init, SHA1_Update, SHA1_Final);; - break; - case Scheme::Sha256: - result = detail::convert<SHA256_CTX, SHA256_DIGEST_LENGTH>(it, end, SHA256_Init, SHA256_Update, SHA256_Final); - break; - case Scheme::Sha512: - result = detail::convert<SHA512_CTX, SHA512_DIGEST_LENGTH>(it, end, SHA512_Init, SHA512_Update, SHA512_Final); - break; - default: - break; - } - - return result; -} - -/** - * Overload for std::istream. - * - * \param scheme the scheme to use - * \param input the input stream - * \return the string - */ -inline std::string toString(Scheme scheme, std::istream &input) -{ - return toString(scheme, std::istreambuf_iterator<char>(input), std::istreambuf_iterator<char>()); -} - -/** - * Overload for std::string. - * - * \param scheme the scheme to use - * \param input the input stream - * \return the string - */ -inline std::string toString(Scheme scheme, const std::string &input) -{ - return toString(scheme, input.begin(), input.end()); -} - -/** - * Hash using MD5. - * - * \param input the input string - * \return the hashed string - */ -inline std::string md5(const std::string &input) -{ - return toString(Scheme::Md5, input); -} - -/** - * Hash using MD5. - * - * \param input the input stream - * \return the hashed string - */ -inline std::string md5(std::istream &input) -{ - return toString(Scheme::Md5, input); -} - -/** - * Hash using SHA1. - * - * \param input the input string - * \return the hashed string - */ -inline std::string sha1(const std::string &input) -{ - return toString(Scheme::Sha1, input); -} - -/** - * Hash using SHA1. - * - * \param input the input stream - * \return the hashed string - */ -inline std::string sha1(std::istream &input) -{ - return toString(Scheme::Sha1, input); -} - -/** - * Hash using SHA256. - * - * \param input the input string - * \return the hashed string - */ -inline std::string sha256(const std::string &input) -{ - return toString(Scheme::Sha256, input); -} - -/** - * Hash using SHA256. - * - * \param input the input stream - * \return the hashed string - */ -inline std::string sha256(std::istream &input) -{ - return toString(Scheme::Sha256, input); -} - -/** - * Hash using SHA512. - * - * \param input the input string - * \return the hashed string - */ -inline std::string sha512(const std::string &input) -{ - return toString(Scheme::Sha512, input); -} - -/** - * Hash using SHA512. - * - * \param input the input stream - * \return the hashed string - */ -inline std::string sha512(std::istream &input) -{ - return toString(Scheme::Sha512, input); -} - -} // !hash - -#endif // !HASH_HPP
--- a/modules/hash/test/main.cpp Tue Sep 06 21:47:37 2016 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -/* - * main.cpp -- test the hash cryptographic functions - * - * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr> - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include <gtest/gtest.h> - -#include <hash.hpp> - -/* - * We test the "Hello World" message in all cryptographic functions. - */ - -TEST(Hash, md5) -{ - std::string expected = "b10a8db164e0754105b7a99be72e3fe5"; - std::string output = hash::md5("Hello World"); - - ASSERT_EQ(expected, output); -} - -TEST(Hash, sha1) -{ - std::string expected = "0a4d55a8d778e5022fab701977c5d840bbc486d0"; - std::string output = hash::sha1("Hello World"); - - ASSERT_EQ(expected, output); -} - -TEST(Hash, sha256) -{ - std::string expected = "a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e"; - std::string output = hash::sha256("Hello World"); - - ASSERT_EQ(expected, output); -} - -TEST(Hash, sha512) -{ - std::string expected = "2c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e67cbda0daa8f51671064615d645ae27acb15bfb1447f459b"; - std::string output = hash::sha512("Hello World"); - - ASSERT_EQ(expected, output); -} - -int main(int argc, char **argv) -{ - testing::InitGoogleTest(&argc, argv); - - return RUN_ALL_TESTS(); -}