1/**
2 * Copyright (c) 2006-2023 LOVE Development Team
3 *
4 * This software is provided 'as-is', without any express or implied
5 * warranty. In no event will the authors be held liable for any damages
6 * arising from the use of this software.
7 *
8 * Permission is granted to anyone to use this software for any purpose,
9 * including commercial applications, and to alter it and redistribute it
10 * freely, subject to the following restrictions:
11 *
12 * 1. The origin of this software must not be misrepresented; you must not
13 * claim that you wrote the original software. If you use this software
14 * in a product, an acknowledgment in the product documentation would be
15 * appreciated but is not required.
16 * 2. Altered source versions must be plainly marked as such, and must not be
17 * misrepresented as being the original software.
18 * 3. This notice may not be removed or altered from any source distribution.
19 **/
20
21#pragma once
22
23// LOVE
24#include "common/Data.h"
25#include "common/StringMap.h"
26#include "common/int.h"
27
28namespace love
29{
30namespace data
31{
32
33class HashFunction
34{
35public:
36
37 enum Function
38 {
39 FUNCTION_MD5,
40 FUNCTION_SHA1,
41 FUNCTION_SHA224,
42 FUNCTION_SHA256,
43 FUNCTION_SHA384,
44 FUNCTION_SHA512,
45 FUNCTION_MAX_ENUM
46 };
47
48 struct Value
49 {
50 char data[64]; // Maximum possible size (SHA512).
51 size_t size;
52 };
53
54 /**
55 * Get a HashFunction instance for the given function.
56 *
57 * @param[in] function The selected hash function.
58 * @return An instance of HashFunction for the given function, or NULL if
59 * not available.
60 **/
61 static HashFunction *getHashFunction(Function function);
62
63 virtual ~HashFunction() {}
64
65 /**
66 * Hash the input, producing an set of bytes as output.
67 *
68 * @param[in] function The selected hash function.
69 * @param[in] input The input data to hash.
70 * @param[in] length The length of the input data.
71 * @param[out] output The result of the hash function.
72 **/
73 virtual void hash(Function function, const char *input, uint64 length, Value &output) const = 0;
74
75 /**
76 * @param[in] function The requested hash function.
77 * @return Whether this HashFunction instance implements the given function.
78 **/
79 virtual bool isSupported(Function function) const = 0;
80
81 static bool getConstant(const char *in, Function &out);
82 static bool getConstant(const Function &in, const char *&out);
83 static std::vector<std::string> getConstants(Function);
84
85protected:
86
87 HashFunction() {}
88
89private:
90
91 static StringMap<Function, FUNCTION_MAX_ENUM>::Entry functionEntries[];
92 static StringMap<Function, FUNCTION_MAX_ENUM> functionNames;
93
94}; // HashFunction
95
96} // data
97} // love
98