6#include "ResultTypes.h"
8namespace Stroika::Foundation::Cryptography::Digest {
15 template <
typename ALGORITHM,
typename RETURN_TYPE>
18#if qStroika_Foundation_Debug_AssertionsChecked
19 Require (not fCompleted_);
21 Require ((from ==
nullptr and to ==
nullptr) or (from !=
nullptr and from <= to));
22 fDigesterAlgorithm_.Write (from, to);
24 template <
typename ALGORITHM,
typename RETURN_TYPE>
27 this->Write (from.data (), from.data () + from.size ());
29 template <
typename ALGORITHM,
typename RETURN_TYPE>
32 this->Write (from.begin (), from.end ());
34 template <
typename ALGORITHM,
typename RETURN_TYPE>
40 Assert (n <=
sizeof (buf));
44 this->Write (std::begin (buf), std::begin (buf) + n);
47 template <
typename ALGORITHM,
typename RETURN_TYPE>
48 template <
typename TRIVIALLY_COPYABLE_T>
50 requires (is_trivially_copyable_v<TRIVIALLY_COPYABLE_T>)
52 for (
auto ci : from) {
53 this->Write (&ci, &ci + 1);
56 template <
typename ALGORITHM,
typename RETURN_TYPE>
59#if qStroika_Foundation_Debug_AssertionsChecked
60 Require (not this->fCompleted_);
61 this->fCompleted_ =
true;
63 if constexpr (same_as<RETURN_TYPE, typename Algorithm::DigesterDefaultTraitsForAlgorithm<ALGORITHM>::ReturnType>) {
64 return fDigesterAlgorithm_.Complete ();
67 return ConvertResult<RETURN_TYPE> (fDigesterAlgorithm_.Complete ());
76 template <
typename ALGORITHM,
typename RETURN_TYPE>
79 return Digest::ComputeDigest<ALGORITHM, RETURN_TYPE> (from);
81 template <
typename ALGORITHM,
typename RETURN_TYPE>
84 Require ((from ==
nullptr and to ==
nullptr) or (from !=
nullptr and from <= to));
85 return Digest::ComputeDigest<ALGORITHM, RETURN_TYPE> (from, to);
87 template <
typename ALGORITHM,
typename RETURN_TYPE>
90 return Digest::ComputeDigest<ALGORITHM, RETURN_TYPE> (from.data (), from.data () + from.size ());
92 template <
typename ALGORITHM,
typename RETURN_TYPE>
95 return Digest::ComputeDigest<ALGORITHM, RETURN_TYPE> (from);
97 template <
typename ALGORITHM,
typename RETURN_TYPE>
98 template <
typename TRIVIALLY_COPYABLE_T>
100 requires (is_trivially_copyable_v<TRIVIALLY_COPYABLE_T>)
104 return Digest::ComputeDigest<ALGORITHM, RETURN_TYPE> (
reinterpret_cast<const byte*
> (buf.begin ()),
105 reinterpret_cast<const byte*
> (buf.end ()));
113 template <
typename ALGORITHM,
typename RETURN_TYPE>
114 RETURN_TYPE ComputeDigest (
const byte* from,
const byte* to)
116 Require ((from ==
nullptr and to ==
nullptr) or (from !=
nullptr and from <= to));
117 IncrementalDigester<ALGORITHM> ctx;
118 ctx.Write (from, to);
119 if constexpr (same_as<RETURN_TYPE, typename Algorithm::DigesterDefaultTraitsForAlgorithm<ALGORITHM>::ReturnType>) {
120 return ctx.Complete ();
123 return ConvertResult<RETURN_TYPE> (ctx.Complete ());
126 template <
typename ALGORITHM,
typename RETURN_TYPE>
127 RETURN_TYPE ComputeDigest (
const Streams::InputStream::Ptr<byte>& from)
129 IncrementalDigester<ALGORITHM> ctx;
131 if constexpr (same_as<RETURN_TYPE, typename Algorithm::DigesterDefaultTraitsForAlgorithm<ALGORITHM>::ReturnType>) {
132 return ctx.Complete ();
135 return ConvertResult<RETURN_TYPE> (ctx.Complete ());
138 template <
typename ALGORITHM,
typename RETURN_TYPE>
139 inline RETURN_TYPE ComputeDigest (span<const byte> from)
141 return ComputeDigest<ALGORITHM, RETURN_TYPE> (from.data (), from.data () + from.size ());
143 template <
typename ALGORITHM,
typename RETURN_TYPE>
144 inline RETURN_TYPE ComputeDigest (
const BLOB& from)
146 return ComputeDigest<ALGORITHM, RETURN_TYPE> (from.begin (), from.end ());
148 template <
typename ALGORITHM,
typename TRIVIALLY_COPYABLE_T,
typename RETURN_TYPE>
149 RETURN_TYPE ComputeDigest (
const Traversal::Iterable<TRIVIALLY_COPYABLE_T>& from)
150 requires (is_trivially_copyable_v<TRIVIALLY_COPYABLE_T>)
153 Memory::StackBuffer<TRIVIALLY_COPYABLE_T> buf{from.begin (), from.end ()};
154 return ComputeDigest<ALGORITHM, RETURN_TYPE> (
reinterpret_cast<const byte*
> (buf.begin ()),
reinterpret_cast<const byte*
> (buf.end ()));
nonvirtual ReturnType operator()(const Streams::InputStream::Ptr< byte > &from) const
nonvirtual ReturnType Complete()
nonvirtual void Write(const byte *from, const byte *to)
Logically halfway between std::array and std::vector; Smart 'direct memory array' - which when needed...
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.