Stroika Library 3.0d18
 
Loading...
Searching...
No Matches
Digester.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
5
6#include "ResultTypes.h"
7
8namespace Stroika::Foundation::Cryptography::Digest {
9
10 /*
11 ********************************************************************************
12 ****************** IncrementalDigester<ALGORITHM, RETURN_TYPE> *****************
13 ********************************************************************************
14 */
15 template <typename ALGORITHM, typename RETURN_TYPE>
16 inline void IncrementalDigester<ALGORITHM, RETURN_TYPE>::Write (const byte* from, const byte* to)
17 {
18#if qStroika_Foundation_Debug_AssertionsChecked
19 Require (not fCompleted_);
20#endif
21 Require ((from == nullptr and to == nullptr) or (from != nullptr and from <= to));
22 fDigesterAlgorithm_.Write (from, to);
23 }
24 template <typename ALGORITHM, typename RETURN_TYPE>
25 inline void IncrementalDigester<ALGORITHM, RETURN_TYPE>::Write (span<const byte> from)
26 {
27 this->Write (from.data (), from.data () + from.size ());
28 }
29 template <typename ALGORITHM, typename RETURN_TYPE>
30 inline void IncrementalDigester<ALGORITHM, RETURN_TYPE>::Write (const BLOB& from)
31 {
32 this->Write (from.begin (), from.end ());
33 }
34 template <typename ALGORITHM, typename RETURN_TYPE>
36 {
37 while (true) {
38 byte buf[32 * 1024];
39 size_t n = from.ReadBlocking (span{buf}).size ();
40 Assert (n <= sizeof (buf));
41 if (n == 0) {
42 break;
43 }
44 this->Write (std::begin (buf), std::begin (buf) + n);
45 }
46 }
47 template <typename ALGORITHM, typename RETURN_TYPE>
48 template <typename TRIVIALLY_COPYABLE_T>
49 void IncrementalDigester<ALGORITHM, RETURN_TYPE>::Write (const Traversal::Iterable<TRIVIALLY_COPYABLE_T>& from)
50 requires (is_trivially_copyable_v<TRIVIALLY_COPYABLE_T>)
51 {
52 for (auto ci : from) {
53 this->Write (&ci, &ci + 1);
54 }
55 }
56 template <typename ALGORITHM, typename RETURN_TYPE>
58 {
59#if qStroika_Foundation_Debug_AssertionsChecked
60 Require (not this->fCompleted_);
61 this->fCompleted_ = true;
62#endif
63 if constexpr (same_as<RETURN_TYPE, typename Algorithm::DigesterDefaultTraitsForAlgorithm<ALGORITHM>::ReturnType>) {
64 return fDigesterAlgorithm_.Complete ();
65 }
66 else {
67 return ConvertResult<RETURN_TYPE> (fDigesterAlgorithm_.Complete ());
68 }
69 }
70
71 /*
72 ********************************************************************************
73 *********************** Digester<ALGORITHM, RETURN_TYPE> ***********************
74 ********************************************************************************
75 */
76 template <typename ALGORITHM, typename RETURN_TYPE>
78 {
79 return Digest::ComputeDigest<ALGORITHM, RETURN_TYPE> (from);
80 }
81 template <typename ALGORITHM, typename RETURN_TYPE>
82 inline auto Digester<ALGORITHM, RETURN_TYPE>::operator() (const byte* from, const byte* to) const -> ReturnType
83 {
84 Require ((from == nullptr and to == nullptr) or (from != nullptr and from <= to));
85 return Digest::ComputeDigest<ALGORITHM, RETURN_TYPE> (from, to);
86 }
87 template <typename ALGORITHM, typename RETURN_TYPE>
88 inline auto Digester<ALGORITHM, RETURN_TYPE>::operator() (span<const byte> from) const -> ReturnType
89 {
90 return Digest::ComputeDigest<ALGORITHM, RETURN_TYPE> (from.data (), from.data () + from.size ());
91 }
92 template <typename ALGORITHM, typename RETURN_TYPE>
93 inline auto Digester<ALGORITHM, RETURN_TYPE>::operator() (const BLOB& from) const -> ReturnType
94 {
95 return Digest::ComputeDigest<ALGORITHM, RETURN_TYPE> (from);
96 }
97 template <typename ALGORITHM, typename RETURN_TYPE>
98 template <typename TRIVIALLY_COPYABLE_T>
100 requires (is_trivially_copyable_v<TRIVIALLY_COPYABLE_T>)
101 {
102 // copy to inline stack buffer, and that can be passed as array to other overloads
103 Memory::StackBuffer<TRIVIALLY_COPYABLE_T> buf{from.begin (), from.end ()};
104 return Digest::ComputeDigest<ALGORITHM, RETURN_TYPE> (reinterpret_cast<const byte*> (buf.begin ()),
105 reinterpret_cast<const byte*> (buf.end ()));
106 }
107
108 /*
109 ********************************************************************************
110 ****************** ComputeDigest<ALGORITHM, RETURN_TYPE> ***********************
111 ********************************************************************************
112 */
113 template <typename ALGORITHM, typename RETURN_TYPE>
114 RETURN_TYPE ComputeDigest (const byte* from, const byte* to)
115 {
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 ();
121 }
122 else {
123 return ConvertResult<RETURN_TYPE> (ctx.Complete ());
124 }
125 }
126 template <typename ALGORITHM, typename RETURN_TYPE>
127 RETURN_TYPE ComputeDigest (const Streams::InputStream::Ptr<byte>& from)
128 {
129 IncrementalDigester<ALGORITHM> ctx;
130 ctx.Write (from);
131 if constexpr (same_as<RETURN_TYPE, typename Algorithm::DigesterDefaultTraitsForAlgorithm<ALGORITHM>::ReturnType>) {
132 return ctx.Complete ();
133 }
134 else {
135 return ConvertResult<RETURN_TYPE> (ctx.Complete ());
136 }
137 }
138 template <typename ALGORITHM, typename RETURN_TYPE>
139 inline RETURN_TYPE ComputeDigest (span<const byte> from)
140 {
141 return ComputeDigest<ALGORITHM, RETURN_TYPE> (from.data (), from.data () + from.size ());
142 }
143 template <typename ALGORITHM, typename RETURN_TYPE>
144 inline RETURN_TYPE ComputeDigest (const BLOB& from)
145 {
146 return ComputeDigest<ALGORITHM, RETURN_TYPE> (from.begin (), from.end ());
147 }
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>)
151 {
152 // copy to inline stack buffer, and that can be passed as array to other overloads
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 ()));
155 }
156
157}
nonvirtual ReturnType operator()(const Streams::InputStream::Ptr< byte > &from) const
Definition Digester.inl:77
nonvirtual void Write(const byte *from, const byte *to)
Definition Digester.inl:16
Logically halfway between std::array and std::vector; Smart 'direct memory array' - which when needed...
InputStream<>::Ptr is Smart pointer (with abstract Rep) class defining the interface to reading from ...
nonvirtual optional< ElementType > ReadBlocking() const
ReadBlocking () reads either a single element, or fills in argument intoBuffer - but never blocks (no...
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.
Definition Iterable.h:237