Skip to content

Commit 0139078

Browse files
authored
Merge pull request #239 from cppalliance/consteval_drbg
Add `consteval` testing of DRBGs and change default parameters for consteval spans
2 parents 3302f72 + 4d3e055 commit 0139078

File tree

6 files changed

+202
-44
lines changed

6 files changed

+202
-44
lines changed

include/boost/crypt2/drbg/detail/hash_drbg.hpp

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -68,29 +68,29 @@ class hash_drbg
6868
compat::uint64_t reseed_counter_ {};
6969
bool initialized_ {};
7070

71-
template <compat::size_t ExtentReturn = compat::dynamic_extent,
72-
compat::size_t Extent1 = compat::dynamic_extent,
73-
compat::size_t Extent2 = compat::dynamic_extent,
74-
compat::size_t Extent3 = compat::dynamic_extent,
75-
compat::size_t Extent4 = compat::dynamic_extent>
71+
template <compat::size_t ExtentReturn,
72+
compat::size_t Extent1,
73+
compat::size_t Extent2 = 0U,
74+
compat::size_t Extent3 = 0U,
75+
compat::size_t Extent4 = 0U>
7676
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR auto hash_df(compat::uint32_t no_of_bits_to_return,
7777
compat::span<compat::byte, ExtentReturn> return_container,
7878
compat::span<const compat::byte, Extent1> provided_data_1,
7979
compat::span<const compat::byte, Extent2> provided_data_2 = compat::span<const compat::byte, 0U> {},
8080
compat::span<const compat::byte, Extent3> provided_data_3 = compat::span<const compat::byte, 0U> {},
8181
compat::span<const compat::byte, Extent4> provided_data_4 = compat::span<const compat::byte, 0U> {}) noexcept -> state;
8282

83-
template <compat::size_t Extent = compat::dynamic_extent>
83+
template <compat::size_t Extent>
8484
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR auto hashgen(compat::span<compat::byte, Extent> returned_bits, compat::size_t requested_number_of_bytes) noexcept -> state;
8585

86-
template <compat::size_t Extent1 = compat::dynamic_extent,
87-
compat::size_t Extent2 = compat::dynamic_extent>
86+
template <compat::size_t Extent1,
87+
compat::size_t Extent2 = 0U>
8888
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR auto no_pr_generate_impl(compat::span<compat::byte, Extent1> return_data, compat::size_t requested_bits,
8989
compat::span<const compat::byte, Extent2> additional_data = compat::span<const compat::byte, 0U> {}) noexcept -> state;
9090

91-
template <compat::size_t Extent1 = compat::dynamic_extent,
92-
compat::size_t Extent2 = compat::dynamic_extent,
93-
compat::size_t Extent3 = compat::dynamic_extent>
91+
template <compat::size_t Extent1,
92+
compat::size_t Extent2,
93+
compat::size_t Extent3 = 0U>
9494
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR auto pr_generate_impl(compat::span<compat::byte, Extent1> return_data, compat::size_t requested_bits,
9595
compat::span<const compat::byte, Extent2> entropy,
9696
compat::span<const compat::byte, Extent3> additional_data = compat::span<const compat::byte, 0U> {}) noexcept -> state;
@@ -100,43 +100,43 @@ class hash_drbg
100100

101101
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR ~hash_drbg() noexcept;
102102

103-
template <compat::size_t Extent1 = compat::dynamic_extent,
104-
compat::size_t Extent2 = compat::dynamic_extent,
105-
compat::size_t Extent3 = compat::dynamic_extent>
103+
template <compat::size_t Extent1,
104+
compat::size_t Extent2 = 0U,
105+
compat::size_t Extent3 = 0U>
106106
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR auto init(compat::span<const compat::byte, Extent1> entropy,
107-
compat::span<const compat::byte, Extent2> nonce = compat::span<compat::byte, 0>{},
108-
compat::span<const compat::byte, Extent3> personalization = compat::span<compat::byte, 0>{}) noexcept -> state;
107+
compat::span<const compat::byte, Extent2> nonce = compat::span<const compat::byte, 0>{},
108+
compat::span<const compat::byte, Extent3> personalization = compat::span<const compat::byte, 0>{}) noexcept -> state;
109109

110110
template <concepts::sized_range SizedRange1,
111111
concepts::sized_range SizedRange2,
112-
concepts::sized_range SizedRange3 = compat::array<compat::byte, 0U>>
112+
concepts::sized_range SizedRange3 = compat::span<const compat::byte, 0U>>
113113
BOOST_CRYPT_GPU_ENABLED auto init(SizedRange1&& entropy,
114-
SizedRange2&& nonce = compat::array<compat::byte, 0U> {},
115-
SizedRange3&& personalization = compat::array<compat::byte, 0U> {}) noexcept -> state;
114+
SizedRange2&& nonce = compat::span<const compat::byte, 0U> {},
115+
SizedRange3&& personalization = compat::span<const compat::byte, 0U> {}) noexcept -> state;
116116

117-
template <compat::size_t Extent1 = compat::dynamic_extent,
118-
compat::size_t Extent2 = compat::dynamic_extent>
117+
template <compat::size_t Extent1,
118+
compat::size_t Extent2 = 0U>
119119
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR auto reseed(compat::span<const compat::byte, Extent1> entropy,
120-
compat::span<const compat::byte, Extent2> additional_input = compat::span<compat::byte, 0>{}) noexcept -> state;
120+
compat::span<const compat::byte, Extent2> additional_input = compat::span<const compat::byte, 0>{}) noexcept -> state;
121121

122122
template <concepts::sized_range SizedRange1,
123-
concepts::sized_range SizedRange2 = compat::array<compat::byte, 0U>>
123+
concepts::sized_range SizedRange2 = compat::span<const compat::byte, 0U>>
124124
BOOST_CRYPT_GPU_ENABLED auto reseed(SizedRange1&& entropy,
125-
SizedRange2&& additional_input = compat::array<compat::byte, 0U> {}) noexcept -> state;
125+
SizedRange2&& additional_input = compat::span<const compat::byte, 0U> {}) noexcept -> state;
126126

127127
template <compat::size_t Extent1,
128-
compat::size_t Extent2 = compat::dynamic_extent,
129-
compat::size_t Extent3 = compat::dynamic_extent>
128+
compat::size_t Extent2 = 0U,
129+
compat::size_t Extent3 = 0U>
130130
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR auto generate(compat::span<compat::byte, Extent1> return_data, compat::size_t requested_bits,
131131
compat::span<const compat::byte, Extent2> additional_data1 = compat::span<const compat::byte, 0U> {},
132132
[[maybe_unused]] compat::span<const compat::byte, Extent3> additional_data2 = compat::span<const compat::byte, 0U> {}) noexcept -> state;
133133

134134
template <concepts::sized_range SizedRange1,
135-
concepts::sized_range SizedRange2 = compat::array<compat::byte, 0U>,
136-
concepts::sized_range SizedRange3 = compat::array<compat::byte, 0U>>
135+
concepts::sized_range SizedRange2 = compat::span<const compat::byte, 0U>,
136+
concepts::sized_range SizedRange3 = compat::span<const compat::byte, 0U>>
137137
BOOST_CRYPT_GPU_ENABLED auto generate(SizedRange1&& return_data, compat::size_t requested_bits,
138-
SizedRange2&& additional_data1 = compat::array<compat::byte, 0U>{},
139-
[[maybe_unused]] SizedRange3&& additional_data2 = compat::array<compat::byte, 0U>{}) noexcept -> state;
138+
SizedRange2&& additional_data1 = compat::span<const compat::byte, 0U>{},
139+
[[maybe_unused]] SizedRange3&& additional_data2 = compat::span<const compat::byte, 0U>{}) noexcept -> state;
140140
};
141141

142142
template <typename HasherType, compat::size_t max_hasher_security, compat::size_t outlen, bool prediction_resistance>
@@ -241,7 +241,7 @@ hash_drbg<HasherType, max_hasher_security, outlen, prediction_resistance>::hashg
241241
}
242242

243243
auto data {value_};
244-
const auto data_span {compat::span<compat::byte, seedlen_bytes>(data)};
244+
const auto data_span {compat::span<const compat::byte, seedlen_bytes>(data)};
245245
compat::size_t offset {};
246246
HasherType hasher;
247247
while (offset < requested_number_of_bytes)

include/boost/crypt2/drbg/detail/hmac_drbg.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ class hmac_drbg
9494
SizedRange2&& nonce = compat::span<const compat::byte, 0U>{},
9595
SizedRange3&& personalization = compat::span<const compat::byte, 0U>{}) noexcept -> state;
9696

97-
template <compat::size_t Extent1, compat::size_t Extent2>
97+
template <compat::size_t Extent1, compat::size_t Extent2 = 0U>
9898
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR auto reseed(compat::span<const compat::byte, Extent1> entropy,
9999
compat::span<const compat::byte, Extent2> additional_input = compat::span<const compat::byte, 0>{}) noexcept -> state;
100100

@@ -103,7 +103,7 @@ class hmac_drbg
103103
BOOST_CRYPT_GPU_ENABLED auto reseed(SizedRange1&& entropy,
104104
SizedRange2&& additional_data = compat::span<const compat::byte, 0U>{}) noexcept -> state;
105105

106-
template <compat::size_t Extent1, compat::size_t Extent2, compat::size_t Extent3>
106+
template <compat::size_t Extent1, compat::size_t Extent2 = 0U, compat::size_t Extent3 = 0U>
107107
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR auto generate(compat::span<compat::byte, Extent1> return_data, compat::size_t requested_bits,
108108
compat::span<const compat::byte, Extent2> additional_data_1 = compat::span<const compat::byte, 0U>{},
109109
compat::span<const compat::byte, Extent3> additional_data_2 = compat::span<const compat::byte, 0U>{}) noexcept -> state;

include/boost/crypt2/hash/detail/sha3_base.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ class sha3_base final {
3737

3838
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR auto process_message_block() noexcept -> void;
3939

40-
template <compat::size_t Extent = compat::dynamic_extent>
40+
template <compat::size_t Extent>
4141
[[nodiscard]] BOOST_CRYPT_GPU_ENABLED_CONSTEXPR
4242
auto update(compat::span<const compat::byte, Extent> data) noexcept -> state;
4343

44-
template <compat::size_t Extent = compat::dynamic_extent>
44+
template <compat::size_t Extent>
4545
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR
4646
auto xof_digest_impl(compat::span<compat::byte, Extent> data, compat::size_t amount) noexcept -> void;
4747

@@ -59,7 +59,7 @@ class sha3_base final {
5959

6060
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR auto init() noexcept -> void;
6161

62-
template <compat::size_t Extent = compat::dynamic_extent>
62+
template <compat::size_t Extent>
6363
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR auto process_bytes(compat::span<const compat::byte, Extent> data) noexcept -> state;
6464

6565
template <concepts::sized_range SizedRange>
@@ -74,7 +74,7 @@ class sha3_base final {
7474
[[nodiscard("Digest is the function return value")]] BOOST_CRYPT_GPU_ENABLED_CONSTEXPR
7575
compat::enable_if_t<Const, compat::expected<return_type, state>> get_digest() const noexcept;
7676

77-
template <bool Const = !is_xof, compat::size_t Extent = compat::dynamic_extent>
77+
template <bool Const = !is_xof, compat::size_t Extent>
7878
[[nodiscard]] BOOST_CRYPT_GPU_ENABLED_CONSTEXPR
7979
compat::enable_if_t<Const, state> get_digest(compat::span<compat::byte, Extent> data) const noexcept;
8080

@@ -87,15 +87,15 @@ class sha3_base final {
8787
[[nodiscard("Digest is the function return value")]] BOOST_CRYPT_GPU_ENABLED_CONSTEXPR
8888
compat::enable_if_t<Const, compat::expected<return_type, state>> get_digest() noexcept;
8989

90-
template <bool Const = is_xof, compat::size_t Extent = compat::dynamic_extent>
90+
template <bool Const = is_xof, compat::size_t Extent>
9191
[[nodiscard]] BOOST_CRYPT_GPU_ENABLED_CONSTEXPR
9292
compat::enable_if_t<Const, state> get_digest(compat::span<compat::byte, Extent> data) noexcept;
9393

9494
template <bool Const = is_xof, concepts::writable_output_range Range>
9595
[[nodiscard]] BOOST_CRYPT_GPU_ENABLED
9696
compat::enable_if_t<Const, state> get_digest(Range&& data) noexcept;
9797

98-
template <bool Const = is_xof, compat::size_t Extent = compat::dynamic_extent>
98+
template <bool Const = is_xof, compat::size_t Extent>
9999
[[nodiscard]] BOOST_CRYPT_GPU_ENABLED_CONSTEXPR
100100
compat::enable_if_t<Const, state> get_digest(compat::span<compat::byte, Extent> data, std::size_t amount) noexcept;
101101

include/boost/crypt2/mac/hmac.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,28 +36,28 @@ class hmac
3636
bool computed_ {false};
3737
bool corrupted_ {false};
3838

39-
template <compat::size_t Extent = compat::dynamic_extent>
39+
template <compat::size_t Extent>
4040
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR auto init_impl(compat::span<const compat::byte, Extent> data) noexcept -> state;
4141

4242
public:
4343

4444
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR hmac() noexcept = default;
4545

46-
template <compat::size_t Extent = compat::dynamic_extent>
46+
template <compat::size_t Extent>
4747
explicit BOOST_CRYPT_GPU_ENABLED_CONSTEXPR hmac(const compat::span<const compat::byte, Extent> key) noexcept { init(key); }
4848

4949
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR ~hmac() noexcept;
5050

5151
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR auto init_from_keys(const key_type& inner_key,
5252
const key_type& outer_key) noexcept -> state;
5353

54-
template <compat::size_t Extent = compat::dynamic_extent>
54+
template <compat::size_t Extent>
5555
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR auto init(compat::span<const compat::byte, Extent> data) noexcept -> state;
5656

5757
template <concepts::sized_range SizedRange>
5858
BOOST_CRYPT_GPU_ENABLED auto init(SizedRange&& data) noexcept -> state;
5959

60-
template <compat::size_t Extent = compat::dynamic_extent>
60+
template <compat::size_t Extent>
6161
BOOST_CRYPT_GPU_ENABLED_CONSTEXPR auto process_bytes(compat::span<const compat::byte, Extent> data) noexcept -> state;
6262

6363
template <concepts::sized_range SizedRange>
@@ -67,7 +67,7 @@ class hmac
6767

6868
[[nodiscard]] BOOST_CRYPT_GPU_ENABLED_CONSTEXPR auto get_digest() const noexcept -> compat::expected<return_type, state>;
6969

70-
template <compat::size_t Extent = compat::dynamic_extent>
70+
template <compat::size_t Extent>
7171
[[nodiscard]] BOOST_CRYPT_GPU_ENABLED_CONSTEXPR
7272
auto get_digest(compat::span<compat::byte, Extent> data) const noexcept -> state;
7373

test/test_hash_drbg.cpp

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,99 @@ void sha1_error_cases()
455455
BOOST_TEST(pr_rng.generate(bad_return_container, 1, entropy, nonce) == boost::crypt::state::uninitialized);
456456
}
457457

458+
consteval bool immediate_test()
459+
{
460+
boost::crypt::sha1_hash_drbg rng;
461+
462+
constexpr std::array<std::byte, 16> entropy = {
463+
std::byte{0xc3}, std::byte{0xef}, std::byte{0x82}, std::byte{0xce},
464+
std::byte{0x24}, std::byte{0x1f}, std::byte{0x02}, std::byte{0xe4},
465+
std::byte{0x29}, std::byte{0x8b}, std::byte{0x11}, std::byte{0x8c},
466+
std::byte{0xa4}, std::byte{0xf1}, std::byte{0x62}, std::byte{0x25}
467+
};
468+
469+
constexpr std::array<std::byte, 8> nonce = {
470+
std::byte{0x15}, std::byte{0xe3}, std::byte{0x2a}, std::byte{0xbb},
471+
std::byte{0xae}, std::byte{0x6b}, std::byte{0x74}, std::byte{0x33}
472+
};
473+
474+
constexpr std::array<std::byte, 16> additional_input_1 = {
475+
std::byte{0x2b}, std::byte{0x79}, std::byte{0x00}, std::byte{0x52},
476+
std::byte{0xf0}, std::byte{0x9b}, std::byte{0x36}, std::byte{0x4d},
477+
std::byte{0x4a}, std::byte{0x82}, std::byte{0x67}, std::byte{0xa0},
478+
std::byte{0xa7}, std::byte{0xde}, std::byte{0x63}, std::byte{0xb8}
479+
};
480+
481+
constexpr std::array<std::byte, 16> additional_input_2 = {
482+
std::byte{0x2e}, std::byte{0xe0}, std::byte{0x81}, std::byte{0x9a},
483+
std::byte{0x67}, std::byte{0x1d}, std::byte{0x07}, std::byte{0xb5},
484+
std::byte{0x08}, std::byte{0x5c}, std::byte{0xc4}, std::byte{0x6a},
485+
std::byte{0xa0}, std::byte{0xe6}, std::byte{0x1b}, std::byte{0x56}
486+
};
487+
488+
std::span<const std::byte, 16> entropy_span {entropy};
489+
std::span<const std::byte, 8> nonce_span {nonce};
490+
std::span<const std::byte, 16> additional_input_1_span {additional_input_1};
491+
std::span<const std::byte, 16> additional_input_2_span {additional_input_2};
492+
493+
std::array<std::byte, 80> return_bits {};
494+
std::span<std::byte, 80> return_bit_span {return_bits};
495+
496+
// Test process is:
497+
// 1) Instantiate drbg
498+
// 2) Generate bits, do not compare
499+
// 3) Generate bits, compare
500+
// 4) Destroy drbg
501+
rng.init(entropy_span, nonce_span);
502+
// ** INSTANTIATE:
503+
// V = 062e928dbf6ef8f7b57467a2a956f4754b094b5f5a9515fe0059a35d449b74485eac06f0671eaa6ec313fc52da015f69b18cc670d9e89a
504+
// C = 0fb2fcface8fe5876199565b26d3db365037da40291d67915426959d90c8beba18e3dd1961b48a1ac62b0150cdefa5dc077daf27b4cf3e
505+
506+
rng.generate(return_bit_span, 640U, additional_input_1_span);
507+
// ** GENERATE (FIRST CALL):
508+
// V = 15e18f888dfede7f170dbdfdd02acfab9b41259f83b27d8f548038fad5643302778fe466a1b0a63b22b39b4c59a4b7f151bec718d08a16
509+
// C = 0fb2fcface8fe5876199565b26d3db365037da40291d67915426959d90c8beba18e3dd1961b48a1ac62b0150cdefa5dc077daf27b4cf3e
510+
511+
rng.generate(return_bit_span, 640U, additional_input_2_span);
512+
// ** GENERATE (SECOND CALL):
513+
// V = 25948c835c8ec40678a71458f6feaae1eb78ffdfaccfe520a8a6ce98662cf1bc9073c28d8664f953ae0352e0b5a7ecc5577d08a0babfc3
514+
// C = 0fb2fcface8fe5876199565b26d3db365037da40291d67915426959d90c8beba18e3dd1961b48a1ac62b0150cdefa5dc077daf27b4cf3e
515+
516+
517+
constexpr std::array<std::byte, 80> nist_return = {
518+
std::byte{0x58}, std::byte{0x25}, std::byte{0xfa}, std::byte{0x1d},
519+
std::byte{0x1d}, std::byte{0xc3}, std::byte{0x3c}, std::byte{0x64},
520+
std::byte{0xcd}, std::byte{0xc8}, std::byte{0x69}, std::byte{0x06},
521+
std::byte{0x82}, std::byte{0xef}, std::byte{0xf0}, std::byte{0x60},
522+
std::byte{0x39}, std::byte{0xe7}, std::byte{0x95}, std::byte{0x08},
523+
std::byte{0xc3}, std::byte{0xaf}, std::byte{0x48}, std::byte{0xe8},
524+
std::byte{0x80}, std::byte{0xf8}, std::byte{0x22}, std::byte{0x7d},
525+
std::byte{0x5f}, std::byte{0x9a}, std::byte{0xaa}, std::byte{0x14},
526+
std::byte{0xb3}, std::byte{0xbc}, std::byte{0x76}, std::byte{0xba},
527+
std::byte{0xee}, std::byte{0x47}, std::byte{0x7e}, std::byte{0xbb},
528+
std::byte{0xb5}, std::byte{0xc4}, std::byte{0x55}, std::byte{0x47},
529+
std::byte{0x13}, std::byte{0x41}, std::byte{0x79}, std::byte{0x22},
530+
std::byte{0x32}, std::byte{0x57}, std::byte{0x52}, std::byte{0x5e},
531+
std::byte{0x8f}, std::byte{0x3a}, std::byte{0xfe}, std::byte{0xfb},
532+
std::byte{0x78}, std::byte{0xb5}, std::byte{0x9d}, std::byte{0xa0},
533+
std::byte{0x32}, std::byte{0xf1}, std::byte{0x00}, std::byte{0x6d},
534+
std::byte{0x74}, std::byte{0xc9}, std::byte{0x83}, std::byte{0x13},
535+
std::byte{0x75}, std::byte{0xa6}, std::byte{0x77}, std::byte{0xea},
536+
std::byte{0xb3}, std::byte{0x23}, std::byte{0x9c}, std::byte{0x94},
537+
std::byte{0xeb}, std::byte{0xe3}, std::byte{0xf7}, std::byte{0xfa}
538+
};
539+
540+
for (std::size_t i {}; i < return_bits.size(); ++i)
541+
{
542+
if (!(return_bits[i] == static_cast<std::byte>(nist_return[i])))
543+
{
544+
return false;
545+
}
546+
}
547+
548+
return true;
549+
}
550+
458551
int main()
459552
{
460553
sha_1_basic_correctness();
@@ -465,5 +558,7 @@ int main()
465558
sha1_no_reseed_additional_input();
466559
sha1_error_cases();
467560

561+
static_assert(immediate_test());
562+
468563
return boost::report_errors();
469564
}

0 commit comments

Comments
 (0)