486
|
1 /* |
|
2 * hash.cpp -- hash functions |
|
3 * |
|
4 * Copyright (c) 2013-2015 David Demelier <markand@malikania.fr> |
|
5 * |
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
|
7 * purpose with or without fee is hereby granted, provided that the above |
|
8 * copyright notice and this permission notice appear in all copies. |
|
9 * |
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|
17 */ |
|
18 |
|
19 #include "hash.h" |
|
20 |
|
21 #include <openssl/sha.h> |
|
22 #include <openssl/md5.h> |
|
23 |
|
24 namespace hash { |
|
25 |
|
26 namespace { |
|
27 |
|
28 template <typename Context> |
|
29 using Init = int (*)(Context *); |
|
30 |
|
31 template <typename Context> |
|
32 using Update = int (*)(Context *, const void *, size_t); |
|
33 |
|
34 template <typename Context> |
|
35 using Final = int (*)(unsigned char *, Context *); |
|
36 |
|
37 template <typename Context, size_t Length> |
|
38 std::string convert(const std::string &input, Init<Context> init, Update<Context> update, Final<Context> finalize) |
|
39 { |
|
40 unsigned char digest[Length]; |
|
41 char hash[Length * 2 + 1]; |
|
42 |
|
43 Context ctx; |
|
44 init(&ctx); |
|
45 update(&ctx, input.c_str(), input.length()); |
|
46 finalize(digest, &ctx); |
|
47 |
|
48 for (unsigned long i = 0; i < Length; i++) |
|
49 sprintf(&hash[i * 2], "%02x", (unsigned int)digest[i]); |
|
50 |
|
51 return std::string(hash); |
|
52 } |
|
53 |
|
54 } // !namespace |
|
55 |
|
56 std::string md5(const std::string &input) |
|
57 { |
|
58 return convert<MD5_CTX, MD5_DIGEST_LENGTH>(input, MD5_Init, MD5_Update, MD5_Final); |
|
59 } |
|
60 |
|
61 std::string sha1(const std::string &input) |
|
62 { |
|
63 return convert<SHA_CTX, SHA_DIGEST_LENGTH>(input, SHA1_Init, SHA1_Update, SHA1_Final); |
|
64 } |
|
65 |
|
66 std::string sha256(const std::string &input) |
|
67 { |
|
68 return convert<SHA256_CTX, SHA256_DIGEST_LENGTH>(input, SHA256_Init, SHA256_Update, SHA256_Final); |
|
69 } |
|
70 |
|
71 std::string sha512(const std::string &input) |
|
72 { |
|
73 return convert<SHA512_CTX, SHA512_DIGEST_LENGTH>(input, SHA512_Init, SHA512_Update, SHA512_Final); |
|
74 } |
|
75 |
|
76 } // !hash |