From fc9b28a97b9c8124840a82d798b7b1be18ecad43 Mon Sep 17 00:00:00 2001 From: Santo Cariotti Date: Mon, 1 Mar 2021 20:51:28 +0100 Subject: chore: split sha256 in base sha class --- include/sha.h | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ include/sha256.h | 30 +++++++---------------------- 2 files changed, 64 insertions(+), 23 deletions(-) create mode 100644 include/sha.h (limited to 'include') diff --git a/include/sha.h b/include/sha.h new file mode 100644 index 0000000..255c769 --- /dev/null +++ b/include/sha.h @@ -0,0 +1,57 @@ +// This file is part of a crypto library, exam for the Algorithms class. +// All of these files are under MIT license. +// +// SHA declaration document: +// https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf + +#ifndef HMACSHA256_SHA_H_ +#define HMACSHA256_SHA_H_ + +#include +#include + +namespace hmacsha256 { +class SHA { +public: + SHA() { + digest_ = new uint8_t[32]; + } + + ~SHA() { + delete digest_; + } + + // get digest as array of bytes + virtual uint8_t* digest() = 0; + + virtual std::string hexdigest() = 0; +protected: + uint8_t* digest_; + + // work variables: a, b, c, d, e, f, g, h + uint32_t vars_[8]; + + // data message, in bytes + // M, "message to be hashed" + uint8_t message_[64]; + + // length L of the original message + uint32_t message_l_; + + // lenght of bits + uint64_t bit_len_; + + // the constructor + virtual void init(const uint8_t* data, uint32_t length) = 0; + + // padding + virtual void pad() = 0; + + // main function + virtual void transform() = 0; +}; + + +} // namespace hmacsha256 + +#endif // HMACSHA256_SHA_H_ diff --git a/include/sha256.h b/include/sha256.h index c02eb40..921a50f 100644 --- a/include/sha256.h +++ b/include/sha256.h @@ -9,37 +9,21 @@ #include #include +#include "sha.h" namespace hmacsha256 { -class SHA256 { +class SHA256 : public SHA { public: // create a new SHA256 thanks an array of bytes SHA256(const uint8_t*, uint32_t); SHA256(const std::string&); - ~SHA256(); - // get digest as array of bytes - uint8_t* digest(); + uint8_t* digest() override; - std::string hexdigest(); + std::string hexdigest() override; private: - uint8_t* digest_; - - // work variables: a, b, c, d, e, f, g, h - uint32_t vars_[8]; - - // data message, in bytes - // M, "message to be hashed" - uint8_t message_[64]; - - // length L of the original message - uint32_t message_l_; - - // lengh of bits - uint64_t bit_len_; - // first 80 costansts 64bit words, paragraph 4.2.2 std::array K = { 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5, @@ -61,7 +45,7 @@ private: }; // the constructor - void init(const uint8_t* data, uint32_t length); + void init(const uint8_t* data, uint32_t length) override; // Ch(x, y, z) = (x | y) ^ (~x & z) static uint32_t ch(uint32_t, uint32_t, uint32_t); @@ -90,10 +74,10 @@ private: static uint32_t sigma1(uint32_t); // padding - void pad(); + void pad() override; // main function - void transform(); + void transform() override; // transform bytes in big-endian, because SHA256 wants big endian ordering // Takes 1 parameter, the array of bytes that we want to reorder -- cgit v1.2.3-18-g5258