• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

randombit / botan / 19012754211

02 Nov 2025 01:10PM UTC coverage: 90.677% (+0.006%) from 90.671%
19012754211

push

github

web-flow
Merge pull request #5137 from randombit/jack/clang-tidy-includes

Remove various unused includes flagged by clang-tidy misc-include-cleaner

100457 of 110786 relevant lines covered (90.68%)

12189873.8 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

36.96
/src/lib/hash/sha2_32/sha2_32.cpp
1
/*
2
* SHA-{224,256}
3
* (C) 1999-2010,2017 Jack Lloyd
4
*     2007 FlexSecure GmbH
5
*
6
* Botan is released under the Simplified BSD License (see license.txt)
7
*/
8

9
#include <botan/internal/sha2_32.h>
10

11
#include <botan/internal/loadstor.h>
12
#include <botan/internal/sha2_32_f.h>
13
#include <botan/internal/stack_scrubbing.h>
14
#include <botan/internal/stl_util.h>
15

16
#if defined(BOTAN_HAS_CPUID)
17
   #include <botan/internal/cpuid.h>
18
#endif
19

20
namespace Botan {
21

22
namespace {
23

24
std::string sha256_provider() {
1,581✔
25
#if defined(BOTAN_HAS_SHA2_32_ARMV8)
26
   if(auto feat = CPUID::check(CPUID::Feature::SHA2)) {
27
      return *feat;
28
   }
29
#endif
30

31
#if defined(BOTAN_HAS_SHA2_32_X86)
32
   if(auto feat = CPUID::check(CPUID::Feature::SHA)) {
1,581✔
33
      return *feat;
792✔
34
   }
396✔
35
#endif
36

37
#if defined(BOTAN_HAS_SHA2_32_X86_AVX2)
38
   if(auto feat = CPUID::check(CPUID::Feature::AVX2, CPUID::Feature::BMI)) {
1,185✔
39
      return *feat;
790✔
40
   }
395✔
41
#endif
42

43
#if defined(BOTAN_HAS_SHA2_32_SIMD)
44
   if(auto feat = CPUID::check(CPUID::Feature::SIMD_4X32)) {
790✔
45
      return *feat;
1,580✔
46
   }
790✔
47
#endif
48

49
   return "base";
×
50
}
51

52
}  // namespace
53

54
/*
55
* SHA-224 / SHA-256 compression function
56
*/
57
void BOTAN_SCRUB_STACK_AFTER_RETURN SHA_256::compress_digest(digest_type& digest,
376,113,259✔
58
                                                             std::span<const uint8_t> input,
59
                                                             size_t blocks) {
60
#if defined(BOTAN_HAS_SHA2_32_X86)
61
   if(CPUID::has(CPUID::Feature::SHA)) {
376,113,259✔
62
      return SHA_256::compress_digest_x86(digest, input, blocks);
376,113,259✔
63
   }
64
#endif
65

66
#if defined(BOTAN_HAS_SHA2_32_ARMV8)
67
   if(CPUID::has(CPUID::Feature::SHA2)) {
68
      return SHA_256::compress_digest_armv8(digest, input, blocks);
69
   }
70
#endif
71

72
#if defined(BOTAN_HAS_SHA2_32_X86_AVX2)
73
   if(CPUID::has(CPUID::Feature::AVX2, CPUID::Feature::BMI)) {
11,593✔
74
      return SHA_256::compress_digest_x86_avx2(digest, input, blocks);
3,864✔
75
   }
76
#endif
77

78
#if defined(BOTAN_HAS_SHA2_32_SIMD)
79
   if(CPUID::has(CPUID::Feature::SIMD_4X32)) {
7,729✔
80
      return SHA_256::compress_digest_x86_simd(digest, input, blocks);
7,729✔
81
   }
82
#endif
83

84
   uint32_t A = digest[0];
×
85
   uint32_t B = digest[1];
×
86
   uint32_t C = digest[2];
×
87
   uint32_t D = digest[3];
×
88
   uint32_t E = digest[4];
×
89
   uint32_t F = digest[5];
×
90
   uint32_t G = digest[6];
×
91
   uint32_t H = digest[7];
×
92

93
   std::array<uint32_t, 16> W{};
×
94

95
   BufferSlicer in(input);
×
96

97
   for(size_t i = 0; i != blocks; ++i) {
×
98
      load_be(W, in.take<block_bytes>());
×
99

100
      // clang-format off
101

102
      SHA2_32_F(A, B, C, D, E, F, G, H, W[ 0], W[14], W[ 9], W[ 1], 0x428A2F98);
×
103
      SHA2_32_F(H, A, B, C, D, E, F, G, W[ 1], W[15], W[10], W[ 2], 0x71374491);
×
104
      SHA2_32_F(G, H, A, B, C, D, E, F, W[ 2], W[ 0], W[11], W[ 3], 0xB5C0FBCF);
×
105
      SHA2_32_F(F, G, H, A, B, C, D, E, W[ 3], W[ 1], W[12], W[ 4], 0xE9B5DBA5);
×
106
      SHA2_32_F(E, F, G, H, A, B, C, D, W[ 4], W[ 2], W[13], W[ 5], 0x3956C25B);
×
107
      SHA2_32_F(D, E, F, G, H, A, B, C, W[ 5], W[ 3], W[14], W[ 6], 0x59F111F1);
×
108
      SHA2_32_F(C, D, E, F, G, H, A, B, W[ 6], W[ 4], W[15], W[ 7], 0x923F82A4);
×
109
      SHA2_32_F(B, C, D, E, F, G, H, A, W[ 7], W[ 5], W[ 0], W[ 8], 0xAB1C5ED5);
×
110
      SHA2_32_F(A, B, C, D, E, F, G, H, W[ 8], W[ 6], W[ 1], W[ 9], 0xD807AA98);
×
111
      SHA2_32_F(H, A, B, C, D, E, F, G, W[ 9], W[ 7], W[ 2], W[10], 0x12835B01);
×
112
      SHA2_32_F(G, H, A, B, C, D, E, F, W[10], W[ 8], W[ 3], W[11], 0x243185BE);
×
113
      SHA2_32_F(F, G, H, A, B, C, D, E, W[11], W[ 9], W[ 4], W[12], 0x550C7DC3);
×
114
      SHA2_32_F(E, F, G, H, A, B, C, D, W[12], W[10], W[ 5], W[13], 0x72BE5D74);
×
115
      SHA2_32_F(D, E, F, G, H, A, B, C, W[13], W[11], W[ 6], W[14], 0x80DEB1FE);
×
116
      SHA2_32_F(C, D, E, F, G, H, A, B, W[14], W[12], W[ 7], W[15], 0x9BDC06A7);
×
117
      SHA2_32_F(B, C, D, E, F, G, H, A, W[15], W[13], W[ 8], W[ 0], 0xC19BF174);
×
118

119
      SHA2_32_F(A, B, C, D, E, F, G, H, W[ 0], W[14], W[ 9], W[ 1], 0xE49B69C1);
×
120
      SHA2_32_F(H, A, B, C, D, E, F, G, W[ 1], W[15], W[10], W[ 2], 0xEFBE4786);
×
121
      SHA2_32_F(G, H, A, B, C, D, E, F, W[ 2], W[ 0], W[11], W[ 3], 0x0FC19DC6);
×
122
      SHA2_32_F(F, G, H, A, B, C, D, E, W[ 3], W[ 1], W[12], W[ 4], 0x240CA1CC);
×
123
      SHA2_32_F(E, F, G, H, A, B, C, D, W[ 4], W[ 2], W[13], W[ 5], 0x2DE92C6F);
×
124
      SHA2_32_F(D, E, F, G, H, A, B, C, W[ 5], W[ 3], W[14], W[ 6], 0x4A7484AA);
×
125
      SHA2_32_F(C, D, E, F, G, H, A, B, W[ 6], W[ 4], W[15], W[ 7], 0x5CB0A9DC);
×
126
      SHA2_32_F(B, C, D, E, F, G, H, A, W[ 7], W[ 5], W[ 0], W[ 8], 0x76F988DA);
×
127
      SHA2_32_F(A, B, C, D, E, F, G, H, W[ 8], W[ 6], W[ 1], W[ 9], 0x983E5152);
×
128
      SHA2_32_F(H, A, B, C, D, E, F, G, W[ 9], W[ 7], W[ 2], W[10], 0xA831C66D);
×
129
      SHA2_32_F(G, H, A, B, C, D, E, F, W[10], W[ 8], W[ 3], W[11], 0xB00327C8);
×
130
      SHA2_32_F(F, G, H, A, B, C, D, E, W[11], W[ 9], W[ 4], W[12], 0xBF597FC7);
×
131
      SHA2_32_F(E, F, G, H, A, B, C, D, W[12], W[10], W[ 5], W[13], 0xC6E00BF3);
×
132
      SHA2_32_F(D, E, F, G, H, A, B, C, W[13], W[11], W[ 6], W[14], 0xD5A79147);
×
133
      SHA2_32_F(C, D, E, F, G, H, A, B, W[14], W[12], W[ 7], W[15], 0x06CA6351);
×
134
      SHA2_32_F(B, C, D, E, F, G, H, A, W[15], W[13], W[ 8], W[ 0], 0x14292967);
×
135

136
      SHA2_32_F(A, B, C, D, E, F, G, H, W[ 0], W[14], W[ 9], W[ 1], 0x27B70A85);
×
137
      SHA2_32_F(H, A, B, C, D, E, F, G, W[ 1], W[15], W[10], W[ 2], 0x2E1B2138);
×
138
      SHA2_32_F(G, H, A, B, C, D, E, F, W[ 2], W[ 0], W[11], W[ 3], 0x4D2C6DFC);
×
139
      SHA2_32_F(F, G, H, A, B, C, D, E, W[ 3], W[ 1], W[12], W[ 4], 0x53380D13);
×
140
      SHA2_32_F(E, F, G, H, A, B, C, D, W[ 4], W[ 2], W[13], W[ 5], 0x650A7354);
×
141
      SHA2_32_F(D, E, F, G, H, A, B, C, W[ 5], W[ 3], W[14], W[ 6], 0x766A0ABB);
×
142
      SHA2_32_F(C, D, E, F, G, H, A, B, W[ 6], W[ 4], W[15], W[ 7], 0x81C2C92E);
×
143
      SHA2_32_F(B, C, D, E, F, G, H, A, W[ 7], W[ 5], W[ 0], W[ 8], 0x92722C85);
×
144
      SHA2_32_F(A, B, C, D, E, F, G, H, W[ 8], W[ 6], W[ 1], W[ 9], 0xA2BFE8A1);
×
145
      SHA2_32_F(H, A, B, C, D, E, F, G, W[ 9], W[ 7], W[ 2], W[10], 0xA81A664B);
×
146
      SHA2_32_F(G, H, A, B, C, D, E, F, W[10], W[ 8], W[ 3], W[11], 0xC24B8B70);
×
147
      SHA2_32_F(F, G, H, A, B, C, D, E, W[11], W[ 9], W[ 4], W[12], 0xC76C51A3);
×
148
      SHA2_32_F(E, F, G, H, A, B, C, D, W[12], W[10], W[ 5], W[13], 0xD192E819);
×
149
      SHA2_32_F(D, E, F, G, H, A, B, C, W[13], W[11], W[ 6], W[14], 0xD6990624);
×
150
      SHA2_32_F(C, D, E, F, G, H, A, B, W[14], W[12], W[ 7], W[15], 0xF40E3585);
×
151
      SHA2_32_F(B, C, D, E, F, G, H, A, W[15], W[13], W[ 8], W[ 0], 0x106AA070);
×
152

153
      SHA2_32_F(A, B, C, D, E, F, G, H, W[ 0], W[14], W[ 9], W[ 1], 0x19A4C116);
×
154
      SHA2_32_F(H, A, B, C, D, E, F, G, W[ 1], W[15], W[10], W[ 2], 0x1E376C08);
×
155
      SHA2_32_F(G, H, A, B, C, D, E, F, W[ 2], W[ 0], W[11], W[ 3], 0x2748774C);
×
156
      SHA2_32_F(F, G, H, A, B, C, D, E, W[ 3], W[ 1], W[12], W[ 4], 0x34B0BCB5);
×
157
      SHA2_32_F(E, F, G, H, A, B, C, D, W[ 4], W[ 2], W[13], W[ 5], 0x391C0CB3);
×
158
      SHA2_32_F(D, E, F, G, H, A, B, C, W[ 5], W[ 3], W[14], W[ 6], 0x4ED8AA4A);
×
159
      SHA2_32_F(C, D, E, F, G, H, A, B, W[ 6], W[ 4], W[15], W[ 7], 0x5B9CCA4F);
×
160
      SHA2_32_F(B, C, D, E, F, G, H, A, W[ 7], W[ 5], W[ 0], W[ 8], 0x682E6FF3);
×
161
      SHA2_32_F(A, B, C, D, E, F, G, H, W[ 8], W[ 6], W[ 1], W[ 9], 0x748F82EE);
×
162
      SHA2_32_F(H, A, B, C, D, E, F, G, W[ 9], W[ 7], W[ 2], W[10], 0x78A5636F);
×
163
      SHA2_32_F(G, H, A, B, C, D, E, F, W[10], W[ 8], W[ 3], W[11], 0x84C87814);
×
164
      SHA2_32_F(F, G, H, A, B, C, D, E, W[11], W[ 9], W[ 4], W[12], 0x8CC70208);
×
165
      SHA2_32_F(E, F, G, H, A, B, C, D, W[12], W[10], W[ 5], W[13], 0x90BEFFFA);
×
166
      SHA2_32_F(D, E, F, G, H, A, B, C, W[13], W[11], W[ 6], W[14], 0xA4506CEB);
×
167
      SHA2_32_F(C, D, E, F, G, H, A, B, W[14], W[12], W[ 7], W[15], 0xBEF9A3F7);
×
168
      SHA2_32_F(B, C, D, E, F, G, H, A, W[15], W[13], W[ 8], W[ 0], 0xC67178F2);
×
169

170
      // clang-format on
171

172
      A = (digest[0] += A);
×
173
      B = (digest[1] += B);
×
174
      C = (digest[2] += C);
×
175
      D = (digest[3] += D);
×
176
      E = (digest[4] += E);
×
177
      F = (digest[5] += F);
×
178
      G = (digest[6] += G);
×
179
      H = (digest[7] += H);
×
180
   }
181
}
182

183
std::string SHA_224::provider() const {
12✔
184
   return sha256_provider();
12✔
185
}
186

187
void SHA_224::compress_n(digest_type& digest, std::span<const uint8_t> input, size_t blocks) {
4,472,449✔
188
   SHA_256::compress_digest(digest, input, blocks);
4,472,449✔
189
}
×
190

191
void SHA_224::init(digest_type& digest) {
158,484✔
192
   digest.assign({0xC1059ED8, 0x367CD507, 0x3070DD17, 0xF70E5939, 0xFFC00B31, 0x68581511, 0x64F98FA7, 0xBEFA4FA4});
158,484✔
193
}
158,484✔
194

195
std::unique_ptr<HashFunction> SHA_224::new_object() const {
125✔
196
   return std::make_unique<SHA_224>();
125✔
197
}
198

199
std::unique_ptr<HashFunction> SHA_224::copy_state() const {
4✔
200
   return std::make_unique<SHA_224>(*this);
4✔
201
}
202

203
void SHA_224::add_data(std::span<const uint8_t> input) {
4,574,658✔
204
   m_md.update(input);
4,574,658✔
205
}
4,574,658✔
206

207
void SHA_224::final_result(std::span<uint8_t> output) {
153,675✔
208
   m_md.final(output);
153,675✔
209
}
153,675✔
210

211
std::string SHA_256::provider() const {
1,569✔
212
   return sha256_provider();
1,569✔
213
}
214

215
void SHA_256::compress_n(digest_type& digest, std::span<const uint8_t> input, size_t blocks) {
371,640,810✔
216
   SHA_256::compress_digest(digest, input, blocks);
371,640,810✔
217
}
×
218

219
void SHA_256::init(digest_type& digest) {
197,939,865✔
220
   digest.assign({0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19});
197,939,865✔
221
}
197,939,865✔
222

223
std::unique_ptr<HashFunction> SHA_256::new_object() const {
7,597✔
224
   return std::make_unique<SHA_256>();
7,597✔
225
}
226

227
std::unique_ptr<HashFunction> SHA_256::copy_state() const {
6,557✔
228
   return std::make_unique<SHA_256>(*this);
6,557✔
229
}
230

231
void SHA_256::add_data(std::span<const uint8_t> input) {
639,719,799✔
232
   m_md.update(input);
639,719,799✔
233
}
639,719,799✔
234

235
void SHA_256::final_result(std::span<uint8_t> output) {
197,528,755✔
236
   m_md.final(output);
197,528,755✔
237
}
197,528,755✔
238

239
}  // namespace Botan
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc