Electroneum
Loading...
Searching...
No Matches
hash.h
Go to the documentation of this file.
1// Copyrights(c) 2017-2021, The Electroneum Project
2// Copyrights(c) 2014-2019, The Monero Project
3//
4// All rights reserved.
5//
6// Redistribution and use in source and binary forms, with or without modification, are
7// permitted provided that the following conditions are met:
8//
9// 1. Redistributions of source code must retain the above copyright notice, this list of
10// conditions and the following disclaimer.
11//
12// 2. Redistributions in binary form must reproduce the above copyright notice, this list
13// of conditions and the following disclaimer in the documentation and/or other
14// materials provided with the distribution.
15//
16// 3. Neither the name of the copyright holder nor the names of its contributors may be
17// used to endorse or promote products derived from this software without specific
18// prior written permission.
19//
20// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
21// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
22// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
23// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
27// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
28// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29//
30// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
31
32#pragma once
33
34#include <stddef.h>
35#include <iostream>
36#include <boost/utility/value_init.hpp>
39#include "generic-ops.h"
40#include "hex.h"
41#include "span.h"
42
43namespace crypto {
44
45 extern "C" {
46#include "hash-ops.h"
47 }
48
49#pragma pack(push, 1)
51 char data[HASH_SIZE];
52 };
54 char data[8];
55 };
57 char data[64];
58 };
59#pragma pack(pop)
60
61 static_assert(sizeof(hash) == HASH_SIZE, "Invalid structure size");
62 static_assert(sizeof(hash8) == 8, "Invalid structure size");
63 static_assert(sizeof(hash64) == 64, "Invalid structure size");
64
65 /*
66 Cryptonight hash functions
67 */
68
69 inline void cn_fast_hash(const void *data, std::size_t length, hash &hash) {
70 cn_fast_hash(data, length, reinterpret_cast<char *>(&hash));
71 }
73 inline hash cn_fast_hash(const void *data, std::size_t length) {
74 hash h;
75 cn_fast_hash(data, length, reinterpret_cast<char *>(&h));
76 return h;
77 }
79 inline void cn_slow_hash(const void *data, std::size_t length, hash &hash, int variant = 0, uint64_t height = 0) {
80 cn_slow_hash(data, length, reinterpret_cast<char *>(&hash), variant, 0/*prehashed*/, height);
81 }
83 inline void cn_slow_hash_prehashed(const void *data, std::size_t length, hash &hash, int variant = 0, uint64_t height = 0) {
84 cn_slow_hash(data, length, reinterpret_cast<char *>(&hash), variant, 1/*prehashed*/, height);
85 }
87 inline void tree_hash(const hash *hashes, std::size_t count, hash &root_hash) {
88 tree_hash(reinterpret_cast<const char (*)[HASH_SIZE]>(hashes), count, reinterpret_cast<char *>(&root_hash));
89 }
91 inline std::ostream &operator <<(std::ostream &o, const crypto::hash &v) {
93 }
94 inline std::ostream &operator <<(std::ostream &o, const crypto::hash8 &v) {
96 }
97 inline std::ostream &operator <<(std::ostream &o, const crypto::hash64 &v) {
99 }
100
101 const static crypto::hash null_hash = boost::value_initialized<crypto::hash>();
102 const static crypto::hash8 null_hash8 = boost::value_initialized<crypto::hash8>();
103 const static crypto::hash64 null_hash64 = boost::value_initialized<crypto::hash64>();
104}
105
uint64_t height
#define CRYPTO_MAKE_COMPARABLE(type)
Definition generic-ops.h:39
#define CRYPTO_MAKE_HASHABLE(type)
Definition generic-ops.h:76
crypto namespace.
Definition crypto.cpp:58
void cn_slow_hash_prehashed(const void *data, std::size_t length, hash &hash, int variant=0, uint64_t height=0)
Definition hash.h:83
void cn_fast_hash(const void *data, size_t length, char *hash)
POD_CLASS hash8
Definition hash.h:53
void cn_slow_hash(const void *data, size_t length, char *hash, int variant, int prehashed, uint64_t height)
unsigned __int64 uint64_t
Definition hash.h:137
void tree_hash(const char(*hashes)[HASH_SIZE], size_t count, char *root_hash)
std::ostream & operator<<(std::ostream &o, const crypto::public_key &v)
Definition crypto.h:357
POD_CLASS hash64
Definition hash.h:56
POD_CLASS hash
Definition hash.h:50
@ HASH_SIZE
Definition hash.h:78
span< const std::uint8_t > as_byte_span(const T &src) noexcept
Definition span.h:153
#define POD_CLASS
Definition pod-class.h:44
static void formatted(std::ostream &out, const span< const std::uint8_t > src)
Append < + src + > as hex to out.
Definition hex.cpp:76
struct hash_func hashes[]