libfilezilla
hash.hpp
Go to the documentation of this file.
1 #ifndef LIBFILEZILLA_HASH_HEADER
2 #define LIBFILEZILLA_HASH_HEADER
3 
8 #include "libfilezilla.hpp"
9 
10 #include <vector>
11 #include <string>
12 
13 namespace fz {
14 
16 enum class hash_algorithm
17 {
18  md5, // insecure
19  sha1, // insecure
20  sha256,
21  sha384,
22  sha512,
23  sha3_256,
24  sha3_384,
25  sha3_512
26 };
27 
28 enum class hmac_algorithm
29 {
30  sha1, // insecure
31  sha256,
32  sha512
33 };
34 
36 size_t FZ_PUBLIC_SYMBOL get_digest_size(hash_algorithm);
37 
38 class buffer;
39 
41 class FZ_PUBLIC_SYMBOL hash_accumulator final
42 {
43 public:
46  hash_accumulator(hmac_algorithm algorithm, std::vector<uint8_t> const& key);
47  hash_accumulator(hmac_algorithm algorithm, std::string_view const& key);
49 
50  hash_accumulator(hash_accumulator const&) = delete;
51  hash_accumulator& operator=(hash_accumulator const&) = delete;
52 
53  size_t digest_size() const;
54 
55  void reinit();
56 
57  void update(std::string_view const& data);
58  void update(std::basic_string_view<uint8_t> const& data);
59  void update(std::vector<uint8_t> const& data);
60  void update(uint8_t const* data, size_t size);
61  void update(buffer const& data);
62  void update(uint8_t in) {
63  update(&in, 1);
64  }
65 
67  void update_uint32_be(uint32_t v);
68 
70  void update_with_length(std::string_view const& data);
71 
73  std::vector<uint8_t> digest();
74  void digest(uint8_t* out, size_t s);
75 
76  operator std::vector<uint8_t>() {
77  return digest();
78  }
79 
80  bool is_digest(std::string_view const& ref);
81  bool is_digest(uint8_t const* ref, size_t s);
82 
83  template<typename T>
84  hash_accumulator& operator<<(T && in) {
85  update(std::forward<T>(in));
86  return *this;
87  }
88 
90  std::vector<std::uint8_t> export_state();
91  bool import_state(std::vector<std::uint8_t> const& state);
92 
93  class impl;
94 private:
95  impl* impl_;
96 };
97 
102 std::vector<uint8_t> FZ_PUBLIC_SYMBOL md5(std::string_view const& data);
103 std::vector<uint8_t> FZ_PUBLIC_SYMBOL md5(std::vector<uint8_t> const& data);
104 
106 std::vector<uint8_t> FZ_PUBLIC_SYMBOL sha1(std::string_view const& data);
107 std::vector<uint8_t> FZ_PUBLIC_SYMBOL sha1(std::vector<uint8_t> const& data);
108 
110 std::vector<uint8_t> FZ_PUBLIC_SYMBOL sha256(std::string_view const& data);
111 std::vector<uint8_t> FZ_PUBLIC_SYMBOL sha256(std::vector<uint8_t> const& data);
112 
114 std::vector<uint8_t> FZ_PUBLIC_SYMBOL sha384(std::string_view const& data);
115 std::vector<uint8_t> FZ_PUBLIC_SYMBOL sha384(std::vector<uint8_t> const& data);
116 
118 std::vector<uint8_t> FZ_PUBLIC_SYMBOL sha512(std::string_view const& data);
119 std::vector<uint8_t> FZ_PUBLIC_SYMBOL sha512(std::vector<uint8_t> const& data);
120 
125 std::vector<uint8_t> FZ_PUBLIC_SYMBOL hmac_sha1(std::string_view const& key, std::string_view const& data);
126 std::vector<uint8_t> FZ_PUBLIC_SYMBOL hmac_sha1(std::vector<uint8_t> const& key, std::vector<uint8_t> const& data);
127 std::vector<uint8_t> FZ_PUBLIC_SYMBOL hmac_sha1(std::vector<uint8_t> const& key, std::string_view const& data);
128 std::vector<uint8_t> FZ_PUBLIC_SYMBOL hmac_sha1(std::string_view const& key, std::vector<uint8_t> const& data);
129 
131 std::vector<uint8_t> FZ_PUBLIC_SYMBOL hmac_sha256(std::string_view const& key, std::string_view const& data);
132 std::vector<uint8_t> FZ_PUBLIC_SYMBOL hmac_sha256(std::vector<uint8_t> const& key, std::vector<uint8_t> const& data);
133 std::vector<uint8_t> FZ_PUBLIC_SYMBOL hmac_sha256(std::vector<uint8_t> const& key, std::string_view const& data);
134 std::vector<uint8_t> FZ_PUBLIC_SYMBOL hmac_sha256(std::string_view const& key, std::vector<uint8_t> const& data);
135 
136 std::vector<uint8_t> FZ_PUBLIC_SYMBOL pbkdf2_hmac_sha256(std::basic_string_view<uint8_t> const& password, std::basic_string_view<uint8_t> const& salt, size_t length, unsigned int iterations);
137 
138 template <typename PasswordContainer, typename SaltContainer,
139  std::enable_if_t<sizeof(typename PasswordContainer::value_type) == sizeof(uint8_t) &&
140  sizeof(typename SaltContainer::value_type) == sizeof(uint8_t)>* = nullptr>
141 std::vector<uint8_t> pbkdf2_hmac_sha256(PasswordContainer const& password, SaltContainer const& salt, size_t length, unsigned int iterations)
142 {
143  return pbkdf2_hmac_sha256(std::basic_string_view<uint8_t>(reinterpret_cast<uint8_t const*>(password.data()), password.size()),
144  std::basic_string_view<uint8_t>(reinterpret_cast<uint8_t const*>(salt.data()), salt.size()),
145  length, iterations);
146 }
147 }
148 
149 #endif
std::vector< uint8_t > md5(std::string_view const &data)
Standard MD5.
std::vector< uint8_t > hmac_sha1(std::string_view const &key, std::string_view const &data)
Standard HMAC using SHA1.
std::vector< uint8_t > sha512(std::string_view const &data)
Standard SHA512.
std::vector< uint8_t > hmac_sha256(std::string_view const &key, std::string_view const &data)
Standard HMAC using SHA256.
hash_algorithm
List of supported hashing algorithms.
Definition: hash.hpp:16
std::vector< uint8_t > sha1(std::string_view const &data)
Standard SHA1.
Accumulator for hashing large amounts of data.
Definition: hash.hpp:41
size_t get_digest_size(hash_algorithm)
Returns digest size in bytes.
std::vector< uint8_t > sha384(std::string_view const &data)
Standard SHA384.
The namespace used by libfilezilla.
Definition: apply.hpp:17
Sets some global macros and further includes string.hpp.
The buffer class is a simple buffer where data can be appended at the end and consumed at the front...
Definition: buffer.hpp:26
std::vector< uint8_t > sha256(std::string_view const &data)
Standard SHA256.