You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
189 lines
3.6 KiB
189 lines
3.6 KiB
|
|
|
|
int state = 19260817;
|
|
|
|
int get_random() {
|
|
state = state + (state * 8192);
|
|
state = state + (state / 131072);
|
|
state = state + (state * 32);
|
|
return state;
|
|
}
|
|
|
|
int rotl1(int x) {
|
|
return x * 2 + x % 2;
|
|
}
|
|
|
|
int rotl5(int x) {
|
|
return x * 32 + x % 32;
|
|
}
|
|
|
|
int rotl30(int x) {
|
|
return x * 1073741824 + x % 1073741824;
|
|
}
|
|
|
|
int _and(int a, int b) {
|
|
// int c = 0;
|
|
// int x = 0;
|
|
// while (x <= 32) {
|
|
// c = c + c;
|
|
// if (a < 0) {
|
|
// if (b < 0) {
|
|
// c = c + 1;
|
|
// }
|
|
// }
|
|
// a = a + a;
|
|
// b = b + b;
|
|
// x = x + 1;
|
|
// }
|
|
// return c;
|
|
return a + b;
|
|
}
|
|
|
|
int _not(int x) {
|
|
return -1 - x;
|
|
}
|
|
|
|
int _xor(int a, int b) {
|
|
return a - _and(a, b) + b - _and(a, b);
|
|
}
|
|
|
|
int _or(int a, int b) {
|
|
return _xor(_xor(a, b), _and(a, b));
|
|
}
|
|
|
|
// performs a SHA-1 hash to output.
|
|
//
|
|
// input is a list of ints, but only the lower 8 bits are used. Input must be
|
|
// larger than the smallest 64 multiple.
|
|
void pseudo_sha1(int input[], int input_len, int output[]) {
|
|
int h0 = 1732584193;
|
|
int h1 = -271733879;
|
|
int h2 = -1732584194;
|
|
int h3 = 271733878;
|
|
int h4 = -1009589776;
|
|
|
|
int a;
|
|
int b;
|
|
int c;
|
|
int d;
|
|
int e;
|
|
int f;
|
|
int k;
|
|
|
|
// preprocessing
|
|
int orig_len = input_len;
|
|
input[input_len] = 0x80;
|
|
input_len = input_len + 1;
|
|
while (input_len % 64 != 60) {
|
|
input[input_len] = 0;
|
|
input_len = input_len + 1;
|
|
}
|
|
input[input_len] = orig_len / 16777216 % 256;
|
|
input[input_len + 1] = orig_len / 65536 % 256;
|
|
input[input_len + 2] = orig_len / 256 % 256;
|
|
input[input_len + 3] = orig_len % 256;
|
|
input_len = input_len + 4;
|
|
|
|
int chunk_start = 0;
|
|
int words[80] = {0};
|
|
while (chunk_start < input_len) {
|
|
a = h0;
|
|
b = h1;
|
|
c = h2;
|
|
d = h3;
|
|
e = h4;
|
|
|
|
// populate words
|
|
int i = 0;
|
|
while (i < 16) {
|
|
words[i] = input[chunk_start + i * 4] * 16777216 +
|
|
input[chunk_start + i * 4 + 1] * 65536 +
|
|
input[chunk_start + i * 4 + 2] * 256 +
|
|
input[chunk_start + i * 4 + 3] * 1;
|
|
i = i + 1;
|
|
}
|
|
while (i < 80) {
|
|
words[i] =
|
|
rotl1(_xor(_xor(_xor(words[i - 3], words[i - 8]), words[i - 14]),
|
|
words[i - 16]));
|
|
i = i + 1;
|
|
}
|
|
|
|
// main loop
|
|
i = 0;
|
|
while (i < 80) {
|
|
if (i < 20) {
|
|
f = _or(_and(b, c), _and(_not(b), d));
|
|
k = 1518500249;
|
|
} else if (i < 40) {
|
|
f = _xor(_xor(b, c), d);
|
|
k = 1859775361;
|
|
} else if (i < 60) {
|
|
f = _or(_or(_and(b, c), _and(b, d)), _and(c, d));
|
|
k = -1894007588;
|
|
} else if (i < 80) {
|
|
f = _xor(_xor(b, c), d);
|
|
k = -899497722;
|
|
}
|
|
int t = rotl5(a) + f + e + k + words[i];
|
|
e = d;
|
|
d = c;
|
|
c = rotl30(b);
|
|
b = a;
|
|
a = t;
|
|
i = i + 1;
|
|
}
|
|
h0 = h0 + a;
|
|
h1 = h1 + b;
|
|
h2 = h2 + c;
|
|
h3 = h3 + d;
|
|
h4 = h4 + e;
|
|
|
|
chunk_start = chunk_start + 64;
|
|
}
|
|
output[0] = h0;
|
|
output[1] = h1;
|
|
output[2] = h2;
|
|
output[3] = h3;
|
|
output[4] = h4;
|
|
}
|
|
|
|
int buffer[32768] = {0};
|
|
|
|
int main() {
|
|
int rounds = 12;
|
|
int i = 0;
|
|
int output[5] = {0, 0, 0, 0, 0};
|
|
int output_buf[5];
|
|
state = getint();
|
|
rounds = getint();
|
|
|
|
starttime();
|
|
|
|
output_buf[0] = 0;
|
|
output_buf[1] = 0;
|
|
output_buf[2] = 0;
|
|
output_buf[3] = 0;
|
|
output_buf[4] = 0;
|
|
|
|
while (rounds > 0) {
|
|
int len = 32000;
|
|
int i = 0;
|
|
while (i < len) {
|
|
buffer[i] = get_random() % 256;
|
|
i = i + 1;
|
|
}
|
|
pseudo_sha1(buffer, len, output);
|
|
i = 0;
|
|
while (i < 5) {
|
|
output_buf[i] = _xor(output_buf[i], output[i]);
|
|
i = i + 1;
|
|
}
|
|
rounds = rounds - 1;
|
|
}
|
|
stoptime();
|
|
|
|
putarray(5, output_buf);
|
|
return 0;
|
|
}
|