26 #ifndef CRYPTO3_PBKDF_HPP
27 #define CRYPTO3_PBKDF_HPP
29 #include <boost/assert.hpp>
30 #include <boost/concept_check.hpp>
32 #include <boost/core/enable_if.hpp>
34 #include <boost/range/begin.hpp>
35 #include <boost/range/end.hpp>
36 #include <boost/range/concepts.hpp>
37 #include <boost/range/any_range.hpp>
39 #include <nil/crypto3/detail/type_traits.hpp>
73 template<
typename Hasher,
typename SinglePassRange>
76 typename std::iterator_traits<typename SinglePassRange::iterator>::value_type>::digits +
77 std::numeric_limits<typename std::iterator_traits<typename SinglePassRange::iterator>::value_type>::
80 template<
typename Hasher,
typename InputIterator>
82 std::numeric_limits<typename std::iterator_traits<InputIterator>::value_type>::digits +
83 std::numeric_limits<typename std::iterator_traits<InputIterator>::value_type>::is_signed>::type;
85 #ifdef CRYPTO3_RAW_PBKDF_STRING_OUTPUT
87 template<
typename Hash,
typename InputIterator,
typename StreamHasher>
88 typename Hash::digest_type hash_impl_f(InputIterator first, InputIterator last,
89 StreamHasher accumulator) {
90 typedef typename std::iterator_traits<InputIterator>::value_type value_type;
92 BOOST_STATIC_ASSERT(std::numeric_limits<value_type>::is_specialized);
94 return accumulator.update(first, last).end_message();
97 template<
typename Hash,
typename SinglePassRange,
typename StreamHasher,
98 typename =
typename std::enable_if<boost::has_range_iterator<SinglePassRange>::value>::type>
99 typename Hash::digest_type hash_impl_f(
const SinglePassRange &rng, StreamHasher accumulator) {
100 BOOST_RANGE_CONCEPT_ASSERT((boost::SinglePassRangeConcept<SinglePassRange>));
102 typedef typename std::iterator_traits<typename SinglePassRange::iterator>::value_type value_type;
104 BOOST_STATIC_ASSERT(std::numeric_limits<value_type>::is_specialized);
106 return accumulator.update(boost::begin(rng), boost::end(rng)).end_message();
112 template<
typename Hasher,
typename StreamHash>
115 mutable StreamHash sh;
118 template<
typename SinglePassRange>
120 sh(std::
move(stream_hash)) {
121 BOOST_RANGE_CONCEPT_ASSERT((boost::SinglePassRangeConcept<SinglePassRange>));
124 typename std::iterator_traits<typename SinglePassRange::iterator>::value_type value_type;
126 BOOST_STATIC_ASSERT(std::numeric_limits<value_type>::is_specialized);
128 sh.update(boost::begin(range), boost::end(range));
131 template<
typename OutputRange>
132 operator OutputRange()
const {
133 typename Hasher::digest_type range = sh.end_message();
135 return OutputRange(range.begin(), range.end());
138 operator typename Hasher::digest_type()
const {
139 return sh.end_message();
142 template<
typename Char,
typename CharTraits,
typename Alloc>
143 operator std::basic_string<Char, CharTraits, Alloc>()
const {
144 return sh.end_message().str();
148 template<
typename Hasher,
typename OutputIterator,
typename StreamHash>
151 mutable StreamHash sh;
153 mutable OutputIterator out;
156 template<
typename SinglePassRange>
158 out(std::
move(out)), sh(std::
move(stream_hash)) {
159 BOOST_CONCEPT_ASSERT((boost::SinglePassRangeConcept<SinglePassRange>));
162 typename std::iterator_traits<typename SinglePassRange::iterator>::value_type value_type;
164 BOOST_STATIC_ASSERT(std::numeric_limits<value_type>::is_specialized);
166 sh.update(boost::begin(range), boost::end(range));
169 operator OutputIterator()
const {
170 const auto &result = sh.end_message();
176 template<
typename Hasher,
typename OutputIterator,
typename StreamHash>
179 mutable StreamHash sh;
181 mutable OutputIterator out;
184 template<
typename InputIterator>
186 StreamHash stream_hash) :
188 sh(std::
move(stream_hash)) {
189 BOOST_CONCEPT_ASSERT((boost::InputIteratorConcept<InputIterator>));
191 typedef typename std::iterator_traits<InputIterator>::value_type value_type;
193 BOOST_STATIC_ASSERT(std::numeric_limits<value_type>::is_specialized);
195 sh.update(first, last);
198 operator OutputIterator()
const {
199 const auto &result = sh.end_message();
212 template<
typename Hasher,
typename Input>
218 template<
typename OutputIterator,
typename StreamHash>
219 explicit hash(Input first, Input last, OutputIterator out, StreamHash sh) :
221 first, last, std::
move(out), std::
move(sh)))) {
224 template<
typename OutputIterator,
typename StreamHash>
225 explicit hash(
const Input &range, OutputIterator out, StreamHash sh) :
227 range, std::
move(out), std::
move(sh)))) {
230 template<
typename StreamHash>
231 explicit hash(
const Input &range, StreamHash sh) :
236 template<
typename OutputIterator,
237 typename std::enable_if<detail::is_iterator<OutputIterator>::value &&
240 OutputIterator to()
const {
245 template<
typename OutputIterator,
246 typename std::enable_if<detail::is_iterator<OutputIterator>::value &&
249 OutputIterator to()
const {
254 template<typename OutputRange, typename std::enable_if<!detail::is_iterator<Input>::value &&
257 OutputRange to()
const {
258 return static_cast<const detail::range_value_hash_impl<
259 Hasher, detail::range_stream_hash_traits<Hasher, Input>
> &>(impl);
263 template<
typename Output>
264 operator Output()
const {
268 template<
typename Char,
typename CharTraits,
typename Alloc>
269 operator std::basic_string<Char, CharTraits, Alloc>()
const {
293 template<
typename Hasher,
typename InputIterator,
typename OutputIterator,
294 typename StreamHash = detail::iterator_stream_hash_traits<Hasher, InputIterator>,
295 typename =
typename std::enable_if<detail::is_stream_hash<StreamHash>::value>::type>
296 OutputIterator
hash(InputIterator first, InputIterator last, OutputIterator out,
297 StreamHash sh = StreamHash()) {
314 template<
typename Hasher,
typename InputIterator,
315 typename StreamHash = detail::iterator_stream_hash_traits<Hasher, InputIterator>,
316 typename =
typename std::enable_if<detail::is_stream_hash<StreamHash>::value>::type>
318 StreamHash sh = StreamHash()) {
336 template<
typename Hasher,
typename SinglePassRange,
typename OutputIterator,
337 typename StreamHash = detail::range_stream_hash_traits<Hasher, SinglePassRange>,
338 typename =
typename std::enable_if<detail::is_stream_hash<StreamHash>::value>::type>
339 OutputIterator
hash(
const SinglePassRange &rng, OutputIterator out, StreamHash sh = StreamHash()) {
355 template<
typename Hasher,
typename SinglePassRange,
356 typename StreamHash = detail::range_stream_hash_traits<Hasher, SinglePassRange>,
357 typename =
typename std::enable_if<detail::is_stream_hash<StreamHash>::value>::type>
Definition: pbkdf/include/nil/crypto3/pbkdf/algorithm/derive.hpp:213
hash(const Input &range, OutputIterator out, StreamHash sh)
Definition: pbkdf/include/nil/crypto3/pbkdf/algorithm/derive.hpp:225
hash(const Input &range, StreamHash sh)
Definition: pbkdf/include/nil/crypto3/pbkdf/algorithm/derive.hpp:231
hash(Input first, Input last, OutputIterator out, StreamHash sh)
Definition: pbkdf/include/nil/crypto3/pbkdf/algorithm/derive.hpp:219
OutputIterator hash(InputIterator first, InputIterator last, OutputIterator out, StreamHash sh=StreamHash())
Definition: pbkdf/include/nil/crypto3/pbkdf/algorithm/derive.hpp:296
OutputIterator move(const SinglePassRange &rng, OutputIterator result)
Definition: move.hpp:45
typename Hasher::template stream_hash< std::numeric_limits< typename std::iterator_traits< InputIterator >::value_type >::digits+std::numeric_limits< typename std::iterator_traits< InputIterator >::value_type >::is_signed >::type iterator_stream_hash_traits
Definition: pbkdf/include/nil/crypto3/pbkdf/algorithm/derive.hpp:83
typename Hasher::template stream_hash< std::numeric_limits< typename std::iterator_traits< typename SinglePassRange::iterator >::value_type >::digits+std::numeric_limits< typename std::iterator_traits< typename SinglePassRange::iterator >::value_type >::is_signed >::type range_stream_hash_traits
Definition: pbkdf/include/nil/crypto3/pbkdf/algorithm/derive.hpp:78
Definition: algebra/include/nil/crypto3/detail/type_traits.hpp:78
Definition: pbkdf/include/nil/crypto3/pbkdf/algorithm/derive.hpp:110
Definition: pbkdf/include/nil/crypto3/pbkdf/algorithm/derive.hpp:177
itr_itr_hash_impl(InputIterator first, InputIterator last, OutputIterator out, StreamHash stream_hash)
Definition: pbkdf/include/nil/crypto3/pbkdf/algorithm/derive.hpp:185
Definition: pbkdf/include/nil/crypto3/pbkdf/algorithm/derive.hpp:149
range_itr_hash_impl(const SinglePassRange &range, OutputIterator out, StreamHash stream_hash)
Definition: pbkdf/include/nil/crypto3/pbkdf/algorithm/derive.hpp:157
Definition: pbkdf/include/nil/crypto3/pbkdf/algorithm/derive.hpp:113
range_value_hash_impl(const SinglePassRange &range, StreamHash stream_hash)
Definition: pbkdf/include/nil/crypto3/pbkdf/algorithm/derive.hpp:119