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

randombit / botan / 18675744264

21 Oct 2025 07:06AM UTC coverage: 90.669% (-1.4%) from 92.088%
18675744264

Pull #5125

github

web-flow
Merge c1c8ec9e4 into a3ed3b00b
Pull Request #5125: Chore: Update Android NDK to r29

100391 of 110722 relevant lines covered (90.67%)

12225322.96 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/bit_ops.h>
12
#include <botan/internal/loadstor.h>
13
#include <botan/internal/rotate.h>
14
#include <botan/internal/sha2_32_f.h>
15
#include <botan/internal/stack_scrubbing.h>
16
#include <botan/internal/stl_util.h>
17

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

22
namespace Botan {
23

24
namespace {
25

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

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

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

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

51
   return "base";
×
52
}
53

54
}  // namespace
55

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

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

74
#if defined(BOTAN_HAS_SHA2_32_X86_AVX2)
75
   if(CPUID::has(CPUID::Feature::AVX2, CPUID::Feature::BMI)) {
11,601✔
76
      return SHA_256::compress_digest_x86_avx2(digest, input, blocks);
3,868✔
77
   }
78
#endif
79

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

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

95
   std::array<uint32_t, 16> W{};
×
96

97
   BufferSlicer in(input);
×
98

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

102
      // clang-format off
103

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

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

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

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

172
      // clang-format on
173

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

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

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

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

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

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

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

209
void SHA_224::final_result(std::span<uint8_t> output) {
153,677✔
210
   m_md.final(output);
153,677✔
211
}
153,677✔
212

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

217
void SHA_256::compress_n(digest_type& digest, std::span<const uint8_t> input, size_t blocks) {
371,411,726✔
218
   SHA_256::compress_digest(digest, input, blocks);
371,411,726✔
219
}
×
220

221
void SHA_256::init(digest_type& digest) {
197,724,869✔
222
   digest.assign({0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19});
197,724,869✔
223
}
197,724,869✔
224

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

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

233
void SHA_256::add_data(std::span<const uint8_t> input) {
639,280,321✔
234
   m_md.update(input);
639,280,321✔
235
}
639,280,321✔
236

237
void SHA_256::final_result(std::span<uint8_t> output) {
197,313,139✔
238
   m_md.final(output);
197,313,139✔
239
}
197,313,139✔
240

241
}  // 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