rijndael_policy.hpp
Go to the documentation of this file.
1 //---------------------------------------------------------------------------//
2 // Copyright (c) 2018-2020 Mikhail Komarov <nemo@nil.foundation>
3 //
4 // MIT License
5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal
8 // in the Software without restriction, including without limitation the rights
9 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 // copies of the Software, and to permit persons to whom the Software is
11 // furnished to do so, subject to the following conditions:
12 //
13 // The above copyright notice and this permission notice shall be included in all
14 // copies or substantial portions of the Software.
15 //
16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 // SOFTWARE.
23 //---------------------------------------------------------------------------//
24 
25 #ifndef CRYPTO3_RIJNDAEL_POLICY_HPP
26 #define CRYPTO3_RIJNDAEL_POLICY_HPP
27 
29 
30 namespace nil {
31  namespace crypto3 {
32  namespace block {
33  namespace detail {
34  template<std::size_t KeyBits, std::size_t BlockBits>
35  struct basic_rijndael_policy : rijndael_functions<32, BlockBits> {
36  constexpr static const std::size_t byte_bits = rijndael_functions<32, BlockBits>::byte_bits;
38 
39  constexpr static const std::size_t word_bits = rijndael_functions<32, BlockBits>::word_bits;
40  constexpr static const std::size_t word_bytes = rijndael_functions<32, BlockBits>::word_bytes;
42 
43  constexpr static const std::size_t block_bits = BlockBits;
44  constexpr static const std::size_t block_bytes = BlockBits / byte_bits;
45  constexpr static const std::size_t block_words = block_bits / word_bits;
46  typedef std::array<byte_type, block_bytes> block_type;
47 
48  constexpr static const std::size_t key_bits = KeyBits;
49  constexpr static const std::size_t key_words = key_bits / word_bits;
50  constexpr static const std::size_t key_bytes = word_bytes * key_words;
51  typedef std::array<byte_type, key_bytes> key_type;
52 
53  constexpr static const std::size_t round_constants_size = 30;
54  typedef std::array<byte_type, round_constants_size> round_constants_type;
55 
56  BOOST_ALIGNMENT(64) constexpr static const round_constants_type round_constants = {
57  0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,
58  0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91};
59 
60  constexpr static const std::size_t shift_offsets_size = 3;
61  typedef std::array<byte_type, shift_offsets_size> shift_offsets_type;
62 
63  constexpr static const shift_offsets_type shift_offsets = {1, block_words == 8 ? 3 : 2,
64  block_words > 6 ? 4 : 3};
65 
66  constexpr static const shift_offsets_type inverted_shift_offsets = {
67  block_words - 1, block_words == 8 ? 5 : block_words - 2,
68  block_words == 8 ? 4 : block_words == 7 ? 3 : block_words - 3};
69 
70  constexpr static const std::size_t mm_size = 16;
71  typedef std::array<byte_type, mm_size> mm_type;
72 
73  constexpr static const mm_type mm = {0x02, 0x03, 0x01, 0x01, 0x01, 0x02, 0x03, 0x01,
74  0x01, 0x01, 0x02, 0x03, 0x03, 0x01, 0x01, 0x02};
75 
76  constexpr static const mm_type inverted_mm = {0x0e, 0x0b, 0x0d, 0x09, 0x09, 0x0e, 0x0b, 0x0d,
77  0x0d, 0x09, 0x0e, 0x0b, 0x0b, 0x0d, 0x09, 0x0e};
78 
79  constexpr static const std::size_t constants_size =
84 
85  BOOST_ALIGNMENT(64) constexpr static const constants_type constants = {
86  0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
87  0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
88  0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
89  0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
90  0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
91  0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
92  0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
93  0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
94  0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
95  0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
96  0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
97  0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
98  0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
99  0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
100  0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
101  0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16};
102 
103  BOOST_ALIGNMENT(64) constexpr static constants_type const inverted_constants = {
104  0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
105  0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
106  0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
107  0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
108  0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
109  0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
110  0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
111  0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
112  0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
113  0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
114  0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
115  0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
116  0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
117  0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
118  0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
119  0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d};
120  };
121 
122  template<std::size_t KeyBits, std::size_t BlockBits>
123  BOOST_ALIGNMENT(64) constexpr typename basic_rijndael_policy<KeyBits, BlockBits>::round_constants_type const
124  basic_rijndael_policy<KeyBits, BlockBits>::round_constants;
125 
126  template<std::size_t KeyBits, std::size_t BlockBits>
127  BOOST_ALIGNMENT(64) constexpr typename basic_rijndael_policy<KeyBits, BlockBits>::constants_type const
128  basic_rijndael_policy<KeyBits, BlockBits>::constants;
129 
130  template<std::size_t KeyBits, std::size_t BlockBits>
131  BOOST_ALIGNMENT(64) constexpr typename basic_rijndael_policy<KeyBits, BlockBits>::constants_type const
132  basic_rijndael_policy<KeyBits, BlockBits>::inverted_constants;
133 
134  template<std::size_t KeyBits, std::size_t BlockBits>
135  constexpr typename basic_rijndael_policy<KeyBits, BlockBits>::shift_offsets_type const
136  basic_rijndael_policy<KeyBits, BlockBits>::shift_offsets;
137 
138  template<std::size_t KeyBits, std::size_t BlockBits>
139  constexpr typename basic_rijndael_policy<KeyBits, BlockBits>::shift_offsets_type const
140  basic_rijndael_policy<KeyBits, BlockBits>::inverted_shift_offsets;
141 
142  template<std::size_t KeyBits, std::size_t BlockBits>
143  constexpr typename basic_rijndael_policy<KeyBits, BlockBits>::mm_type const
144  basic_rijndael_policy<KeyBits, BlockBits>::mm;
145 
146  template<std::size_t KeyBits, std::size_t BlockBits>
147  constexpr typename basic_rijndael_policy<KeyBits, BlockBits>::mm_type const
148  basic_rijndael_policy<KeyBits, BlockBits>::inverted_mm;
149 
150  template<std::size_t KeyBits, std::size_t BlockBits>
151  struct rijndael_policy : public basic_rijndael_policy<KeyBits, BlockBits> {
152  constexpr static const std::size_t word_bits = basic_rijndael_policy<KeyBits, BlockBits>::word_bits;
153  constexpr static const std::size_t word_bytes =
156 
157  constexpr static const std::size_t block_bits =
159  constexpr static const std::size_t block_words =
161 
162  constexpr static const std::size_t key_bits = basic_rijndael_policy<KeyBits, BlockBits>::key_bits;
163  constexpr static const std::size_t key_words = basic_rijndael_policy<KeyBits, BlockBits>::key_words;
164 
165  constexpr static const std::uint8_t rounds =
166  (key_words > block_words ? key_words : block_words) + 6;
167  constexpr static const std::size_t key_schedule_words =
169  constexpr static const std::size_t key_schedule_bytes = key_schedule_words * word_bytes;
170 
171  typedef
172  typename ::nil::crypto3::detail::basic_functions<word_bits>::word_type key_schedule_word_type;
173  typedef std::array<key_schedule_word_type, key_schedule_words> key_schedule_type;
174  };
175 
176  template<std::size_t KeyBits>
178  } // namespace detail
179  } // namespace block
180  } // namespace crypto3
181 } // namespace nil
182 
183 #endif // CRYPTO3_RIJNDAEL_POLICY_HPP
boost::mpl::apply< AccumulatorSet, tag::block< Mode > >::type::result_type block(const AccumulatorSet &acc)
Definition: accumulators/block.hpp:259
BOOST_ALIGNMENT(64) const expr typename basic_rijndael_policy< KeyBits
Definition: pair.hpp:31
Definition: rijndael_policy.hpp:35
std::array< byte_type, key_bytes > key_type
Definition: rijndael_policy.hpp:51
constexpr static const std::size_t constants_size
Definition: rijndael_policy.hpp:79
std::array< byte_type, shift_offsets_size > shift_offsets_type
Definition: rijndael_policy.hpp:61
constexpr static const std::size_t block_bits
Definition: rijndael_policy.hpp:43
rijndael_functions< 32, block_bits >::prefetched_constants_type prefetched_constants_type
Definition: rijndael_policy.hpp:83
constexpr static const std::size_t block_bytes
Definition: rijndael_policy.hpp:44
std::array< byte_type, round_constants_size > round_constants_type
Definition: rijndael_policy.hpp:54
constexpr static const std::size_t shift_offsets_size
Definition: rijndael_policy.hpp:60
rijndael_functions< 32, BlockBits >::word_type word_type
Definition: rijndael_policy.hpp:41
constexpr static const std::size_t round_constants_size
Definition: rijndael_policy.hpp:53
constexpr static const std::size_t mm_size
Definition: rijndael_policy.hpp:70
rijndael_functions< 32, BlockBits >::byte_type byte_type
Definition: rijndael_policy.hpp:37
constexpr static const shift_offsets_type shift_offsets
Definition: rijndael_policy.hpp:63
constexpr static const std::size_t key_bytes
Definition: rijndael_policy.hpp:50
constexpr static const std::size_t word_bits
Definition: rijndael_policy.hpp:39
constexpr static const std::size_t byte_bits
Definition: rijndael_policy.hpp:36
constexpr static const std::size_t key_bits
Definition: rijndael_policy.hpp:48
constexpr static const std::size_t word_bytes
Definition: rijndael_policy.hpp:40
constexpr static const mm_type inverted_mm
Definition: rijndael_policy.hpp:76
rijndael_functions< 32, block_bits >::constants_type constants_type
Definition: rijndael_policy.hpp:81
BOOST_ALIGNMENT(64) const expr static const constants_type const ants
Definition: rijndael_policy.hpp:85
std::array< byte_type, block_bytes > block_type
Definition: rijndael_policy.hpp:46
std::array< byte_type, mm_size > mm_type
Definition: rijndael_policy.hpp:71
BOOST_ALIGNMENT(64) const expr static const round_constants_type round_constants
Definition: rijndael_policy.hpp:56
constexpr static const std::size_t key_words
Definition: rijndael_policy.hpp:49
constexpr static const std::size_t block_words
Definition: rijndael_policy.hpp:45
BOOST_ALIGNMENT(64) const expr static const ants_type const inverted_constants
Definition: rijndael_policy.hpp:103
constexpr static const mm_type mm
Definition: rijndael_policy.hpp:73
constexpr static const shift_offsets_type inverted_shift_offsets
Definition: rijndael_policy.hpp:66
Definition: rijndael_functions.hpp:39
std::array< byte_type, constants_size > constants_type
Definition: rijndael_functions.hpp:50
std::array< word_type, constants_size > prefetched_constants_type
Definition: rijndael_functions.hpp:51
Definition: rijndael_policy.hpp:151
basic_rijndael_policy< KeyBits, BlockBits >::word_type word_type
Definition: rijndael_policy.hpp:155
std::array< key_schedule_word_type, key_schedule_words > key_schedule_type
Definition: rijndael_policy.hpp:173
typename ::nil::crypto3::detail::basic_functions< word_bits >::word_type key_schedule_word_type
Definition: rijndael_policy.hpp:172