Coverage Report

Created: 2024-11-29 06:10

/src/botan/build/include/internal/botan/internal/sha2_32.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
* SHA-{224,256}
3
* (C) 1999-2011 Jack Lloyd
4
*     2007 FlexSecure GmbH
5
*
6
* Botan is released under the Simplified BSD License (see license.txt)
7
*/
8
9
#ifndef BOTAN_SHA_224_256_H_
10
#define BOTAN_SHA_224_256_H_
11
12
#include <botan/internal/mdx_hash.h>
13
14
namespace Botan {
15
16
/**
17
* SHA-224
18
*/
19
class SHA_224 final : public HashFunction {
20
   public:
21
      using digest_type = secure_vector<uint32_t>;
22
23
      static constexpr MD_Endian byte_endianness = MD_Endian::Big;
24
      static constexpr MD_Endian bit_endianness = MD_Endian::Big;
25
      static constexpr size_t block_bytes = 64;
26
      static constexpr size_t output_bytes = 28;
27
      static constexpr size_t ctr_bytes = 8;
28
29
      static void compress_n(digest_type& digest, std::span<const uint8_t> input, size_t blocks);
30
      static void init(digest_type& digest);
31
32
   public:
33
11
      std::string name() const override { return "SHA-224"; }
34
35
255
      size_t output_length() const override { return output_bytes; }
36
37
0
      size_t hash_block_size() const override { return block_bytes; }
38
39
      std::unique_ptr<HashFunction> new_object() const override;
40
41
      std::unique_ptr<HashFunction> copy_state() const override;
42
43
0
      void clear() override { m_md.clear(); }
44
45
      std::string provider() const override;
46
47
   private:
48
      void add_data(std::span<const uint8_t> input) override;
49
50
      void final_result(std::span<uint8_t> output) override;
51
52
   private:
53
      MerkleDamgard_Hash<SHA_224> m_md;
54
};
55
56
/**
57
* SHA-256
58
*/
59
class SHA_256 final : public HashFunction {
60
   public:
61
      using digest_type = secure_vector<uint32_t>;
62
63
      static constexpr MD_Endian byte_endianness = MD_Endian::Big;
64
      static constexpr MD_Endian bit_endianness = MD_Endian::Big;
65
      static constexpr size_t block_bytes = 64;
66
      static constexpr size_t output_bytes = 32;
67
      static constexpr size_t ctr_bytes = 8;
68
69
      static void compress_n(digest_type& digest, std::span<const uint8_t> input, size_t blocks);
70
      static void init(digest_type& digest);
71
72
   public:
73
10.8k
      std::string name() const override { return "SHA-256"; }
74
75
177k
      size_t output_length() const override { return output_bytes; }
76
77
8.01k
      size_t hash_block_size() const override { return block_bytes; }
78
79
      std::unique_ptr<HashFunction> new_object() const override;
80
81
      std::unique_ptr<HashFunction> copy_state() const override;
82
83
9.22k
      void clear() override { m_md.clear(); }
84
85
      std::string provider() const override;
86
87
   public:
88
      static void compress_digest(digest_type& digest, std::span<const uint8_t> input, size_t blocks);
89
90
#if defined(BOTAN_HAS_SHA2_32_ARMV8)
91
      static void compress_digest_armv8(digest_type& digest, std::span<const uint8_t> input, size_t blocks);
92
#endif
93
94
#if defined(BOTAN_HAS_SHA2_32_X86_BMI2)
95
      static void compress_digest_x86_bmi2(digest_type& digest, std::span<const uint8_t> input, size_t blocks);
96
#endif
97
98
#if defined(BOTAN_HAS_SHA2_32_X86)
99
      static void compress_digest_x86(digest_type& digest, std::span<const uint8_t> input, size_t blocks);
100
#endif
101
102
   private:
103
      void add_data(std::span<const uint8_t> input) override;
104
105
      void final_result(std::span<uint8_t> output) override;
106
107
   private:
108
      MerkleDamgard_Hash<SHA_256> m_md;
109
};
110
111
}  // namespace Botan
112
113
#endif