The Battle for Wesnoth  1.17.0-dev
hash.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2008 - 2021
3  by Thomas Baumhauer <thomas.baumhauer@NOSPAMgmail.com>
4  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY.
12 
13  See the COPYING file for more details.
14 */
15 
16 #pragma once
17 
18 #include <array>
19 #include <cstdint>
20 #include <string>
21 
22 #include "exceptions.hpp"
23 
24 // Not configurable. The size (64) is both hard-, and implicitly-coded in crypt_blowfish
25 static const int BCRYPT_HASHSIZE = 64;
26 
27 namespace utils {
28 
29 struct hash_error : public game::error
30 {
31  hash_error(const std::string& message) : game::error(message) {}
32 };
33 
34 class hash_base
35 {
36 public:
37  virtual std::string base64_digest() const = 0;
38  virtual std::string hex_digest() const = 0;
39  virtual ~hash_base() {}
40 };
41 
42 template<std::size_t sz, typename T = uint8_t>
43 class hash_digest : public hash_base
44 {
45 protected:
46  std::array<T, sz> hash;
47 public:
48  static const int DIGEST_SIZE = sz;
49  std::array<T, sz> raw_digest() const {return hash;}
50 };
51 
52 class md5 : public hash_digest<16>
53 {
54 public:
55  static int get_iteration_count(const std::string& hash);
56  static std::string get_salt(const std::string& hash);
57  static bool is_valid_prefix(const std::string& hash);
58  static bool is_valid_hash(const std::string& hash);
59  explicit md5(const std::string& input);
60  md5(const std::string& input, const std::string& salt, int iteration_count = 10);
61  virtual std::string base64_digest() const override;
62  virtual std::string hex_digest() const override;
63 };
64 
65 class sha1 : public hash_digest<20>
66 {
67 public:
68  explicit sha1(const std::string& input);
69  virtual std::string base64_digest() const override;
70  virtual std::string hex_digest() const override;
71 };
72 
73 class bcrypt : public hash_digest<BCRYPT_HASHSIZE, char>
74 {
75  bcrypt() {}
76  bcrypt(const std::string& input);
77 
78 public:
79  static bcrypt from_salted_salt(const std::string& input);
80  static bcrypt from_hash_string(const std::string& input);
81  static bcrypt hash_pw(const std::string& password, bcrypt& salt);
82 
84 
85  static bool is_valid_prefix(const std::string& hash);
86  std::string get_salt() const;
87  virtual std::string hex_digest() const override;
88  virtual std::string base64_digest() const override;
89 };
90 
91 } // namespace utils
std::array< T, sz > raw_digest() const
Definition: hash.hpp:49
std::array< T, sz > hash
Definition: hash.hpp:46
hash_error(const std::string &message)
Definition: hash.hpp:31
static const int BCRYPT_HASHSIZE
Definition: hash.hpp:25
std::string password(const std::string &server, const std::string &login)
std::size_t iteration_count_delim_pos
Definition: hash.hpp:83
virtual ~hash_base()
Definition: hash.hpp:39
Base class for all the errors encountered by the engine.
Definition: exceptions.hpp:28
std::string message
Definition: exceptions.hpp:30