diff --git a/ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj b/ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj
index 65a1f67..024cc82 100644
--- a/ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj
+++ b/ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj
@@ -21,9 +21,6 @@
-
-
-
16.0
Win32Proj
diff --git a/ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj.filters b/ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj.filters
index 700242d..decff76 100644
--- a/ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj.filters
+++ b/ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj.filters
@@ -19,9 +19,4 @@
Source Files
-
-
- Header Files
-
-
\ No newline at end of file
diff --git a/ASYD_Cryptograhpy/SW05-SHA1/main.c b/ASYD_Cryptograhpy/SW05-SHA1/main.c
index 3c553cb..391c72c 100644
--- a/ASYD_Cryptograhpy/SW05-SHA1/main.c
+++ b/ASYD_Cryptograhpy/SW05-SHA1/main.c
@@ -25,28 +25,44 @@
#define INPUT_MESSAGE ("Testnachricht 123")
#pragma region SHA1-Constants
+// initial hash values
#define H0 0x67452301
#define H1 0xEFCDAB89
#define H2 0x98BADCFE
#define H3 0x10325476
#define H4 0xC3D2E1F0
+// constants Kt
+#define K1 0x5A827999
+#define K2 0x6ED9EBA1
+#define K3 0x8F1BBCDC
+#define K4 0xCA62C1D6
#pragma endregion
void printBits(size_t const size, void const* const ptr);
uint32_t leftRotate(uint32_t n, uint32_t d);
+uint32_t SHA1_f1(uint32_t b, uint32_t c, uint32_t d);
+uint32_t SHA1_f2(uint32_t b, uint32_t c, uint32_t d);
+uint32_t SHA1_f3(uint32_t b, uint32_t c, uint32_t d);
+uint32_t SHA1_f4(uint32_t b, uint32_t c, uint32_t d);
void main(void) {
int result = 0;
+ printf("****** SHA1 preprocessing ******\n\n");
+#pragma region Preprocessing
+
printf("------ Set initial hash value ------\n\n");
#pragma region Initial Hash values
- uint32_t h0, h1, h2, h3, h4;
- h0 = H0;
- h1 = H1;
- h2 = H2;
- h3 = H3;
- h4 = H4;
+ uint32_t a, b, c, d, e;
+ uint32_t h[5] = { H0, H1, H2, H3, H4 };
+ uint32_t k[5] = { 0, K1, K2, K3, K4 }; // 5 so the array can be accessed by 1, 2, 3, 4
+ a = h[0];
+ b = h[1];
+ c = h[2];
+ d = h[3];
+ e = h[4];
+
#pragma endregion
if (sizeof(INPUT_MESSAGE) * 8 > 447) {
@@ -57,7 +73,7 @@ void main(void) {
printf("------ Padding message ------\n\n");
#pragma region Padding
unsigned char messageNoPadding[] = INPUT_MESSAGE;
- printf("Size of message without padding: %i bits\n", sizeof(INPUT_MESSAGE) * 8);
+ printf("Size of message without padding: %i bits\n", (int)(sizeof(INPUT_MESSAGE) * 8));
printf("Message without padding\n");
printBits(sizeof(messageNoPadding), &messageNoPadding);
unsigned char message[BLOCK_LENGTH] = "";
@@ -71,26 +87,84 @@ void main(void) {
printf("\nMessage after adding 1: \n");
printBits(sizeof(message), &message);
message[BLOCK_LENGTH - 1] = sizeof(INPUT_MESSAGE) * 8;
- printf("\nMessage after length 1: \n");
+ printf("\nMessage after adding length: \n");
printBits(sizeof(message), &message);
#pragma endregion
- printf("------ Message scheduling ------\n\n");
- #pragma region Message scheduling
- uint32_t WordArray[80] = { 0 };
- for (uint32_t i = 0; i < 16; i++) {
- uint32_t currentbyte = message[i] << 24;
- uint32_t tmp = (uint32_t)(((uint8_t)(message[i * 4]) << 24) + ((uint8_t)(message[4 * i + 1]) << 16) + ((uint8_t)(message[4 * i + 2]) << 8) + (uint8_t)(message[4 * i + 3]));
- WordArray[i] = tmp;
- }
- for (uint32_t i = 16; i < 80; i++) {
- WordArray[i] = leftRotate((WordArray[i - 3] ^ WordArray[i - 8] ^ WordArray[i - 14] ^ WordArray[i - 16]), 1);
- }
+#pragma endregion
+
+ printf("****** Hash computation ******\n\n");
+#pragma region Hash computation
+
+ printf("\n------ Prepare message schedule ------\n\n");
+ #pragma region Prepare message schedule
+ uint32_t WordArray[80] = { 0 };
+ for (uint32_t i = 0; i < 16; i++) {
+ uint32_t currentbyte = message[i] << 24;
+ uint32_t tmp = (uint32_t)(((uint8_t)(message[i * 4]) << 24) + ((uint8_t)(message[4 * i + 1]) << 16) + ((uint8_t)(message[4 * i + 2]) << 8) + (uint8_t)(message[4 * i + 3]));
+ WordArray[i] = tmp;
+ }
+ for (uint32_t i = 16; i < 80; i++) {
+ WordArray[i] = leftRotate((WordArray[i - 3] ^ WordArray[i - 8] ^ WordArray[i - 14] ^ WordArray[i - 16]), 1);
+ }
+ #pragma endregion
+
+ printf("\n------ Stages ------\n\n");
+ #pragma region Stages calculations
+ uint32_t (*f_ptr)(uint32_t, uint32_t, uint32_t) = &SHA1_f1; // use: (*f_ptr)(b,c,d);
+ uint8_t t = 1;
+
+ // stage 1...4
+ for (uint32_t i = 0; i < 80; i++) {
+ uint32_t T = leftRotate(a, 5) + ((*f_ptr)(b, c, d)) + e + k[t] + WordArray[i];
+ e = d;
+ d = c;
+ c = leftRotate(b, 30);
+ b = a;
+ a = T;
+
+ // switch stages
+ if (i == 19) { f_ptr = SHA1_f2; t = 2; }
+ else if (i == 39) { f_ptr = SHA1_f3; t = 3; }
+ else if (i == 59) { f_ptr = SHA1_f4; t = 4; }
+ }
#pragma endregion
+ printf("\n------ Intermediate hash calculation ------\n\n");
+ #pragma region intermediate hash calculation
+ h[0] = a + h[0];
+ h[1] = b + h[1];
+ h[2] = c + h[2];
+ h[3] = d + h[3];
+ h[4] = e + h[4];
+ #pragma endregion
+#pragma endregion
+
+ printf("\n****** Resulting hash ******\n\n");
+ for (uint8_t i = 0; i < 5; i++) {
+ printf("%X", h[i]);
+ }
+ printf("\n\n");
+
return 0;
}
+uint32_t SHA1_f1(uint32_t b, uint32_t c, uint32_t d) {
+ return (b & c) | (~b & d);
+}
+
+uint32_t SHA1_f2(uint32_t b, uint32_t c, uint32_t d) {
+ return b ^ c ^ d;
+}
+
+uint32_t SHA1_f3(uint32_t b, uint32_t c, uint32_t d) {
+ return (b & c) | (b & d) | (c & d);
+}
+
+uint32_t SHA1_f4(uint32_t b, uint32_t c, uint32_t d) {
+ return b ^ c ^ d;
+}
+
uint32_t leftRotate(uint32_t n, uint32_t d)
{
/* In n<= 0; i--) {
+ /*original:
+ for (i = size - 1; i >= 0; i--) {
for (j = 7; j >= 0; j--) {
byte = (b[i] >> j) & 1;
printf("%u", byte);