tiger_functions.hpp
Go to the documentation of this file.
1 //---------------------------------------------------------------------------//
2 // Copyright (c) 2018-2020 Mikhail Komarov <nemo@nil.foundation>
3 // Copyright (c) 2020 Pavel Kharitonov <ipavrus@nil.foundation>
4 //
5 // MIT License
6 //
7 // Permission is hereby granted, free of charge, to any person obtaining a copy
8 // of this software and associated documentation files (the "Software"), to deal
9 // in the Software without restriction, including without limitation the rights
10 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 // copies of the Software, and to permit persons to whom the Software is
12 // furnished to do so, subject to the following conditions:
13 //
14 // The above copyright notice and this permission notice shall be included in all
15 // copies or substantial portions of the Software.
16 //
17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 // SOFTWARE.
24 //---------------------------------------------------------------------------//
25 
26 #ifndef CRYPTO3_TIGER_FUNCTIONS_HPP
27 #define CRYPTO3_TIGER_FUNCTIONS_HPP
28 
30 #include <nil/crypto3/detail/make_uint_t.hpp>
31 
32 namespace nil {
33  namespace crypto3 {
34  namespace hashes {
35  namespace detail {
36  template<std::size_t DigestBits>
37  struct tiger_functions : public basic_tiger_policy<DigestBits> {
39 
41 
42  constexpr static const std::size_t word_bits = policy_type::word_bits;
44 
45  constexpr static const std::size_t state_bits = basic_tiger_policy<DigestBits>::state_bits;
46  constexpr static const std::size_t state_words = basic_tiger_policy<DigestBits>::state_words;
48 
49  constexpr static const std::size_t block_bits = basic_tiger_policy<DigestBits>::block_bits;
50  constexpr static const std::size_t block_words = basic_tiger_policy<DigestBits>::block_words;
52 
53  inline static void mix(block_type &X) {
54  X[0] -= X[7] ^ 0xA5A5A5A5A5A5A5A5;
55  X[1] ^= X[0];
56  X[2] += X[1];
57  X[3] -= X[2] ^ ((~X[1]) << 19);
58  X[4] ^= X[3];
59  X[5] += X[4];
60  X[6] -= X[5] ^ ((~X[4]) >> 23);
61  X[7] ^= X[6];
62 
63  X[0] += X[7];
64  X[1] -= X[0] ^ ((~X[7]) << 19);
65  X[2] ^= X[1];
66  X[3] += X[2];
67  X[4] -= X[3] ^ ((~X[2]) >> 23);
68  X[5] ^= X[4];
69  X[6] += X[5];
70  X[7] -= X[6] ^ 0x0123456789ABCDEF;
71  }
72 
73  inline static void pass(word_type &A, word_type &B, word_type &C, block_type &X, byte_type mul) {
74  C ^= X[0];
75  A -= policy_type::sbox1[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 7)] ^
76  policy_type::sbox2[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 5)] ^
77  policy_type::sbox3[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 3)] ^
78  policy_type::sbox4[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 1)];
79  B += policy_type::sbox1[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 0)] ^
80  policy_type::sbox2[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 2)] ^
81  policy_type::sbox3[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 4)] ^
82  policy_type::sbox4[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 6)];
83  B *= mul;
84  A ^= X[1];
85  B -= policy_type::sbox1[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 7)] ^
86  policy_type::sbox2[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 5)] ^
87  policy_type::sbox3[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 3)] ^
88  policy_type::sbox4[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 1)];
89  C += policy_type::sbox1[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 0)] ^
90  policy_type::sbox2[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 2)] ^
91  policy_type::sbox3[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 4)] ^
92  policy_type::sbox4[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 6)];
93  C *= mul;
94  B ^= X[2];
95  C -= policy_type::sbox1[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(B, 7)] ^
96  policy_type::sbox2[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(B, 5)] ^
97  policy_type::sbox3[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(B, 3)] ^
98  policy_type::sbox4[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(B, 1)];
99  A += policy_type::sbox1[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(B, 0)] ^
100  policy_type::sbox2[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(B, 2)] ^
101  policy_type::sbox3[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(B, 4)] ^
102  policy_type::sbox4[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(B, 6)];
103  A *= mul;
104  C ^= X[3];
105  A -= policy_type::sbox1[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 7)] ^
106  policy_type::sbox2[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 5)] ^
107  policy_type::sbox3[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 3)] ^
108  policy_type::sbox4[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 1)];
109  B += policy_type::sbox1[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 0)] ^
110  policy_type::sbox2[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 2)] ^
111  policy_type::sbox3[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 4)] ^
112  policy_type::sbox4[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 6)];
113  B *= mul;
114  A ^= X[4];
115  B -= policy_type::sbox1[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 7)] ^
116  policy_type::sbox2[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 5)] ^
117  policy_type::sbox3[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 3)] ^
118  policy_type::sbox4[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 1)];
119  C += policy_type::sbox1[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 0)] ^
120  policy_type::sbox2[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 2)] ^
121  policy_type::sbox3[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 4)] ^
122  policy_type::sbox4[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 6)];
123  C *= mul;
124  B ^= X[5];
125  C -= policy_type::sbox1[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(B, 7)] ^
126  policy_type::sbox2[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(B, 5)] ^
127  policy_type::sbox3[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(B, 3)] ^
128  policy_type::sbox4[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(B, 1)];
129  A += policy_type::sbox1[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(B, 0)] ^
130  policy_type::sbox2[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(B, 2)] ^
131  policy_type::sbox3[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(B, 4)] ^
132  policy_type::sbox4[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(B, 6)];
133  A *= mul;
134  C ^= X[6];
135  A -= policy_type::sbox1[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 7)] ^
136  policy_type::sbox2[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 5)] ^
137  policy_type::sbox3[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 3)] ^
138  policy_type::sbox4[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 1)];
139  B += policy_type::sbox1[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 0)] ^
140  policy_type::sbox2[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 2)] ^
141  policy_type::sbox3[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 4)] ^
142  policy_type::sbox4[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(C, 6)];
143  B *= mul;
144  A ^= X[7];
145  B -= policy_type::sbox1[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 7)] ^
146  policy_type::sbox2[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 5)] ^
147  policy_type::sbox3[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 3)] ^
148  policy_type::sbox4[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 1)];
149  C += policy_type::sbox1[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 0)] ^
150  policy_type::sbox2[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 2)] ^
151  policy_type::sbox3[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 4)] ^
152  policy_type::sbox4[::nil::crypto3::detail::extract_uint_t<CHAR_BIT>(A, 6)];
153  C *= mul;
154  }
155  };
156  } // namespace detail
157  } // namespace hashes
158  } // namespace crypto3
159 } // namespace nil
160 
161 #endif // CRYPTO3_TIGER_FUNCTIONS_HPP
Definition: pair.hpp:31
boost::uint_t< word_bits >::exact word_type
Definition: block/include/nil/crypto3/detail/basic_functions.hpp:42
boost::uint_t< byte_bits >::exact byte_type
Definition: block/include/nil/crypto3/detail/basic_functions.hpp:39
Definition: basic_tiger_policy.hpp:36
constexpr static const substitution_type sbox2
Definition: basic_tiger_policy.hpp:119
policy_type::word_type word_type
Definition: basic_tiger_policy.hpp:40
std::array< word_type, block_words > block_type
Definition: basic_tiger_policy.hpp:44
constexpr static const substitution_type sbox3
Definition: basic_tiger_policy.hpp:185
std::array< word_type, state_words > state_type
Definition: basic_tiger_policy.hpp:48
constexpr static const substitution_type sbox4
Definition: basic_tiger_policy.hpp:251
constexpr static const substitution_type sbox1
Definition: basic_tiger_policy.hpp:53
constexpr static const std::size_t word_bits
Definition: basic_tiger_policy.hpp:39
Definition: tiger_functions.hpp:37
policy_type::word_type word_type
Definition: tiger_functions.hpp:43
constexpr static const std::size_t state_words
Definition: tiger_functions.hpp:46
constexpr static const std::size_t block_words
Definition: tiger_functions.hpp:50
static void mix(block_type &X)
Definition: tiger_functions.hpp:53
basic_tiger_policy< DigestBits >::state_type state_type
Definition: tiger_functions.hpp:47
basic_tiger_policy< DigestBits >::block_type block_type
Definition: tiger_functions.hpp:51
constexpr static const std::size_t word_bits
Definition: tiger_functions.hpp:42
policy_type::byte_type byte_type
Definition: tiger_functions.hpp:40
constexpr static const std::size_t state_bits
Definition: tiger_functions.hpp:45
basic_tiger_policy< DigestBits > policy_type
Definition: tiger_functions.hpp:38
static void pass(word_type &A, word_type &B, word_type &C, block_type &X, byte_type mul)
Definition: tiger_functions.hpp:73
constexpr static const std::size_t block_bits
Definition: tiger_functions.hpp:49