-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathknot2.c
103 lines (79 loc) · 1.88 KB
/
knot2.c
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
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#define ROUNDS 64
#define SIZE 256
int elem[SIZE];
#define EXTRA_LENGHTS 5
const int extra[EXTRA_LENGHTS] = { 17, 31, 73, 47, 23 };
void fill_array(void) {
for(int i = 0; i < SIZE; ++i) elem[i] = i;
}
void visualise(const int startPos, const int length) {
const int endPos = (startPos + length-1) % SIZE;
for(int i = 0; i < SIZE; ++i) {
if(i == startPos)
printf("([%d] ", elem[i]);
else if(i == endPos)
printf("%d) ", elem[i]);
else
printf("%d ", elem[i]);
}
printf("\n");
}
void reverse(const int startPos, const int length) {
const int endPos = (startPos + length - 1) % SIZE;
for(int i = 0; i < length/2; ++i) {
int a_p = (startPos+i) % SIZE;
int b_p = (endPos-i);
if(b_p < 0) b_p += SIZE;
int a_v = elem[a_p];
int b_v = elem[b_p];
elem[a_p] = b_v;
elem[b_p] = a_v;
}
}
void print_hash(void) {
for(int group = 0; group < 16; ++group) {
uint8_t hash = 0;
for(int member = 0; member < 16; ++member) {
hash ^= elem[group*16 + member];
}
printf("%02x", hash);
}
putc('\n', stdout);
}
int main(void) {
fill_array();
char buffer[128];
int buflen;
if(fgets(buffer, sizeof(buffer), stdin) == NULL) {
buffer[0] = '\0';
buflen = 0;
} else {
buflen = strlen(buffer);
if(buffer[buflen-1] == '\n') buffer[--buflen] = '\0';
}
printf("buffer: \"%s\" (%d)\n", buffer, buflen);
int pos = 0;
int skip = 0;
for(int round = 0; round < ROUNDS; ++round) {
for(int b = 0; b < buflen; ++b) {
int length = buffer[b];
// visualise(pos, length);
reverse(pos, length);
pos = (pos + length + skip) % SIZE;
skip += 1;
}
for(int e = 0; e < EXTRA_LENGHTS; ++e) {
int length = extra[e];
// visualise(pos, length);
reverse(pos, length);
pos = (pos + length + skip) % SIZE;
skip += 1;
}
}
print_hash();
return 0;
}