83 lines
1.8 KiB
C++
83 lines
1.8 KiB
C++
#include <tgmath.h>
|
|
#include <cstring>
|
|
#include <stdint.h>
|
|
|
|
constexpr void compute_md5_table(uint32_t*, size_t);
|
|
|
|
class Block {
|
|
public:
|
|
char* data;
|
|
char* hash;
|
|
char* previous_hash;
|
|
|
|
Block(char*, char*);
|
|
char* hmac(char*);
|
|
};
|
|
|
|
Block::Block(char* data, char* prev) {
|
|
this->data = data;
|
|
this->hash = this->hmac(data);
|
|
this->previous_hash = prev;
|
|
}
|
|
|
|
|
|
|
|
char* Block::hmac(char* input) {
|
|
const size_t _TABLE_SIZE = 64;
|
|
uint32_t table[_TABLE_SIZE];
|
|
compute_md5_table(table, _TABLE_SIZE);
|
|
|
|
// values are taken straight from wikipedia
|
|
size_t a0 = 0x67452301; // A
|
|
size_t b0 = 0xefcdab89; // B
|
|
size_t c0 = 0x98badcfe; // C
|
|
size_t d0 = 0x10325476; // D
|
|
|
|
// lots of reallocs inc
|
|
size_t msg_len = strlen(input) + 1;
|
|
uint8_t* buf = (uint8_t*)malloc(msg_len /* for the '1' bit */);
|
|
memcpy(buf, input, msg_len);
|
|
buf[strlen(input)] = 0x80; // adding in the '1' bit along with 7 bits for padding
|
|
|
|
// calculate length of final message content with all padding
|
|
size_t message_len_bits = msg_len * 8;
|
|
while((message_len_bits) % 512 != 64 ) {
|
|
message_len_bits += 8;
|
|
}
|
|
|
|
// prepare out new hash buffer which has a mutaable state
|
|
uint8_t* hash_buf = (uint8_t*)malloc(message_len_bits / 8);
|
|
memcpy(hash_buf, buf, msg_len);
|
|
|
|
size_t hunk_count = msg_len/8;
|
|
for(size_t i =0; i < hunk_count; i+=8) {
|
|
uint8_t* hunk = &hash_buf[i]; // length should always be 8(bytes)/512 bits
|
|
// split the hunk into pieces
|
|
uint32_t parts[16];
|
|
for(size_t p = 0; p < 16; p+=32) {
|
|
parts[p] = (uint32_t)hunk[p];
|
|
}
|
|
for(size_t z = 0;z<16;z++) {
|
|
printf("%08X ", parts[z]);
|
|
}
|
|
printf("\n");
|
|
|
|
}
|
|
free(hash_buf);
|
|
free(buf);
|
|
return NULL;
|
|
}
|
|
|
|
int main(void) {
|
|
Block* b = new Block("something", NULL);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
constexpr void compute_md5_table(uint32_t* table, size_t size) {
|
|
for(int i = 0; i < 64; i++) {
|
|
table[i] = floor( pow(2,32) * abs( sin(i+1) ) );
|
|
}
|
|
}
|