-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_sha512.cpp
More file actions
122 lines (101 loc) · 4.46 KB
/
test_sha512.cpp
File metadata and controls
122 lines (101 loc) · 4.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cassert>
typedef unsigned long long ull;
unsigned long long h[8] = {0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179};
unsigned long long k[80] = {0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, 0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, 0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, 0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df, 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b, 0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b, 0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b, 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817};
ull *H;
ull *M;
int word_ptr, byte_ptr, bit_ptr;
void append_byte(unsigned char byte) {
assert(bit_ptr == 0);
M[word_ptr] &= ~((ull)0xFF << ((8-1 - byte_ptr)*8) );
M[word_ptr] |= ((ull)byte << ((8-1 - byte_ptr)*8) );
byte_ptr = byte_ptr + 1;
word_ptr += byte_ptr / 8;
byte_ptr = byte_ptr % 8;
}
void append_word(ull word) {
assert(byte_ptr == 0);
M[word_ptr++] = word;
}
ull right_rotate(ull num, int val) {
return (num >> val) | (num << (64 - val));
}
void get_hash(ull *M, ull *H) {
ull w[80];
for (int i = 0; i < 16; i++)
w[i] = M[i];
for (int i = 16; i < 80; i++) {
ull s0 = right_rotate(w[i-15], 1) ^ right_rotate(w[i-15], 8) ^ (w[i-15] >> 7);
ull s1 = right_rotate(w[i-2], 19) ^ right_rotate(w[i-2], 61) ^ (w[i-2] >> 6);
w[i] = w[i-16] + s0 + w[i-7] + s1;
}
ull w_a=H[0], w_b=H[1], w_c=H[2], w_d=H[3], w_e=H[4], w_f=H[5], w_g=H[6], w_h=H[7];
for (int i = 0; i < 80; i++) {
ull S1 = right_rotate(w_e, 14) ^ right_rotate(w_e, 18) ^ right_rotate(w_e, 41);
ull ch = (w_e & w_f) ^ (~w_e & w_g);
ull temp1 = w_h + S1 + ch + k[i] + w[i];
ull S0 = right_rotate(w_a, 28) ^ right_rotate(w_a, 34) ^ right_rotate(w_a, 39);
ull maj = (w_a & w_b) ^ (w_a & w_c) ^ (w_b & w_c);
ull temp2 = S0 + maj;
w_h = w_g;
w_g = w_f;
w_f = w_e;
w_e = w_d + temp1;
w_d = w_c;
w_c = w_b;
w_b = w_a;
w_a = temp1 + temp2;
}
H[0] += w_a;
H[1] += w_b;
H[2] += w_c;
H[3] += w_d;
H[4] += w_e;
H[5] += w_f;
H[6] += w_g;
H[7] += w_h;
}
int main() {
char message[] = "hello world";
int message_len = strlen(message);// + 1;
ull L, K, MLEN;
L = (ull)message_len * 8;
MLEN = L + 1 + 128;
K = (-MLEN % 1024 + 1024) % 1024;
MLEN += K;
M = (ull *)malloc(MLEN/8);
word_ptr = byte_ptr = bit_ptr = 0;
//append message
for (int i = 0; i < message_len; i++)
append_byte(message[i]);
//append 1-bit and 7 0's
append_byte(0x80);
//append K 0's
for (int i = 0; i < K/8; i++)
append_byte(0);
//append 128-bit length
append_word(0);
append_word(L);
//hashvals are stored in H[]
H = (ull *)malloc(64);
for (int i = 0; i < 8; i++)
H[i] = h[i];
//iterate through all chunks (can be re-implemented in parallel)
//note that MLEN/8 = number of words
for (int i = 0; i < (int)(MLEN/64); i+=16) {
get_hash(M+i, H);
}
for (int j = 0; j < 8; j++) {
unsigned long long x = H[j];
for (int i = 0; i < 64; i+=8) {
printf("%02x", (unsigned int)(((*(((unsigned long long*)&x))) >> (64-8-i)) & 0xFFLLU) );
}
}
printf("\n");
free(M);
free(H);
return 0;
}