fix: sha2 works
This commit is contained in:
parent
0fd29467a3
commit
a3f77b4f45
1 changed files with 48 additions and 5 deletions
|
@ -2,6 +2,7 @@
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <threads.h>
|
#include <threads.h>
|
||||||
|
|
||||||
#define err_handler(RES) \
|
#define err_handler(RES) \
|
||||||
|
@ -17,6 +18,12 @@ static uint32_t addTemp = 0;
|
||||||
? shaInputTooLong \
|
? shaInputTooLong \
|
||||||
: (context)->corrupted)
|
: (context)->corrupted)
|
||||||
|
|
||||||
|
#define dump_hash(context) \
|
||||||
|
for (int o = 0; o < SHA2_256_HashParts; o++) { \
|
||||||
|
TRACE("%08x", context->intermediate_hash[o]); \
|
||||||
|
} \
|
||||||
|
TRACELN("")
|
||||||
|
|
||||||
/* Define the SHA shift, rotate left, and rotate right macros */
|
/* Define the SHA shift, rotate left, and rotate right macros */
|
||||||
#define SHA256_SHR(bits, word) ((word) >> (bits))
|
#define SHA256_SHR(bits, word) ((word) >> (bits))
|
||||||
#define SHA256_ROTL(bits, word) (((word) << (bits)) | ((word) >> (32 - (bits))))
|
#define SHA256_ROTL(bits, word) (((word) << (bits)) | ((word) >> (32 - (bits))))
|
||||||
|
@ -38,7 +45,7 @@ static uint32_t addTemp = 0;
|
||||||
#define sha2_256_show_internal_state(context) \
|
#define sha2_256_show_internal_state(context) \
|
||||||
TRACE("Internal State:\n\tcorrupted: %d\n\tintermediate_hash: ", \
|
TRACE("Internal State:\n\tcorrupted: %d\n\tintermediate_hash: ", \
|
||||||
context->corrupted); \
|
context->corrupted); \
|
||||||
dump_data((uint8_t *)context->intermediate_hash, SHA2_256_HashBytes); \
|
dump_hash(context); \
|
||||||
TRACE("\tmessage_block_index: %d\n\tmessage_block: ", \
|
TRACE("\tmessage_block_index: %d\n\tmessage_block: ", \
|
||||||
context->message_block_index); \
|
context->message_block_index); \
|
||||||
dump_data((uint8_t *)context->message_block, SHA2_256_BlockSize); \
|
dump_data((uint8_t *)context->message_block, SHA2_256_BlockSize); \
|
||||||
|
@ -79,13 +86,20 @@ static const uint32_t K[SHA2_256_BlockSize] = {
|
||||||
* names used in the Secure Hash Standard.
|
* names used in the Secure Hash Standard.
|
||||||
*/
|
*/
|
||||||
static void sha2_256_process_message_block(SHA2Context *context) {
|
static void sha2_256_process_message_block(SHA2Context *context) {
|
||||||
#define dump_letter(X) TRACE("%s: %08x\n", STR(X), X)
|
#define dump_letter(X) TRACE("%s: %08x ", STR(X), X)
|
||||||
#define dump_alphabet(A, B, C, D, E, F, G, H) \
|
#define dump_alphabet \
|
||||||
dump_letter(A) dump_letter(B) dump_letter(C) dump_letter(D) dump_letter(E) \
|
dump_letter(A) dump_letter(B) dump_letter(C) dump_letter(D) dump_letter(E) \
|
||||||
dump_letter(F) dump_letter(G) dump_letter(H)
|
dump_letter(F) dump_letter(G) dump_letter(H) TRACELN("")
|
||||||
|
#define dump_w \
|
||||||
|
TRACELN("Dumping W:"); \
|
||||||
|
for (int o = 0; o < SHA2_256_BlockSize; o++) { \
|
||||||
|
TRACE("\tW[%d]: %032b\n", o, W[o]) \
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef TEST
|
||||||
TRACELN("before process message block");
|
TRACELN("before process message block");
|
||||||
sha2_256_show_internal_state(context);
|
sha2_256_show_internal_state(context);
|
||||||
|
#endif // TEST
|
||||||
|
|
||||||
uint8_t t, t4; /* Loop counter */
|
uint8_t t, t4; /* Loop counter */
|
||||||
uint32_t temp1, temp2; /* Temporary word value */
|
uint32_t temp1, temp2; /* Temporary word value */
|
||||||
|
@ -102,11 +116,19 @@ static void sha2_256_process_message_block(SHA2Context *context) {
|
||||||
(((uint32_t)context->message_block[t4 + 3]));
|
(((uint32_t)context->message_block[t4 + 3]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TEST
|
||||||
|
dump_w;
|
||||||
|
#endif // TEST
|
||||||
|
|
||||||
for (t = 16; t < SHA2_256_BlockSize; t++) {
|
for (t = 16; t < SHA2_256_BlockSize; t++) {
|
||||||
W[t] = SHA256_sigma1(W[t - 2]) + W[t - 7] + SHA256_sigma0(W[t - 15]) +
|
W[t] = SHA256_sigma1(W[t - 2]) + W[t - 7] + SHA256_sigma0(W[t - 15]) +
|
||||||
W[t - 16];
|
W[t - 16];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TEST
|
||||||
|
dump_w;
|
||||||
|
#endif // TEST
|
||||||
|
|
||||||
A = context->intermediate_hash[0];
|
A = context->intermediate_hash[0];
|
||||||
B = context->intermediate_hash[1];
|
B = context->intermediate_hash[1];
|
||||||
C = context->intermediate_hash[2];
|
C = context->intermediate_hash[2];
|
||||||
|
@ -117,6 +139,11 @@ static void sha2_256_process_message_block(SHA2Context *context) {
|
||||||
H = context->intermediate_hash[7];
|
H = context->intermediate_hash[7];
|
||||||
|
|
||||||
for (t = 0; t < SHA2_256_BlockSize; t++) {
|
for (t = 0; t < SHA2_256_BlockSize; t++) {
|
||||||
|
#ifdef TEST
|
||||||
|
TRACE("Iter: %d\t", t);
|
||||||
|
dump_alphabet;
|
||||||
|
#endif // TEST
|
||||||
|
|
||||||
temp1 = H + SHA256_SIGMA1(E) + SHA_Ch(E, F, G) + K[t] + W[t];
|
temp1 = H + SHA256_SIGMA1(E) + SHA_Ch(E, F, G) + K[t] + W[t];
|
||||||
temp2 = SHA256_SIGMA0(A) + SHA_Maj(A, B, C);
|
temp2 = SHA256_SIGMA0(A) + SHA_Maj(A, B, C);
|
||||||
H = G;
|
H = G;
|
||||||
|
@ -129,6 +156,18 @@ static void sha2_256_process_message_block(SHA2Context *context) {
|
||||||
A = temp1 + temp2;
|
A = temp1 + temp2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TEST
|
||||||
|
TRACE("DONE:\t")
|
||||||
|
dump_alphabet;
|
||||||
|
#endif // TEST
|
||||||
|
|
||||||
|
#ifdef TEST
|
||||||
|
TRACE("Intermediate hash before we add the working variables:\n");
|
||||||
|
for (int o = 0; o < SHA2_256_HashParts; o++) {
|
||||||
|
TRACE("\t%d:\t%032b\n", o, context->intermediate_hash[o]);
|
||||||
|
}
|
||||||
|
#endif // TEST
|
||||||
|
|
||||||
context->intermediate_hash[0] += A;
|
context->intermediate_hash[0] += A;
|
||||||
context->intermediate_hash[1] += B;
|
context->intermediate_hash[1] += B;
|
||||||
context->intermediate_hash[2] += C;
|
context->intermediate_hash[2] += C;
|
||||||
|
@ -140,8 +179,12 @@ static void sha2_256_process_message_block(SHA2Context *context) {
|
||||||
|
|
||||||
context->message_block_index = 0;
|
context->message_block_index = 0;
|
||||||
|
|
||||||
TRACELN("after process message block");
|
#ifdef TEST
|
||||||
|
TRACE("Hash data if we finish now: ");
|
||||||
|
dump_hash(context);
|
||||||
|
TRACELN("\nafter process message block");
|
||||||
sha2_256_show_internal_state(context);
|
sha2_256_show_internal_state(context);
|
||||||
|
#endif // TEST
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue