|
|
|
@ -25,28 +25,44 @@ |
|
|
|
#define INPUT_MESSAGE ("Testnachricht 123") |
|
|
|
#define INPUT_MESSAGE ("Testnachricht 123") |
|
|
|
|
|
|
|
|
|
|
|
#pragma region SHA1-Constants |
|
|
|
#pragma region SHA1-Constants |
|
|
|
|
|
|
|
// initial hash values
|
|
|
|
#define H0 0x67452301 |
|
|
|
#define H0 0x67452301 |
|
|
|
#define H1 0xEFCDAB89 |
|
|
|
#define H1 0xEFCDAB89 |
|
|
|
#define H2 0x98BADCFE |
|
|
|
#define H2 0x98BADCFE |
|
|
|
#define H3 0x10325476 |
|
|
|
#define H3 0x10325476 |
|
|
|
#define H4 0xC3D2E1F0 |
|
|
|
#define H4 0xC3D2E1F0 |
|
|
|
|
|
|
|
// constants Kt
|
|
|
|
|
|
|
|
#define K1 0x5A827999 |
|
|
|
|
|
|
|
#define K2 0x6ED9EBA1 |
|
|
|
|
|
|
|
#define K3 0x8F1BBCDC |
|
|
|
|
|
|
|
#define K4 0xCA62C1D6 |
|
|
|
#pragma endregion |
|
|
|
#pragma endregion |
|
|
|
|
|
|
|
|
|
|
|
void printBits(size_t const size, void const* const ptr); |
|
|
|
void printBits(size_t const size, void const* const ptr); |
|
|
|
uint32_t leftRotate(uint32_t n, uint32_t d); |
|
|
|
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) { |
|
|
|
void main(void) { |
|
|
|
|
|
|
|
|
|
|
|
int result = 0; |
|
|
|
int result = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf("****** SHA1 preprocessing ******\n\n"); |
|
|
|
|
|
|
|
#pragma region Preprocessing |
|
|
|
|
|
|
|
|
|
|
|
printf("------ Set initial hash value ------\n\n"); |
|
|
|
printf("------ Set initial hash value ------\n\n"); |
|
|
|
#pragma region Initial Hash values |
|
|
|
#pragma region Initial Hash values |
|
|
|
uint32_t h0, h1, h2, h3, h4; |
|
|
|
uint32_t a, b, c, d, e; |
|
|
|
h0 = H0; |
|
|
|
uint32_t h[5] = { H0, H1, H2, H3, H4 }; |
|
|
|
h1 = H1; |
|
|
|
uint32_t k[5] = { 0, K1, K2, K3, K4 }; // 5 so the array can be accessed by 1, 2, 3, 4
|
|
|
|
h2 = H2; |
|
|
|
a = h[0]; |
|
|
|
h3 = H3; |
|
|
|
b = h[1]; |
|
|
|
h4 = H4; |
|
|
|
c = h[2]; |
|
|
|
|
|
|
|
d = h[3]; |
|
|
|
|
|
|
|
e = h[4]; |
|
|
|
|
|
|
|
|
|
|
|
#pragma endregion |
|
|
|
#pragma endregion |
|
|
|
|
|
|
|
|
|
|
|
if (sizeof(INPUT_MESSAGE) * 8 > 447) { |
|
|
|
if (sizeof(INPUT_MESSAGE) * 8 > 447) { |
|
|
|
@ -57,7 +73,7 @@ void main(void) { |
|
|
|
printf("------ Padding message ------\n\n"); |
|
|
|
printf("------ Padding message ------\n\n"); |
|
|
|
#pragma region Padding |
|
|
|
#pragma region Padding |
|
|
|
unsigned char messageNoPadding[] = INPUT_MESSAGE; |
|
|
|
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"); |
|
|
|
printf("Message without padding\n"); |
|
|
|
printBits(sizeof(messageNoPadding), &messageNoPadding); |
|
|
|
printBits(sizeof(messageNoPadding), &messageNoPadding); |
|
|
|
unsigned char message[BLOCK_LENGTH] = ""; |
|
|
|
unsigned char message[BLOCK_LENGTH] = ""; |
|
|
|
@ -71,26 +87,84 @@ void main(void) { |
|
|
|
printf("\nMessage after adding 1: \n"); |
|
|
|
printf("\nMessage after adding 1: \n"); |
|
|
|
printBits(sizeof(message), &message); |
|
|
|
printBits(sizeof(message), &message); |
|
|
|
message[BLOCK_LENGTH - 1] = sizeof(INPUT_MESSAGE) * 8; |
|
|
|
message[BLOCK_LENGTH - 1] = sizeof(INPUT_MESSAGE) * 8; |
|
|
|
printf("\nMessage after length 1: \n"); |
|
|
|
printf("\nMessage after adding length: \n"); |
|
|
|
printBits(sizeof(message), &message); |
|
|
|
printBits(sizeof(message), &message); |
|
|
|
#pragma endregion |
|
|
|
#pragma endregion |
|
|
|
|
|
|
|
|
|
|
|
printf("------ Message scheduling ------\n\n"); |
|
|
|
#pragma endregion |
|
|
|
#pragma region Message scheduling |
|
|
|
|
|
|
|
uint32_t WordArray[80] = { 0 }; |
|
|
|
printf("****** Hash computation ******\n\n"); |
|
|
|
for (uint32_t i = 0; i < 16; i++) { |
|
|
|
#pragma region Hash computation |
|
|
|
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])); |
|
|
|
printf("\n------ Prepare message schedule ------\n\n"); |
|
|
|
WordArray[i] = tmp; |
|
|
|
#pragma region Prepare message schedule |
|
|
|
} |
|
|
|
uint32_t WordArray[80] = { 0 }; |
|
|
|
for (uint32_t i = 16; i < 80; i++) { |
|
|
|
for (uint32_t i = 0; i < 16; i++) { |
|
|
|
WordArray[i] = leftRotate((WordArray[i - 3] ^ WordArray[i - 8] ^ WordArray[i - 14] ^ WordArray[i - 16]), 1); |
|
|
|
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 |
|
|
|
#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; |
|
|
|
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) |
|
|
|
uint32_t leftRotate(uint32_t n, uint32_t d) |
|
|
|
{ |
|
|
|
{ |
|
|
|
/* In n<<d, last d bits are 0. To put first 3 bits of n at
|
|
|
|
/* In n<<d, last d bits are 0. To put first 3 bits of n at
|
|
|
|
@ -111,7 +185,8 @@ void printBits(size_t const size, void const* const ptr) |
|
|
|
printf("%u", byte); |
|
|
|
printf("%u", byte); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
/*for (i = size - 1; i >= 0; i--) {
|
|
|
|
/*original:
|
|
|
|
|
|
|
|
for (i = size - 1; i >= 0; i--) { |
|
|
|
for (j = 7; j >= 0; j--) { |
|
|
|
for (j = 7; j >= 0; j--) { |
|
|
|
byte = (b[i] >> j) & 1; |
|
|
|
byte = (b[i] >> j) & 1; |
|
|
|
printf("%u", byte); |
|
|
|
printf("%u", byte); |
|
|
|
|