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