51 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,
52 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
53 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,
54 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
55 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,
56 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
57 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,
58 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
59 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
60 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
61 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
62 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
63 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
64 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
65 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,
66 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
67 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,
68 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
69 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,
70 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
71 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,
72 0xb0, 0x54, 0xbb, 0x16
77 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,
78 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
79 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,
80 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
81 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,
82 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
83 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,
84 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
85 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,
86 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
87 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,
88 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
89 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
90 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
91 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,
92 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
93 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,
94 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
95 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,
96 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
97 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,
98 0x55, 0x21, 0x0c, 0x7d
103 0x00, 0x00, 0x19, 0x01, 0x32, 0x02, 0x1a, 0xc6, 0x4b, 0xc7, 0x1b, 0x68,
104 0x33, 0xee, 0xdf, 0x03, 0x64, 0x04, 0xe0, 0x0e, 0x34, 0x8d, 0x81, 0xef,
105 0x4c, 0x71, 0x08, 0xc8, 0xf8, 0x69, 0x1c, 0xc1, 0x7d, 0xc2, 0x1d, 0xb5,
106 0xf9, 0xb9, 0x27, 0x6a, 0x4d, 0xe4, 0xa6, 0x72, 0x9a, 0xc9, 0x09, 0x78,
107 0x65, 0x2f, 0x8a, 0x05, 0x21, 0x0f, 0xe1, 0x24, 0x12, 0xf0, 0x82, 0x45,
108 0x35, 0x93, 0xda, 0x8e, 0x96, 0x8f, 0xdb, 0xbd, 0x36, 0xd0, 0xce, 0x94,
109 0x13, 0x5c, 0xd2, 0xf1, 0x40, 0x46, 0x83, 0x38, 0x66, 0xdd, 0xfd, 0x30,
110 0xbf, 0x06, 0x8b, 0x62, 0xb3, 0x25, 0xe2, 0x98, 0x22, 0x88, 0x91, 0x10,
111 0x7e, 0x6e, 0x48, 0xc3, 0xa3, 0xb6, 0x1e, 0x42, 0x3a, 0x6b, 0x28, 0x54,
112 0xfa, 0x85, 0x3d, 0xba, 0x2b, 0x79, 0x0a, 0x15, 0x9b, 0x9f, 0x5e, 0xca,
113 0x4e, 0xd4, 0xac, 0xe5, 0xf3, 0x73, 0xa7, 0x57, 0xaf, 0x58, 0xa8, 0x50,
114 0xf4, 0xea, 0xd6, 0x74, 0x4f, 0xae, 0xe9, 0xd5, 0xe7, 0xe6, 0xad, 0xe8,
115 0x2c, 0xd7, 0x75, 0x7a, 0xeb, 0x16, 0x0b, 0xf5, 0x59, 0xcb, 0x5f, 0xb0,
116 0x9c, 0xa9, 0x51, 0xa0, 0x7f, 0x0c, 0xf6, 0x6f, 0x17, 0xc4, 0x49, 0xec,
117 0xd8, 0x43, 0x1f, 0x2d, 0xa4, 0x76, 0x7b, 0xb7, 0xcc, 0xbb, 0x3e, 0x5a,
118 0xfb, 0x60, 0xb1, 0x86, 0x3b, 0x52, 0xa1, 0x6c, 0xaa, 0x55, 0x29, 0x9d,
119 0x97, 0xb2, 0x87, 0x90, 0x61, 0xbe, 0xdc, 0xfc, 0xbc, 0x95, 0xcf, 0xcd,
120 0x37, 0x3f, 0x5b, 0xd1, 0x53, 0x39, 0x84, 0x3c, 0x41, 0xa2, 0x6d, 0x47,
121 0x14, 0x2a, 0x9e, 0x5d, 0x56, 0xf2, 0xd3, 0xab, 0x44, 0x11, 0x92, 0xd9,
122 0x23, 0x20, 0x2e, 0x89, 0xb4, 0x7c, 0xb8, 0x26, 0x77, 0x99, 0xe3, 0xa5,
123 0x67, 0x4a, 0xed, 0xde, 0xc5, 0x31, 0xfe, 0x18, 0x0d, 0x63, 0x8c, 0x80,
124 0xc0, 0xf7, 0x70, 0x07
129 0x01, 0x03, 0x05, 0x0f, 0x11, 0x33, 0x55, 0xff, 0x1a, 0x2e, 0x72, 0x96,
130 0xa1, 0xf8, 0x13, 0x35, 0x5f, 0xe1, 0x38, 0x48, 0xd8, 0x73, 0x95, 0xa4,
131 0xf7, 0x02, 0x06, 0x0a, 0x1e, 0x22, 0x66, 0xaa, 0xe5, 0x34, 0x5c, 0xe4,
132 0x37, 0x59, 0xeb, 0x26, 0x6a, 0xbe, 0xd9, 0x70, 0x90, 0xab, 0xe6, 0x31,
133 0x53, 0xf5, 0x04, 0x0c, 0x14, 0x3c, 0x44, 0xcc, 0x4f, 0xd1, 0x68, 0xb8,
134 0xd3, 0x6e, 0xb2, 0xcd, 0x4c, 0xd4, 0x67, 0xa9, 0xe0, 0x3b, 0x4d, 0xd7,
135 0x62, 0xa6, 0xf1, 0x08, 0x18, 0x28, 0x78, 0x88, 0x83, 0x9e, 0xb9, 0xd0,
136 0x6b, 0xbd, 0xdc, 0x7f, 0x81, 0x98, 0xb3, 0xce, 0x49, 0xdb, 0x76, 0x9a,
137 0xb5, 0xc4, 0x57, 0xf9, 0x10, 0x30, 0x50, 0xf0, 0x0b, 0x1d, 0x27, 0x69,
138 0xbb, 0xd6, 0x61, 0xa3, 0xfe, 0x19, 0x2b, 0x7d, 0x87, 0x92, 0xad, 0xec,
139 0x2f, 0x71, 0x93, 0xae, 0xe9, 0x20, 0x60, 0xa0, 0xfb, 0x16, 0x3a, 0x4e,
140 0xd2, 0x6d, 0xb7, 0xc2, 0x5d, 0xe7, 0x32, 0x56, 0xfa, 0x15, 0x3f, 0x41,
141 0xc3, 0x5e, 0xe2, 0x3d, 0x47, 0xc9, 0x40, 0xc0, 0x5b, 0xed, 0x2c, 0x74,
142 0x9c, 0xbf, 0xda, 0x75, 0x9f, 0xba, 0xd5, 0x64, 0xac, 0xef, 0x2a, 0x7e,
143 0x82, 0x9d, 0xbc, 0xdf, 0x7a, 0x8e, 0x89, 0x80, 0x9b, 0xb6, 0xc1, 0x58,
144 0xe8, 0x23, 0x65, 0xaf, 0xea, 0x25, 0x6f, 0xb1, 0xc8, 0x43, 0xc5, 0x54,
145 0xfc, 0x1f, 0x21, 0x63, 0xa5, 0xf4, 0x07, 0x09, 0x1b, 0x2d, 0x77, 0x99,
146 0xb0, 0xcb, 0x46, 0xca, 0x45, 0xcf, 0x4a, 0xde, 0x79, 0x8b, 0x86, 0x91,
147 0xa8, 0xe3, 0x3e, 0x42, 0xc6, 0x51, 0xf3, 0x0e, 0x12, 0x36, 0x5a, 0xee,
148 0x29, 0x7b, 0x8d, 0x8c, 0x8f, 0x8a, 0x85, 0x94, 0xa7, 0xf2, 0x0d, 0x17,
149 0x39, 0x4b, 0xdd, 0x7c, 0x84, 0x97, 0xa2, 0xfd, 0x1c, 0x24, 0x6c, 0xb4,
150 0xc7, 0x52, 0xf6, 0x01
155 0, 5, 10, 15, 4, 9, 14, 3,
156 8, 13, 2, 7, 12, 1, 6, 11
161 0, 13, 10, 7, 4, 1, 14, 11,
162 8, 5, 2, 15, 12, 9, 6, 3
168 unsigned int log_prod;
170 if ((a ==0)|| (b == 0))
return 0;
175 log_prod = log_prod - 0xff;
183 for (
int i = 0;
i < 16; ++
i) {
191 for (
int i = 0;
i < 16; ++
i) {
199 for (
int i = 0;
i < 16; ++
i) {
207 for (
int i = 0;
i < 16; ++
i) {
216 for (
int i = 0;
i < 16; ++
i) {
217 output[
i] = input[
i] ^ key[
i];
224 for (
int j = 0;
j < 4; ++
j) {
229 uint8_t
t1 = input[row0] ^ input[row1] ^
230 input[row2] ^ input[row3];
232 output[row1] = input[row1] ^ t1 ^
aesFFMul2(input[row1] ^ input[row2]);
233 output[row2] = input[row2] ^ t1 ^
aesFFMul2(input[row2] ^ input[row3]);
234 output[row3] = input[row3] ^ t1 ^
aesFFMul2(input[row3] ^ input[row0]);
235 output[row0] = input[row0] ^ t1 ^
aesFFMul2(input[row0] ^ input[row1]);
242 for (
int j = 0;
j < 4; ++
j) {
243 for (
int i = 0;
i < 4; ++
i) {
244 int index0 = (
j * 4) +
i;
245 int index1 = (
j * 4) + ((
i + 1) % 4);
246 int index2 = (
j * 4) + ((
i + 2) % 4);
247 int index3 = (
j * 4) + ((
i + 3) % 4);
283 uint32_t T0, T1, T2, T3;
284 for (
int i = 0;
i < 4; ++
i) {
285 T0 =
choose(Y[0], Y[1], Y[2]);
287 T2 = Y[3] +
sigma1(Y[0]) + T0 + Z[
i];
289 Y[3] = T2 +
sigma0(X[0]) + T1;
292 Y[3] = Y[2]; Y[2] = Y[1]; Y[1] = Y[0]; Y[0] = X[3];
293 X[3] = X[2]; X[2] = X[1]; X[1] = X[0]; X[0] = T3;
306 for (
int i = 0;
i < 4; ++
i) {
313 Y[0] +=
ror(X[0], 27) + T1 + Z[
i];
317 X[3] = X[2]; X[2] = X[1]; X[1] = X[0]; X[0] = T2;
327 uint32_t
X[4], Y[4], Z[4];
328 load3Reg(&X[0], &Y[0], &Z[0], output, input, input2);
339 uint32_t
X[4], Y[4], Z[4];
340 load3Reg(&X[0], &Y[0], &Z[0], output, input, input2);
351 load2Reg(&X[0], &Y[0], output, input);
353 T[3] = Y[0]; T[2] = X[3]; T[1] = X[2]; T[0] = X[1];
355 T[3] =
ror(T[3], 7) ^
ror(T[3], 18) ^ (T[3] >> 3);
356 T[2] =
ror(T[2], 7) ^
ror(T[2], 18) ^ (T[2] >> 3);
357 T[1] =
ror(T[1], 7) ^
ror(T[1], 18) ^ (T[1] >> 3);
358 T[0] =
ror(T[0], 7) ^
ror(T[0], 18) ^ (T[0] >> 3);
374 uint32_t
X[4], Y[4], Z[4];
375 uint32_t T0[4], T1[4], T2[4], T3[4];
377 load3Reg(&X[0], &Y[0], &Z[0], output, input, input2);
379 T0[3] = Z[0]; T0[2] = Y[3]; T0[1] = Y[2]; T0[0] = Y[1];
380 T1[1] = Z[3]; T1[0] = Z[2];
381 T1[1] =
ror(T1[1], 17) ^
ror(T1[1], 19) ^ (T1[1] >> 10);
382 T1[0] =
ror(T1[0], 17) ^
ror(T1[0], 19) ^ (T1[0] >> 10);
383 T3[1] = X[1] + T0[1]; T3[0] = X[0] + T0[0];
384 T1[1] = T3[1] + T1[1]; T1[0] = T3[0] + T1[0];
385 T2[1] =
ror(T1[1], 17) ^
ror(T1[1], 19) ^ (T1[1] >> 10);
386 T2[0] =
ror(T1[0], 17) ^
ror(T1[0], 19) ^ (T1[0] >> 10);
387 T3[1] = X[3] + T0[3]; T3[0] = X[2] + T0[2];
388 X[3] = T3[1] + T2[1];
389 X[2] = T3[0] + T2[0];
390 X[1] = T1[1]; X[0] = T1[0];
402 uint32_t
X[4], Y[4], Z[4];
403 load3Reg(&X[0], &Y[0], &Z[0], output, input, input2);
404 _sha1Op(&X[0], &Y[0], &Z[0], op);
439 load2Reg(&X[0], &Y[0], output, input);
450 uint32_t
X[4], Y[4], Z[4], T[4];
451 load3Reg(&X[0], &Y[0], &Z[0], output, input, input2);
453 T[3] = Y[1]; T[2] = Y[0]; T[1] = X[3]; T[0] = X[2];
454 X[3] = T[3] ^ X[3] ^ Z[3];
455 X[2] = T[2] ^ X[2] ^ Z[2];
456 X[1] = T[1] ^ X[1] ^ Z[1];
457 X[0] = T[0] ^ X[0] ^ Z[0];
465 uint32_t
X[4], Y[4], T[4];
466 load2Reg(&X[0], &Y[0], output, input);
472 X[2] =
ror(T[2], 31); X[1] =
ror(T[1], 31); X[0] =
ror(T[0], 31);
473 X[3] =
ror(T[3], 31) ^
ror(T[0], 30);
485 for (
int i = 0;
i < 4; ++
i) {
486 X[
i] = *((uint32_t *)&output[
i*4]);
487 Y[
i] = *((uint32_t *)&input[i*4]);
500 for (
int i = 0;
i < 4; ++
i) {
501 X[
i] = *((uint32_t *)&output[
i*4]);
502 Y[
i] = *((uint32_t *)&input[i*4]);
503 Z[
i] = *((uint32_t *)&input2[i*4]);
510 for (
int i = 0;
i < 4; ++
i) {
511 output[
i*4] = (uint8_t)(X[
i]);
512 output[i*4+1] = (uint8_t)(X[i] >> 8);
513 output[i*4+2] = (uint8_t)(X[i] >> 16);
514 output[i*4+3] = (uint8_t)(X[i] >> 24);
void sha1C(uint8_t *output, uint8_t *input, uint8_t *input2)
void aesInvMixColumns(uint8_t *output, uint8_t *input)
static void output(const char *filename)
void aesShiftRows(uint8_t *output, uint8_t *input)
static const uint8_t aesINVSHIFT[16]
void sha1Op(uint8_t *output, uint8_t *input, uint8_t *input2, SHAOp op)
void sha1P(uint8_t *output, uint8_t *input, uint8_t *input2)
void sha256Su1(uint8_t *output, uint8_t *input, uint8_t *input2)
void sha256Op(uint32_t *X, uint32_t *Y, uint32_t *Z)
uint8_t aesFFMul(uint8_t a, uint8_t b)
Finite field multiplication of two elements in the field G(256)
uint32_t sigma0(uint32_t X)
void sha1H(uint8_t *output, uint8_t *input)
uint32_t parity(uint32_t X, uint32_t Y, uint32_t Z)
static const uint8_t aesSBOX[256]
Look up table for subByttes transformation.
void sha1Su0(uint8_t *output, uint8_t *input, uint8_t *input2)
uint32_t ror(uint32_t x, uint8_t shift)
void load3Reg(uint32_t *X, uint32_t *Y, uint32_t *Z, uint8_t *output, uint8_t *input, uint8_t *input2)
uint8_t aesFFMul2(uint8_t a)
void aesDecrypt(uint8_t *output, uint8_t *input, uint8_t *key)
void aesInvSubBytes(uint8_t *output, uint8_t *input)
void sha256Su0(uint8_t *output, uint8_t *input)
static const uint8_t aesFFLOG[256]
Look up table for Finite Field logarithm where the base is the element {03} in the field G(256) ...
uint32_t sigma1(uint32_t X)
void sha1M(uint8_t *output, uint8_t *input, uint8_t *input2)
uint32_t majority(uint32_t X, uint32_t Y, uint32_t Z)
static const uint8_t aesSHIFT[16]
void sha256H(uint8_t *output, uint8_t *input, uint8_t *input2)
static const uint8_t aesFFEXP[256]
Look up table for {03}^X where {03} and X are elements in the filed G(256)
void aesMixColumns(uint8_t *output, uint8_t *input)
void sha256H2(uint8_t *output, uint8_t *input, uint8_t *input2)
static const uint8_t aesInvSBOX[256]
Look up table for inverse subBytes transformation.
uint32_t choose(uint32_t X, uint32_t Y, uint32_t Z)
void aesEncrypt(uint8_t *output, uint8_t *input, uint8_t *key)
void aesInvShiftRows(uint8_t *output, uint8_t *input)
void _sha1Op(uint32_t *X, uint32_t *Y, uint32_t *Z, SHAOp op)
void sha1Su1(uint8_t *output, uint8_t *input)
void load2Reg(uint32_t *X, uint32_t *Y, uint8_t *output, uint8_t *input)
void aesSubBytes(uint8_t *output, uint8_t *input)
void store1Reg(uint8_t *output, uint32_t *X)
void aesAddRoundKey(uint8_t *output, uint8_t *input, uint8_t *key)