/** *--------------------------------------------------------------------\n * HSLU T&A Hochschule Luzern Technik+Architektur \n *--------------------------------------------------------------------\n * * \brief ASYD assignment crypto 05 * \file * \author Basil Estermann, basil.estermann@stud.hslu.ch * Simon Frei, simon.frei@stud.hslu.ch * Jonas Arnold, jonas.arnold@stud.hslu.ch * \date 23.03.2023 * *-------------------------------------------------------------------- */ #include #include #include #include #include #define VALUE_LENGTH 32 #define MESSAGE_DIGEST_LENGTH 160 #define BLOCK_LENGTH (512/8) #define INPUT_MESSAGE ("Testnachricht 123") #pragma region SHA1-Constants #define H0 0x67452301 #define H1 0xEFCDAB89 #define H2 0x98BADCFE #define H3 0x10325476 #define H4 0xC3D2E1F0 #pragma endregion void printBits(size_t const size, void const* const ptr); uint32_t leftRotate(uint32_t n, uint32_t d); void main(void) { int result = 0; 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; #pragma endregion if (sizeof(INPUT_MESSAGE) * 8 > 447) { printf("Message too long!"); return 1000002; } 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("Message without padding\n"); printBits(sizeof(messageNoPadding), &messageNoPadding); unsigned char message[BLOCK_LENGTH] = ""; // fill in message for (uint32_t i = 0; i < sizeof(INPUT_MESSAGE); i++) { message[i] = INPUT_MESSAGE[i]; } // set bit message[sizeof(INPUT_MESSAGE)] = 0b10000000; printf("\nMessage after adding 1: \n"); printBits(sizeof(message), &message); message[BLOCK_LENGTH - 1] = sizeof(INPUT_MESSAGE) * 8; printf("\nMessage after length 1: \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 return 0; } uint32_t leftRotate(uint32_t n, uint32_t d) { /* In n<>(INT_BITS - d) */ return (n << d) | (n >> (VALUE_LENGTH - d)); } // Assumes little endian void printBits(size_t const size, void const* const ptr) { unsigned char* b = (unsigned char*)ptr; unsigned char byte; int i, j; for (i = 0; i < size; i++) { for (j = 7; j >= 0; j--) { byte = (b[i] >> j) & 1; printf("%u", byte); } } /*for (i = size - 1; i >= 0; i--) { for (j = 7; j >= 0; j--) { byte = (b[i] >> j) & 1; printf("%u", byte); } }*/ puts(""); }