summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sha.h57
-rw-r--r--include/sha256.h30
-rw-r--r--src/sha256.cc5
3 files changed, 64 insertions, 28 deletions
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<cstdint>
+#include<array>
+
+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<cstdint>
#include<array>
+#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<uint32_t, 64> 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
diff --git a/src/sha256.cc b/src/sha256.cc
index 7ef467e..7790f8a 100644
--- a/src/sha256.cc
+++ b/src/sha256.cc
@@ -8,7 +8,6 @@ hmacsha256::SHA256::SHA256(const uint8_t* data, uint32_t length) {
}
void hmacsha256::SHA256::init(const uint8_t* data, uint32_t length) {
- digest_ = new uint8_t[32];
message_l_ = bit_len_ = 0;
vars_[0] = 0x6a09e667;
vars_[1] = 0xbb67ae85;
@@ -30,10 +29,6 @@ void hmacsha256::SHA256::init(const uint8_t* data, uint32_t length) {
}
}
-hmacsha256::SHA256::~SHA256() {
- delete digest_;
-}
-
hmacsha256::SHA256::SHA256(const std::string& data) {
init(reinterpret_cast<const uint8_t*> (data.c_str()), data.size());
}