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/mdx_hash.h> 13 14 BOTAN_FUTURE_INTERNAL_HEADER(sha2_32.h) 15 16 namespace Botan { 17 18 /** 19 * SHA-224 20 */ 21 class BOTAN_PUBLIC_API(2,0) SHA_224 final : public MDx_HashFunction 22 { 23 public: name()24 std::string name() const override { return "SHA-224"; } output_length()25 size_t output_length() const override { return 28; } clone()26 HashFunction* clone() const override { return new SHA_224; } 27 std::unique_ptr<HashFunction> copy_state() const override; 28 29 void clear() override; 30 31 std::string provider() const override; 32 SHA_224()33 SHA_224() : MDx_HashFunction(64, true, true), m_digest(8) 34 { clear(); } 35 private: 36 void compress_n(const uint8_t[], size_t blocks) override; 37 void copy_out(uint8_t[]) override; 38 39 secure_vector<uint32_t> m_digest; 40 }; 41 42 /** 43 * SHA-256 44 */ 45 class BOTAN_PUBLIC_API(2,0) SHA_256 final : public MDx_HashFunction 46 { 47 public: name()48 std::string name() const override { return "SHA-256"; } output_length()49 size_t output_length() const override { return 32; } clone()50 HashFunction* clone() const override { return new SHA_256; } 51 std::unique_ptr<HashFunction> copy_state() const override; 52 53 void clear() override; 54 55 std::string provider() const override; 56 SHA_256()57 SHA_256() : MDx_HashFunction(64, true, true), m_digest(8) 58 { clear(); } 59 60 /* 61 * Perform a SHA-256 compression. For internal use 62 */ 63 static void compress_digest(secure_vector<uint32_t>& digest, 64 const uint8_t input[], 65 size_t blocks); 66 67 private: 68 69 #if defined(BOTAN_HAS_SHA2_32_ARMV8) 70 static void compress_digest_armv8(secure_vector<uint32_t>& digest, 71 const uint8_t input[], 72 size_t blocks); 73 #endif 74 75 #if defined(BOTAN_HAS_SHA2_32_X86_BMI2) 76 static void compress_digest_x86_bmi2(secure_vector<uint32_t>& digest, 77 const uint8_t input[], 78 size_t blocks); 79 #endif 80 81 #if defined(BOTAN_HAS_SHA2_32_X86) 82 static void compress_digest_x86(secure_vector<uint32_t>& digest, 83 const uint8_t input[], 84 size_t blocks); 85 #endif 86 87 void compress_n(const uint8_t[], size_t blocks) override; 88 void copy_out(uint8_t[]) override; 89 90 secure_vector<uint32_t> m_digest; 91 }; 92 93 } 94 95 #endif 96