Develop and Download Open Source Software

Browse Subversion Repository

Contents of /branches/mty-makai/mty.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 13 - (show annotations) (download) (as text)
Wed Mar 7 12:41:41 2007 UTC (17 years, 1 month ago) by chapuni
Original Path: mty/mty.c
File MIME type: text/x-csrc
File size: 30597 byte(s)
Suseでなぜか ptrdiff_t が定義されていないので、てきとうなヘッダでごまかす。
Visual Studio 8 で、 USE_MMX 時に定義すべき int8_t が欠落していたため追加。
1 /***********************************************************************
2 *
3 * file: mty.cpp
4 *
5 * ‚Ü‚ A‘Ň‚Ä‰ŽB
6 *
7 * $Id$
8 *
9 */
10
11 #define DEBUG 0
12 #define USE_DT 1
13
14 #ifndef DEBUG
15 #define NDEBUG
16 #endif
17
18 #include <assert.h>
19 #include <ctype.h>
20 #include <malloc.h>
21 #include <limits.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <time.h>
26
27 #ifdef __GNUC__
28
29 #include <stdint.h>
30 #define ALIGN_PREFIX(n)
31 #define ALIGN_SUFFIX(n) __attribute__ ((aligned(n)))
32 #ifdef __SSE__
33 typedef unsigned DQWORD_T __attribute__ ((mode(V4SI)));
34 #endif
35
36 #else
37
38 #include <xmmintrin.h>
39 #define ALIGN_PREFIX(n) __declspec(align(16))
40 #define ALIGN_SUFFIX(n)
41
42 /* inttypes.h */
43 typedef __int8 int8_t;
44 typedef __int32 int32_t;
45 typedef unsigned __int32 uint32_t;
46 typedef unsigned __int64 uint64_t;
47
48 typedef __m128 DQWORD_T;
49
50 #endif
51
52 #if defined(WIN32)
53
54 #include <windows.h>
55 #include <sys/timeb.h>
56
57 #elif defined(__GNUC__)
58
59 #include <sys/mman.h>
60 #include <sys/time.h>
61
62 #endif
63
64 #include "crypt64.h"
65 #include "dt4.h"
66
67 #if defined(USE_MMX)
68
69 #define N_STRIDE 6
70 typedef uint64_t WS_T;
71 typedef uint32_t ALU_T;
72
73 #elif defined(USE_64_XMM)
74
75 #define N_STRIDE 7
76 typedef DQWORD_T WS_T;
77 typedef uint64_t ALU_T;
78
79 #else /* XMM */
80
81 #define N_STRIDE 7
82 typedef DQWORD_T WS_T;
83 typedef uint32_t ALU_T;
84
85 #endif
86
87 #define N_I (sizeof(WS_T) / sizeof(uint32_t))
88 #define N_ALU (sizeof(WS_T) / sizeof(ALU_T))
89 #define ALU_BITS (CHAR_BIT * sizeof(ALU_T))
90
91 /* ŒŽ“]’u PC1 */
92 static int const tr_pc1[8][7] =
93 {
94 { 8, 16, 24, 56, 52, 44, 36},
95 { 7, 15, 23, 55, 51, 43, 35},
96 { 6, 14, 22, 54, 50, 42, 34},
97 { 5, 13, 21, 53, 49, 41, 33},
98 { 4, 12, 20, 28, 48, 40, 32},
99 { 3, 11, 19, 27, 47, 39, 31},
100 { 2, 10, 18, 26, 46, 38, 30},
101 { 1, 9, 17, 25, 45, 37, 29},
102 };
103
104 /* LRĹI“]’u */
105 static int const tr_fp[64 + 2] =
106 {
107 39, 7, 47, 15, 55, 23, 63, 31,
108 38, 6, 46, 14, 54, 22, 62, 30,
109 37, 5, 45, 13, 53, 21, 61, 29,
110 36, 4, 44, 12, 52, 20, 60, 28,
111 35, 3, 43, 11, 51, 19, 59, 27,
112 34, 2, 42, 10, 50, 18, 58, 26,
113 33, 1, 41, 9, 49, 17, 57, 25,
114 32, 0, 40, 8, 48, 16, 56, 24,
115 64, 64,
116 };
117
118 /* 1ƒrƒbƒg•Ş */
119 typedef union SLICE
120 {
121 uint32_t i[N_I]; /* 32-bit initializer */
122 ALU_T a[N_ALU]; /* C ‚Ĺˆľ‚˘‚₡‚˘ƒTƒCƒY */
123 WS_T w; /* ƒGƒ“ƒR[ƒh‚Ĺˆľ‚¤ƒTƒCƒY */
124 } SLICE;
125
126 /* crypt64() ‚Ş‹ň‚¤ƒpƒ‰ƒ[ƒ^ */
127 struct PARAM
128 {
129 SLICE lr[2][32];
130 SLICE t[32];
131 SLICE hit[10][64];
132 SLICE hiti[10][26];
133 };
134
135 /* ŒŽ‚ÍLR ‚ƁA‚ť‚ĚƒRƒs[‚Ş•K—v */
136 struct KEY
137 {
138 SLICE k[2][2][28];
139 };
140
141 /* ŠżŽšƒNƒ‰ƒX•\ */
142 unsigned char cp932[0x10000] = {
143 #include "cp932.inc"
144 };
145
146 /* ŒŽ•śŽš—ń */
147 unsigned char key[8 + 8];
148 unsigned char okey[8 + 8];
149
150 /* ŒŽƒNƒ‰ƒX */
151 struct
152 {
153 unsigned cls;
154 unsigned map[256];
155 } kcls[8 + 8];
156
157 #define KCLS_AN 1
158 #define KCLS_KA 2
159 #define KCLS_K1 4
160 #define KCLS_DT0 64
161 #define KCLS_DT1 128
162 #define KCLS_K2 256
163
164 #if USE_DT
165 /* ŒŽƒLƒ—pŽŤ‘ƒCƒ“ƒfƒNƒX */
166 struct DT *kd[8 + 8];
167
168 /* ŽŤ‘ƒCƒ“ƒfƒNƒX */
169 struct DT *dtidx[0x100 + 1];
170 #endif
171
172 /* Žw’肳‚ę‚˝ƒNƒ‰ƒX‚Ć“ü‚Á‚Ä‚˘‚éƒL[‚Š‚çAclassify ‚đs‚¤ */
173 void
174 key_make_map(int n)
175 {
176 int i, j;
177 unsigned c = kcls[n].map[key[n]];
178
179 if (3 <= n && n < 7 && kd[n - 3])
180 {
181 /* ŽŤ‘‚ĚƒPƒc‚Ě•śŽšBŒă‚ë‚Ƀiƒjƒ„ƒ‰ƒLƒƒƒ‰ƒNƒ^‚Ş—ˆ‚é */
182 c = kd[n - 3]->c[0];
183 if ((0x81 <= c && c <= 0x9F)
184 || (0xE0 <= c && c <= 0xFC))
185 c = KCLS_K2;
186 else
187 c = (cp932[256 * key[n]]
188 | cp932[256 * (key[n] ^ 0x80)]);
189 #if DEBUG>=1
190 printf("*n=%d, key=%02X, cls=%04X\n",
191 n,
192 key[n],
193 c);
194 #endif
195 }
196 else if (2 <= n && n < 6 && kd[n - 2])
197 {
198 return;
199 }
200 else if (1 <= n && n < 5 && kd[n - 1])
201 {
202 return;
203 }
204 else if (1 <= n && n < 5 && !kd[n - 1]
205 //&& (c & KCLS_K2)
206 && (c & KCLS_DT1))
207 {
208 /* ŠżŽš2•śŽš‚đE‚Á‚Ä‚˘‚Ť‚܂ */
209 #if DEBUG>=1
210 printf("(%d)%02X %02X(%02X:%02X:%02X:%02X)\n",
211 n, key[n - 1], key[n],
212 cp932[(256 * key[n - 1] + key[n])],
213 cp932[(256 * key[n - 1] + key[n]) ^ 0x0080],
214 cp932[(256 * key[n - 1] + key[n]) ^ 0x8000],
215 cp932[(256 * key[n - 1] + key[n]) ^ 0x8080]);
216 #endif
217 if (n != 1 && n != 2
218 && (cp932[(256 * key[n - 1] + key[n]) ^ 0x0080] & KCLS_DT1))
219 key[n] ^= 0x80;
220 else if (n != 2 && n != 3
221 && (cp932[(256 * key[n - 1] + key[n]) ^ 0x8000] & KCLS_DT1))
222 key[n - 1] ^= 0x80;
223 else if (n > 3 && (cp932[(256 * key[n - 1] + key[n]) ^ 0x8080] & KCLS_DT1))
224 key[n - 1] ^= 0x80, key[n] ^= 0x80;
225 if (cp932[256 * key[n - 1] + key[n]] & KCLS_DT1)
226 {
227 for (kd[n - 1] = dtidx[key[n - 1]];
228 kd[n - 1]->c[1] != key[n];
229 kd[n - 1]++)
230 assert(kd[n - 1]->c[0] == key[n - 1]);
231 #if DEBUG>=1
232 printf("(%02X%02X:%02X%02X)%c%c%c%c\n",
233 kd[n - 1]->c[0],
234 kd[n - 1]->c[1],
235 kd[n - 1]->c[2],
236 kd[n - 1]->c[3],
237 kd[n - 1]->c[0],
238 kd[n - 1]->c[1],
239 kd[n - 1]->c[2],
240 kd[n - 1]->c[3]);
241 #endif
242 return;
243 }
244 }
245 else if (n < 4 && (c & KCLS_DT0) && kd[n] == NULL)
246 {
247 /* ƒJƒ^ƒJƒi–„‚ߍž‚Ý‚˘‚Ť‚Ü‚ˇ */
248 assert(kd[n] == NULL);
249 #if DEBUG>=1
250 printf("n=%d, key=%02X\n", n, key[n]);
251 #endif
252 kd[n] = dtidx[key[n]];
253 if (!kd[n]
254 && !(n == 1 || n == 2)
255 && dtidx[key[n] ^ 0x80])
256 {
257 key[n] ^= 0x80;
258 kd[n] = dtidx[key[n]];
259 }
260 if (kd[n])
261 return;
262 }
263 else
264 {
265 kd[n] = NULL;
266 }
267
268 /* ĹŒă‚Ě•”•Ş‚Í class map ‚đśŹ‚ˇ‚é•K—vƒiƒV */
269 if (n >= 6)
270 return;
271
272 for (i = 0; i < 256; i++)
273 {
274 unsigned bs = 0, bm = 0;
275 #if 1
276 if (c & KCLS_K1)
277 {
278 if (cp932[256 * key[n] + i] & KCLS_K1)
279 bm |= KCLS_K2 | (cp932[256 * key[n] + i] & KCLS_DT1);
280 if (cp932[256 * (key[n] ^ 0x80) + i] & KCLS_K1)
281 bm |= KCLS_K2 | (cp932[256 * (key[n] ^ 0x80) + i] & KCLS_DT1);
282 #if 0
283 bm |= ((cp932[256 * key[n] + i] & KCLS_K1)
284 || (cp932[256 * (key[n] ^ 0x80) + i] & KCLS_K1)
285 ? KCLS_K2 : 0);
286 #endif
287 }
288 if (c & (KCLS_AN | KCLS_KA | KCLS_K2))
289 for (j = 0; j < 256; j++)
290 {
291 bm |= cp932[256 * i + j] & (KCLS_AN | KCLS_KA | KCLS_K1
292 | KCLS_DT0);
293 #if 0
294 if (j >= 127 && !(n == 0 || n == 1))
295 break;
296 #endif
297 }
298 kcls[n + 1].map[i] = bm;
299 #endif
300 if (i >= 128 && !(n == 0 || n == 1))
301 kcls[n + 1].map[i - 128] |= kcls[n + 1].map[i];
302 }
303
304 if (n < 6)
305 kcls[n + 1].map[0x00] = kcls[n + 1].map[0x80] = 0;
306 if (n == 6)
307 kcls[7].map[0x00] |= KCLS_AN;
308 }
309
310 unsigned
311 dt_get(int kdn,
312 int xn,
313 int n,
314 int ch)
315 {
316 int i;
317 #if DEBUG>=1
318 printf("*dt_get(%d)%c%c%c%c(%02X%02X:%02X%02X)->ch=%d",
319 n,
320 kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],
321 kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],
322 ch);
323 #endif
324 /* ‚Ü‚¸‚͐”‚Ś‚é */
325 for (i = 0;
326 kd[kdn][i].c[xn] == kd[kdn]->c[xn];
327 i++)
328 ;
329 assert(i > 0);
330 kd[kdn] += ch % i;
331 #if DEBUG>=1
332 printf("/%d\n dt_get: %c%c%c%c(%02X%02X:%02X%02X)->ch=%d\n",
333 i,
334 kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],
335 kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],
336 ch);
337 #endif
338 return kd[kdn]->c[n];
339 }
340
341 /* ƒ}ƒbƒv‚Š‚ç•śŽš‚đE‚Á‚ăZƒbƒg */
342 unsigned
343 key_set(int n, unsigned ch)
344 {
345 int cnt = 0, i;
346
347 if (3 <= n && n < 7 && kd[n - 3])
348 {
349 return dt_get(n - 3, 2, 3, ch);
350 return kd[n - 3]->c[3];
351 }
352 else if (2 <= n && n < 6 && kd[n - 2])
353 {
354 return dt_get(n - 2, 1, 2, ch);
355 return kd[n - 2]->c[2];
356 }
357 else if (1 <= n && n < 5 && kd[n - 1])
358 {
359 return dt_get(n - 1, 0, 1, ch);
360 return kd[n - 1]->c[1];
361 }
362
363 #if DEBUG>=3
364 if (cnt == 0)
365 {
366 printf("n=%d, ch=%d, (n-1)=%02X\n", n, ch, key[n - 1]);
367 int j;
368 for (i = 0; i < 16; i++)
369 {
370 printf("map[0x%02X] =", 16 * i);
371 for (j = 0; j < 16; j++)
372 printf(" %03X", kcls[n].map[16 * i + j]);
373 printf("\n");
374 }
375 }
376 #endif
377 for (i = 0; i < 256; i++)
378 {
379 if (kcls[n].map[i])
380 {
381 if (ch-- == 0)
382 return i;
383 cnt++;
384 }
385 if (n != 1 && n != 2 && i >= 127)
386 break;
387 }
388 /* ŒŠ‚Â‚Š‚ç‚ȂЂÁ‚˝‚Ě‚Ĺ‚ŕ‚˘‚Á‚Ř‚ń */
389 assert(cnt > 0);
390 ch %= cnt;
391 for (i = 0; i < 256; i++)
392 if (kcls[n].map[i])
393 {
394 if (ch-- == 0)
395 return i;
396 }
397 assert(!"not matched");
398 return 0;
399 }
400
401 /* bitwise key ‚đƒZƒbƒg */
402 static
403 void
404 key_set64(struct KEY *key64,
405 int n,
406 unsigned k,
407 unsigned vk,
408 unsigned sk)
409 {
410 int i, j;
411 if (!((vk | sk) & 0x7F))
412 return;
413
414 for (i = 0; i < 7; i++)
415 {
416 if (n == 7 && i < N_STRIDE) continue;
417 if (sk & (1 << i))
418 {
419 /* ƒZƒbƒg */
420 int o = tr_pc1[n][6 - i] - 1;
421 if (o < 28)
422 {
423 assert(o >= 0);
424 for (j = 0; j < N_ALU; j++)
425 key64->k[0][0][o].a[j]
426 = key64->k[0][1][o].a[j]
427 = -!!(k & (1 << i));
428 }
429 else
430 {
431 assert(o >= 28);
432 assert(o < 56);
433 for (j = 0; j < N_ALU; j++)
434 key64->k[1][0][o - 28].a[j]
435 = key64->k[1][1][o - 28].a[j]
436 = -!!(k & (1 << i));
437 }
438 }
439 else if (vk & (1 << i))
440 {
441 /* ”˝“] */
442 int o = tr_pc1[n][6 - i] - 1;
443 if (o < 28)
444 {
445 assert(o >= 0);
446 for (j = 0; j < N_ALU; j++)
447 key64->k[0][0][o].a[j]
448 = key64->k[0][1][o].a[j]
449 = ~key64->k[0][0][o].a[j];
450 }
451 else
452 {
453 assert(o >= 28);
454 assert(o < 56);
455 for (j = 0; j < N_ALU; j++)
456 key64->k[1][0][o - 28].a[j]
457 = key64->k[1][1][o - 28].a[j]
458 = ~key64->k[1][0][o - 28].a[j];
459 }
460 }
461 }
462 }
463
464 /* Žw’肳‚ę‚˝ƒNƒ‰ƒX‚ĚŠJŽn’l‚ÉƒŠƒZƒbƒg
465 ’ź‘O‚Ě•śŽš‚ĚƒNƒ‰ƒX‚É”›‚ç‚ę‚é */
466 int
467 key_reset(int n)
468 {
469 if (n >= 8)
470 return 1;
471 if (n == 7)
472 {
473 key[7] = 0;
474 return 1;
475 }
476
477 /* 0-2 •śŽš–ڂ̓‰ƒ“ƒ_ƒ€‚ÉŒˆ‚ß‚é
478 3 •śŽš–ÚˆČ~‚͏‰Šú’l‚É */
479 if (n >= 3)
480 key[n] = key_set(n, 0);
481 else
482 key[n] = key_set(n, rand());
483
484 #if DEBUG>=3
485 printf("key[%d]=%02X ncls=%04X\n", n, key[n], kcls[n].map[key[n]]);
486 #endif
487
488 /* ƒZƒbƒg‚ł‚ę‚˝•śŽš‚đŒł‚ÉAŽŸƒLƒƒƒ‰‚Ě•śŽšƒNƒ‰ƒX‚đŒˆ‚ß‚é */
489 key_make_map(n);
490
491 return key_reset(n + 1);
492 }
493
494 /* Žw’肳‚ę‚˝ŒŽ‹óŠÔ‚Ě’†‚ŁAƒL[‚đ‚ЂƂi‚ß‚é
495 ˆŔ‘S‚ɃCƒ“ƒNƒŠƒƒ“ƒg‚Ĺ‚Ť‚˝ę‡ true ‚đ•Ô‚ˇ */
496 static
497 int
498 key_inc(int n)
499 {
500 if (n >= 8)
501 return 0;
502 else if (n == 7)
503 {
504 /* ĹŒă‚ĚƒoƒCƒg */
505 if (N_STRIDE == 7)
506 return 0;
507
508 key[7] = (key[7] + 64) & 127;
509 if (key[7]) return 1;
510 else return 0;
511 }
512 else if (key_inc(n + 1)
513 /*
514 && key_inc(n + 1)
515 && key_inc(n + 1)
516 && key_inc(n + 1)*/
517 )
518 return 1;
519
520 /* Salt ‚̓Cƒ“ƒNƒŠƒƒ“ƒg‚ľ‚Č‚˘–ń‘Ђɂˇ‚é */
521 if (n == 1 || n == 2)
522 return 1;
523
524 #if DEBUG>=3
525 printf("key_inc(n=%d,ck=%02X)\n", n, key[n]);
526 #endif
527
528 /* ŽŤ‘Œę‚̓Cƒ“ƒNƒŠƒƒ“ƒg‚ľ‚Ä‚˘‚˘–ń‘Ђɂˇ‚é */
529 if (3 <= n && n < 7 && kd[n - 3])
530 {
531 if ((key[n - 3] & 0x7F) == ((kd[n - 3] + 1)->c[0] & 0x7F)
532 && (key[n - 2] & 0x7F) == ((kd[n - 3] + 1)->c[1] & 0x7F)
533 && (key[n - 1] & 0x7F) == ((kd[n - 3] + 1)->c[2] & 0x7F))
534 {
535 memcpy(&key[n - 3], &(++kd[n - 3])->c[0], 4);
536 #if DEBUG>=2
537 printf(">dt_get:%c%c%c%c(%02X%02X:%02X%02X)\n",
538 kd[n - 3]->c[0], kd[n - 3]->c[1], kd[n - 3]->c[2], kd[n - 3]->c[3],
539 kd[n - 3]->c[0], kd[n - 3]->c[1], kd[n - 3]->c[2], kd[n - 3]->c[3]);
540 #endif
541 return 1;
542 }
543 else
544 {
545 return 0;
546 }
547 }
548 else if (2 <= n && n < 6 && kd[n - 2])
549 {
550 if ((key[n - 2] & 0x7F) == ((kd[n - 2] + 1)->c[0] & 0x7F)
551 && (key[n - 1] & 0x7F) == ((kd[n - 2] + 1)->c[1] & 0x7F))
552 {
553 memcpy(&key[n - 2], &(++kd[n - 2])->c[0], 4);
554 #if DEBUG>=2
555 printf(">dt_get:%c%c%c%c(%02X%02X:%02X%02X)\n",
556 kd[n - 2]->c[0], kd[n - 2]->c[1], kd[n - 2]->c[2], kd[n - 2]->c[3],
557 kd[n - 2]->c[0], kd[n - 2]->c[1], kd[n - 2]->c[2], kd[n - 2]->c[3]);
558 #endif
559 return 1;
560 }
561 else
562 {
563 return 0;
564 }
565 if (kd[n - 2]->c[0] == key[n - 2])
566 return 1;
567 else
568 return 0;
569 }
570 else if (1 <= n && n < 5 && kd[n - 1])
571 {
572 unsigned c2 = kd[n - 1]->c[0];
573 if ((0x81 <= c2 && c2 <= 0x9F)
574 || (0xE0 <= c2 && c2 <= 0xFC))
575 {
576 kd[n - 1] = NULL;
577 #if 0
578 if (!(n == 1 && n == 2))
579 key[n] &= 0x7F;
580 if (!(n == 2 && n == 3))
581 key[n - 1] &= 0x7F;
582 #endif
583 key_make_map(n - 1);
584 }
585 else if ((key[n - 1] & 0x7F) == ((kd[n - 1] + 1)->c[0] & 0x7F))
586 {
587 memcpy(&key[n - 1], &(++kd[n - 1])->c[0], 4);
588 #if DEBUG>=2
589 printf(">dt_get:%c%c%c%c(%02X%02X:%02X%02X)\n",
590 kd[n - 1]->c[0], kd[n - 1]->c[1], kd[n - 1]->c[2], kd[n - 1]->c[3],
591 kd[n - 1]->c[0], kd[n - 1]->c[1], kd[n - 1]->c[2], kd[n - 1]->c[3]);
592 #endif
593 return 1;
594 }
595 else
596 {
597 return 0;
598 }
599 #if 0
600 if (kd[n - 1]->c[0] == key[n - 1])
601 return 1;
602 else
603 return 0;
604 #endif
605 }
606 else if (n < 4 && kd[n])
607 {
608 if (0 && kd[n]->c[0] == key[n])
609 return 1;
610 kd[n] = NULL;
611 #if 0
612 if (!(n == 1 || n == 2))
613 key[n] &= 0x7F;
614 #endif
615 }
616
617 /* ŽŔŰ‚É‘‚₾‚Ă݂é */
618 assert(n >= 3);
619 for (;;)
620 {
621 if (n <= 3
622 && !(key[n] & 0x80)
623 && kcls[n].map[key[n] ^ 0x80] & (KCLS_DT0))
624 {
625 /* ”źŠpƒJƒ^ƒJƒi‚Ě1ƒoƒCƒg–Ú */
626 key[n] ^= 0x80;
627 }
628 else
629 {
630 key[n] = (key[n] & 0x7F) + 1;
631 if (key[n] >= 0x80)
632 return 0;
633 }
634
635 if (kcls[n].map[key[n]])
636 {
637 key_make_map(n);
638 key_reset(n + 1);
639 return 1;
640 }
641 }
642 while (++key[n] < 0x80)
643 {
644 if (kcls[n].map[key[n]])
645 {
646 key_make_map(n);
647 key_reset(n + 1);
648 return 1;
649 }
650 }
651 return 0;
652 }
653
654 /* ŒŽ‚đŠŽ‘S‚ÉƒŠƒZƒbƒg‚ˇ‚é
655 Salt‚ŕƒZƒbƒg‚ľ’ꂎ */
656 static
657 void
658 key_init()
659 {
660 int i, j;
661
662 #if USE_DT
663 /* ŽŤ‘‚đAƒCƒ“ƒfƒNƒX‚đě‚č‚Č‚Ş‚çƒ}ƒbƒv‚ɂ͂߂ą‚ń‚ŐŔ‚­
664 ŽŤ‘‚̓R[ƒh‡¸‡‚É•Ŕ‚ń‚Ĺ‚é‚ŕ‚̂Ƃˇ‚é */
665 for (i = 0; i < dtcnt; i++)
666 {
667 unsigned c = dt[i].c[0];
668
669 assert(dt[i].c[0]
670 && dt[i].c[1]
671 && dt[i].c[2]
672 && dt[i].c[3]);
673
674 /* BSD ŽI‚Ĺ‚ľ‚É‚ť‚¤‚Č•śŽš‚ÍŽc”O‚Č‚Ş‚çœŠO */
675 assert((dt[i].c[0] & 0x7F)
676 && (dt[i].c[1] & 0x7F)
677 && (dt[i].c[2] & 0x7F)
678 && (dt[i].c[3] & 0x7F));
679
680 /* ƒCƒ“ƒfƒNƒX */
681 if (!dtidx[c])
682 dtidx[c] = &dt[i];
683
684 if ((0x81 <= c && c <= 0x9F)
685 || (0xE0 <= c && c <= 0xFC))
686 {
687 /* ‘SŠp‚Ȃ̂ŁA2ƒoƒCƒg‚Ť‚Ü‚Á‚˝Žž“_‚Ĺ—§‚Ä‚é */
688 cp932[256 * c + dt[i].c[1]] |= KCLS_DT1;
689 }
690 else if (0xA1 <= c && c <= 0xDF)
691 {
692 /* ”źŠpƒJƒi */
693 for (j = 0; j < 256; j++)
694 cp932[256 * c + j] |= KCLS_DT0;
695 }
696 }
697 /* ƒPƒcA‚ż‚¤‚Š”Ôl */
698 dtidx[0x100] = &dt[i];
699 #endif
700
701 key[8] = 0;
702
703 /* ‰Šúƒ}ƒbƒv‚đ‘g‚Ţ */
704 for (i = 0; i < 256; i++)
705 {
706 unsigned bm = 0;
707 kcls[0].map[i] = 0;
708 for (j = 0; j < 256; j++)
709 bm |= cp932[256 * i + j];
710 kcls[0].map[i] = bm & (KCLS_AN | KCLS_KA | KCLS_K1
711 | KCLS_DT0
712 );
713 if (i >= 128)
714 kcls[0].map[i - 128] |= kcls[0].map[i];
715 }
716
717 key_reset(0);
718 }
719
720 /***************************************************************
721 *
722 * ‰ÂŽ‹•śŽš—ń‚ɕϊˇ
723 * n = 0, flag !=0 ‚ĹŒÄ‚Ô‚ą‚Ć
724 *
725 * ptr ‚ĹŽw‚ł‚ę‚é•śŽš—ń‚́A•ĎŠˇ‚ÉŹŒ÷‚ľ‚˝‚珑‚ŤŠˇ‚Ś‚ç‚ę‚é
726 *
727 * ŹŒ÷‚ľ‚˝‚ç flg, ޏ”s‚ľ‚˝‚ç 0 ‚đ•Ô‚ˇB
728 *
729 */
730
731 unsigned
732 translate(unsigned char *ptr,
733 int n,
734 unsigned flag)
735 {
736 int r;
737 unsigned char buf[32];
738 unsigned s0 = (n == 1 || n == 2 ? 0x00 : 0x80);
739 unsigned s1 = (n == 0 || n == 1 ? 0x00 : 0x80);
740 unsigned c0 = ptr[n] << 8;
741 unsigned c1 = ptr[n + 1];
742 unsigned cs0 = c0 ^ (s0 << 8);
743 unsigned cs1 = c1 ^ s1;
744
745 if (n >= 8)
746 return flag;
747
748 if (n == 7)
749 {
750 int i;
751 /* ĹŒă‚Ě1•śŽš */
752 if (!(ptr[7] & 0x7F))
753 return flag;
754
755 for (i = 0x00; i <= 0x7E; i++)
756 {
757 if (cp932[c0 | i] & KCLS_K1)
758 {
759 ptr[8] = i;
760 return flag;
761 }
762 if (cp932[c0 | (0x80 + i)] & KCLS_K1)
763 {
764 ptr[8] = 0x80 + i;
765 return flag;
766 }
767 }
768
769 ptr[7] ^= 0x80; c0 = ptr[7] << 8;
770 for (i = 0x00; i <= 0x7E; i++)
771 {
772 if (cp932[c0 | i] & KCLS_K1)
773 {
774 ptr[8] = i;
775 return flag;
776 }
777 if (cp932[c0 | (0x80 + i)] & KCLS_K1)
778 {
779 ptr[8] = 0x80 + i;
780 return flag;
781 }
782 }
783 ptr[7] ^= 0x80; c0 = ptr[7] << 8;
784 }
785
786 /* K1 */
787 if (cp932[c0 | c1] & KCLS_K1)
788 {
789 r = translate(ptr, n + 2, flag);
790 if (r)
791 return r;
792 }
793 if (s0
794 && cp932[cs0 | c1] & KCLS_K1)
795 {
796 memcpy(buf, ptr, sizeof(buf));
797 buf[n] ^= s0;
798 r = translate(buf, n + 2, flag);
799 if (r)
800 {
801 memcpy(ptr, buf, sizeof(buf));
802 return r;
803 }
804 }
805 if (s1
806 && cp932[c0 | cs1] & KCLS_K1)
807 {
808 memcpy(buf, ptr, sizeof(buf));
809 buf[n + 1] ^= s1;
810 r = translate(buf, n + 2, flag);
811 if (r)
812 {
813 memcpy(ptr, buf, sizeof(buf));
814 return r;
815 }
816 }
817 if (s0 && s1
818 && cp932[cs0 | cs1] & KCLS_K1)
819 {
820 memcpy(buf, ptr, sizeof(buf));
821 buf[n] ^= s0;
822 buf[n + 1] ^= s1;
823 r = translate(buf, n + 2, flag);
824 if (r)
825 {
826 memcpy(ptr, buf, sizeof(buf));
827 return r;
828 }
829 }
830
831 /* AN */
832 if (cp932[c0] & (KCLS_AN | KCLS_KA))
833 {
834 r = translate(ptr, n + 1, flag);
835 if (r)
836 return r;
837 }
838 if (s0 && cp932[cs0] & (KCLS_AN | KCLS_KA))
839 {
840 memcpy(buf, ptr, sizeof(buf));
841 buf[n] ^= s0;
842 r = translate(buf, n + 1, flag);
843 if (r)
844 {
845 memcpy(ptr, buf, sizeof(buf));
846 return r;
847 }
848 }
849
850 /* KA */
851 /* KG */
852 /* KD */
853 /* AD */
854
855 return 0;
856 }
857
858 /***************************************************************
859 *
860 * Salt ‚ĚƒZƒbƒg
861 * ƒIƒyƒ‰ƒ“ƒh‚ĚƒIƒtƒZƒbƒg‚đ‘‚ŤŠˇ‚ڂĉń‚Á‚Ä‚é‚̂ŒˆÓ
862 *
863 */
864
865 #if N_STRIDE == 6
866 #define C(c,i,j,o) (*(int8_t *)((c) + (loo - crypt64_sta) + los[6 * (i) + (j) + (o)]))
867 #elif N_STRIDE == 7
868 #define C(c,i,j,o) (*(int32_t *)((c) + (loo - crypt64_sta) + los[6 * (i) + (j) + (o)]))
869 #endif
870
871 void
872 set_salt(signed char *code,
873 unsigned char const *k)
874 {
875 int i, j;
876
877 for (i = 0; i < 2; i++)
878 {
879 unsigned s = k[1 + i] & 255;
880 if (s > 'z')
881 s = 0;
882 else if (s >= 'a')
883 s = s - 'a' + 2 + 10 + 26;
884 else if (s >= 'A')
885 s = s - 'A' + 2 + 10;
886 else if (s >= '.')
887 s = s - '.';
888 else
889 s = 0;
890
891 #if DEBUG>=1
892 printf("Salt %d:%3o\n", i, s & 63);
893 #endif
894 for (j = 0; j < 6; j++)
895 {
896 #if DEBUG>=2
897 //printf("Salt %d:%d %+3d:%+3d",
898 printf("Salt %d:%d %08lX:%08lX",
899 i, j,
900 C(code, i, j, 0),
901 C(code, i, j, 24));
902 #endif
903 if (s & (1 << j))
904 {
905 C(code, i, j, 0) = sizeof(WS_T) * (((4 * i + j + 15) & 31) - 16);
906 C(code, i, j, 24) = sizeof(WS_T) * (((4 * i + j - 1) & 31) - 16);
907 }
908 else
909 {
910 C(code, i, j, 0) = sizeof(WS_T) * (((4 * i + j - 1) & 31) - 16);
911 C(code, i, j, 24) = sizeof(WS_T) * (((4 * i + j + 15) & 31) - 16);
912 }
913 C(code, i, j, 12) = sizeof(WS_T) * (((4 * i + j + 7) & 31) - 16);
914 C(code, i, j, 36) = sizeof(WS_T) * (((4 * i + j + 23) & 31) - 16);
915 #if DEBUG>=2
916 //printf(" => %+3d:%+3d\n",
917 printf(" => %08lX:%08lX\n",
918 C(code, i, j, 0),
919 C(code, i, j, 24));
920 #endif
921 }
922 }
923 }
924
925 /***************************************************************
926 *
927 * ƒIƒyƒR[ƒh‚đ“WŠJ
928 *
929 * op
930 * 0x6F MOVQ
931 * 0x7F STORE
932 * 0xDB PAND
933 * 0xDF PANDN
934 * 0xEB POR
935 * 0xEF PXOR
936 *
937 * r EAX, ECX, EDX, EBX
938 * ESP, EBP, ESI, EDI
939 *
940 */
941
942 static
943 signed char *
944 reg_op(signed char *pc,
945 unsigned op,
946 unsigned d,
947 unsigned s)
948 {
949 #ifndef USE_MMX
950 *pc++ = 0x66;
951 #endif
952 pc[0] = 0x0F;
953 pc[1] = op;
954 /* 11 ddd sss */
955 pc[2] = (0300
956 | ((d << 3) & 0070)
957 | (s & 0007));
958 return pc + 3;
959 }
960
961 static
962 signed char *
963 reg_mem(signed char *pc,
964 unsigned op,
965 unsigned d,
966 unsigned s,
967 int ofs)
968 {
969 #ifndef USE_MMX
970 *pc++ = 0x66;
971 #endif
972 pc[0] = 0x0F;
973 pc[1] = op;
974 if (-128 <= ofs && ofs <= 127)
975 {
976 /* short ofs
977 01 ddd sss [ofs.b] */
978 pc[2] = (0100
979 | ((d << 3) & 0070)
980 | (s & 0007));
981 pc[3] = ofs;
982 return pc + 4;
983 }
984 else
985 {
986 /* long ofs
987 10 ddd sss [ofs.l] */
988 pc[2] = (0200
989 | ((d << 3) & 0070)
990 | (s & 0007));
991 *(long *)&pc[3] = ofs;
992 return pc + 7;
993 }
994 }
995
996 /***************************************************************
997 *
998 * —^‚Ś‚ç‚ę‚˝ŽŽ‚đ‰đÍE–˝—ߐśŹ
999 *
1000 * ^ ć“ŞŒĹ’č
1001 * $ ––”öŒĹ’č
1002 * ? ”CˆÓ‚Ě1•śŽš
1003 * * ”CˆÓ‚Ě0•śŽšˆČă
1004 * & ‘召‹ć•ĘƒiƒVAƒOƒ‹[ƒv‚ÉŽg‚í‚ę‚˝ę‡Acapitalize
1005 * () ƒOƒ‹[ƒv‰ť
1006 * \s or
1007 * \1 ˆę’v‚ľ‚˝ƒOƒ‹[ƒv(ŽŔ‘Ě)
1008 * $(fn) ƒeƒLƒXƒg‚đ“WŠJ(ƒOƒ‹[ƒv‚̓Nƒ‰ƒX‚Ć‚ľ‚Ĉľ‚í‚ę‚é)
1009 *
1010 * ˆČ‰şAƒNƒ‰ƒX“WŠJ‚Ěƒƒ^ƒLƒƒƒ‰
1011 * [A-Z] •śŽšƒNƒ‰ƒX’č‹` ^ ‚Í”r‘ź
1012 * {} 0•śŽšˆČă
1013 * {n} n•śŽš
1014 * {n,} n•śŽšˆČă
1015 * {,n} n•śŽšˆČ‰ş
1016 * {m,n} m-n•śŽš
1017 *
1018 */
1019
1020 static
1021 int
1022 cv64(int c)
1023 {
1024 if ('.' <= c && c <= '/')
1025 return c - '.';
1026 else if ('0' <= c && c <= '9')
1027 return c - '0' + 2;
1028 else if ('A' <= c && c <= 'Z')
1029 return c - 'A' + 2 + 10;
1030 else if ('a' <= c && c <= 'z')
1031 return c - 'a' + 2 + 10 + 26;
1032 else
1033 return -1;
1034 }
1035
1036 static
1037 int
1038 expr_make(signed char *iptr,
1039 int ofs,
1040 char const *expr,
1041 int len)
1042 {
1043 /* ć“ސ§–ń */
1044 signed char *o_iptr = iptr;
1045 unsigned op = 0x6F;
1046 int i;
1047
1048 if (expr[0] == '^')
1049 {
1050 if (len == 0 || ofs > 0)
1051 return -1;
1052 expr++;
1053 len--;
1054 }
1055
1056 /* ˆę•śŽš‚“WŠJ */
1057 for (i = 0; i < len; i++)
1058 {
1059 int c = expr[i];
1060
1061 if (c == '$')
1062 {
1063 assert(op != 0x6F);
1064 if (ofs < 10)
1065 return 0;
1066 else if (ofs > 10)
1067 return -1;
1068 return iptr - o_iptr;
1069 }
1070
1071 if (ofs >= 10)
1072 return -1;
1073
1074 if (c == '[')
1075 {
1076 /* ƒNƒ‰ƒX‚đ‚܂Ƃ߂é */
1077 unsigned oop; /* MOVQ */
1078 int j;
1079 int cs[64];
1080 memset(cs, 0, 64 * sizeof(int));
1081 for (i++; c = expr[i], c != ']'; i++)
1082 {
1083 c = cv64(c);
1084 if (c < 0)
1085 return -1;
1086 if (expr[i + 1] == '-')
1087 {
1088 int ce = cv64(expr[i + 2]);
1089 if (ce < 0)
1090 return -1;
1091 while (c <= ce)
1092 cs[c++]++;
1093 i += 2;
1094 }
1095 else
1096 cs[c]++;
1097 }
1098 assert(c == ']');
1099
1100 /* ƒ}ƒbƒv‚ł‚ę‚˝ƒ‚ƒm‚Š‚ç–˝—ß‚đśŹ‚ˇ‚é */
1101 oop = 0x6F; /* MOVQ */
1102 for (j = 0; j < 64; j++)
1103 if (cs[j])
1104 {
1105 if (ofs == 9 && (j & 3))
1106 continue;
1107 iptr = reg_mem(iptr,
1108 oop,
1109 1, /* MM1 */
1110 5, /* EBP */
1111 sizeof(WS_T) * ((64 * ofs + j) + 32 - 16));
1112 oop = 0xEB;
1113 }
1114 if (oop != 0xEB)
1115 {
1116 if (ofs == 9)
1117 return -1;
1118 }
1119 else
1120 {
1121 iptr = reg_op(iptr,
1122 op,
1123 0, /* MM0 */
1124 1); /* MM1 */
1125 op = 0xDB;
1126 }
1127 ofs++;
1128 }
1129 else if (c == '?')
1130 {
1131 ofs++;
1132 }
1133 else if ((c = cv64(c)) >= 0)
1134 {
1135 if (ofs == 9 && (c & 3))
1136 return -1;
1137 iptr = reg_mem(iptr,
1138 op,
1139 0, /* MM0 */
1140 5, /* EBP */
1141 sizeof(WS_T) * ((64 * ofs + c) + 32 - 16));
1142 op = 0xDB;
1143 ofs++;
1144 }
1145 else
1146 return -1;
1147 }
1148
1149 return iptr - o_iptr;
1150 }
1151 /*
1152 Fighters ^FIGHTERS ^BayStars ^Red[Ss]tar/ ^REDSTAR/ ^Parsifal ^VALKYRIE ^Valkyrie
1153 ^Dr.Death ^IamCHONO ^RAGNAROK ^MARAOH.. ^MARAOH// ......... God[Ff]ather GODFATHER
1154 ^maraGULO[./] BLACKJACK ^[Bb]lackjack ^BlackJack [Pp]atagonia PATAGONIA ^JC.PENNEY
1155 ^JC.Penney ^syombolic ROCKNROLL stammerB4U Ms.Erie.W. MARA.w/w/w R3[0-4]SKYLINE
1156 100000[Gg]et. 100000GET.
1157 */
1158 signed char *
1159 expr_parse(signed char *iptr,
1160 int codesiz_limit,
1161 char const *expr)
1162 {
1163 char expr_buf[65536 + 1];
1164 FILE *fp;
1165 size_t sz;
1166
1167 /* ƒtƒ@ƒCƒ‹‚đ“ǂݍž‚Ţ
1168 ‚ą‚̔łł͎蔲‚Ť‚Ĺ 64K §ŒŔ */
1169 #define TARGET_SIZ 65536
1170 fp = fopen("target.txt", "rb");
1171 memset(expr_buf, 0, TARGET_SIZ + 1);
1172 sz = fread(expr_buf, sizeof(char), TARGET_SIZ, fp);
1173 fclose(fp);
1174
1175 /* XXX ƒ^[ƒQƒbƒg‚ĚƒTƒCƒY‚đƒ`ƒFƒbƒN */
1176 if (sz == TARGET_SIZ)
1177 {
1178 /* ƒg[ƒNƒ“‚Ěƒgƒ‰ƒo[ƒX */
1179 char *ds, *pe, *ps;
1180 for (ds = &expr_buf[TARGET_SIZ - 1];
1181 !isspace(*ds);
1182 ds--)
1183 assert(ds >= expr_buf);
1184 for (pe = ds++; isspace(*pe); pe--)
1185 assert(pe >= expr_buf);
1186 for (ps = pe++; !isspace(*ps); ps--)
1187 assert(ps >= expr_buf);
1188 fprintf(stderr, "WARNING: <");
1189 ps++;
1190 while (ps < pe)
1191 fputc(*ps++, stderr);
1192 fprintf(stderr, ">‚ć‚čŒă‚ë‚Ěƒ^[ƒQƒbƒg<%s(ry>‚̓I‡hƒ‹\n",
1193 ds);
1194 *pe = 0;
1195 }
1196
1197 /* PXOR MM7,MM7 */
1198 iptr = reg_op(iptr, 0xEF, 7, 7);
1199
1200 /* ‡ŒJ‚č‚É parse */
1201 expr = expr_buf;
1202 while (expr[0])
1203 {
1204 char const *p;
1205 int i;
1206
1207 /* “Ş‚Ě Whitespace ‚đ“ǂݔň‚΂ˇ */
1208 while (isspace(expr[0]))
1209 expr++;
1210
1211 if (!expr[0])
1212 break;
1213
1214 /* ƒg[ƒNƒ“‚đŘ‚čo‚ˇ */
1215 for (p = expr; expr[0] && !isspace(expr[0]); expr++)
1216 ;
1217
1218 /* “WŠJ‚ˇ‚é */
1219 for (i = 0; i < 10; i++)
1220 {
1221 int n = expr_make(iptr, i, p, expr - p);
1222 if (n < 0)
1223 break;
1224 #if DEBUG>=1
1225 if (n > 0)
1226 {
1227 int j;
1228 for (j = 0; &p[j] < expr; j++)
1229 putchar(p[j]);
1230 printf(": of=%d len=%d\n", i, expr - p);
1231 }
1232 #endif
1233 if (n > 0)
1234 iptr = reg_op(iptr + n,
1235 0xEB,
1236 7,
1237 0);
1238 }
1239 }
1240
1241 return reg_mem(iptr,
1242 0x7F,
1243 7,
1244 5,
1245 sizeof(WS_T) * (31 - 16));
1246 }
1247
1248 static
1249 unsigned
1250 usec()
1251 {
1252 #if !defined(WIN32)
1253 struct timeval tv;
1254 gettimeofday(&tv, NULL);
1255 return 100 * tv.tv_sec + (tv.tv_usec / 10000);
1256 #else
1257 struct timeb tm;
1258 ftime(&tm);
1259 return 100 * tm.time + tm.millitm / 10;
1260 #endif
1261 }
1262
1263 /***************************************************************
1264 *
1265 * ƒƒCƒ“ƒ‹[ƒv‚Ć‚Š
1266 *
1267 */
1268
1269 /* ’萔€ */
1270 #if N_STRIDE == 7
1271 static SLICE const sk6[N_STRIDE] =
1272 {
1273 {0xAAAAAAAAUL, 0xAAAAAAAAUL, 0xAAAAAAAAUL, 0xAAAAAAAAUL},
1274 {0xCCCCCCCCUL, 0xCCCCCCCCUL, 0xCCCCCCCCUL, 0xCCCCCCCCUL},
1275 {0xF0F0F0F0UL, 0xF0F0F0F0UL, 0xF0F0F0F0UL, 0xF0F0F0F0UL},
1276 {0xFF00FF00UL, 0xFF00FF00UL, 0xFF00FF00UL, 0xFF00FF00UL},
1277 {0xFFFF0000UL, 0xFFFF0000UL, 0xFFFF0000UL, 0xFFFF0000UL},
1278 {0x00000000UL, 0xFFFFFFFFUL, 0x00000000UL, 0xFFFFFFFFUL},
1279 {0x00000000UL, 0x00000000UL, 0xFFFFFFFFUL, 0xFFFFFFFFUL},
1280 };
1281 #elif N_STRIDE == 6
1282 static SLICE const sk6[N_STRIDE] =
1283 {
1284 {0xAAAAAAAAUL, 0xAAAAAAAAUL},
1285 {0xCCCCCCCCUL, 0xCCCCCCCCUL},
1286 {0xF0F0F0F0UL, 0xF0F0F0F0UL},
1287 {0xFF00FF00UL, 0xFF00FF00UL},
1288 {0xFFFF0000UL, 0xFFFF0000UL},
1289 {0x00000000UL, 0xFFFFFFFFUL},
1290 };
1291 #endif
1292
1293 #ifdef WIN32
1294 typedef int (__fastcall *CRYPT64_PP)(ALU_T const *k, ALU_T *lr);
1295 #endif
1296
1297 ALIGN_PREFIX(16) struct KEY key64 ALIGN_SUFFIX(16);
1298 ALIGN_PREFIX(16) struct PARAM param64 ALIGN_SUFFIX(16);
1299
1300 int
1301 main(int argc, char *argv[])
1302 {
1303 int i, j;
1304 int mincnt;
1305 signed char *code = NULL;
1306 FILE *ofp;
1307 int n_iter;
1308 int cr;
1309
1310 #define N_TS 4
1311 struct
1312 {
1313 unsigned t;
1314 int c;
1315 } ts[N_TS];
1316
1317 #ifdef WIN32
1318 HANDLE h;
1319 #endif
1320
1321 #ifndef __GNUC__
1322 CRYPT64_PP d_crypt64;
1323 #endif
1324
1325 #if 0
1326 if (argc < 2)
1327 {
1328 fprintf(stderr, "ŽŽ‚Ť‚Ú‚ń‚Ę\n");
1329 return 1;
1330 }
1331 #endif
1332
1333 assert((1 << N_STRIDE) == N_ALU * ALU_BITS);
1334
1335 /* t[16] ‚́A“ŕ•”‰‰ŽZ‚ĹŽg—p‚ˇ‚éAall 1 ‚Ş“ü‚Á‚Ä‚˘‚é */
1336 for (i = 0; i < N_ALU; i++)
1337 param64.t[16].a[i] = -1;
1338
1339 /* ŒĹ’čƒL[‚ĚƒRƒs[ */
1340 for (i = 0; i < N_STRIDE; i++)
1341 {
1342 int o = tr_pc1[7][6 - i] - 1;
1343 if (o < 28)
1344 {
1345 key64.k[0][0][o] = key64.k[0][1][o] = sk6[i];
1346 }
1347 else
1348 {
1349 o -= 28;
1350 key64.k[1][0][o] = key64.k[1][1][o] = sk6[i];
1351 }
1352 }
1353
1354 /* Salt‚đ‰Á–Ą‚ľ‚Č‚˘ę‡‚́AƒR[ƒh—Ěˆć‚đ
1355 writable —Ěˆć‚É“WŠJ‚ľ‚Č‚­‚Ä‚ŕ‚悢B
1356 [XXX] OS‚É‚ć‚Á‚ẮA‘ž&ŽŔs‰Â”\—Ěˆć‚đę—p‚ĚƒT[ƒ”ƒBƒX‚Ĺ
1357 Žć“ž‚ľ‚Ȃ݂ę‚΂Ȃç‚Č‚˘‚ŕ‚Ě‚ŕ‚ ‚邊‚ŕ‚ľ‚ę‚Č‚˘‚̂ŁA’ˆÓ */
1358 #ifdef WIN32
1359 h = CreateFileMapping(INVALID_HANDLE_VALUE,
1360 NULL,
1361 PAGE_EXECUTE_READWRITE,
1362 0, 0x20000000,
1363 NULL);
1364 #ifndef FILE_MAP_EXECUTE
1365 #define FILE_MAP_EXECUTE SECTION_MAP_EXECUTE /* XXX cygwin */
1366 #endif
1367 if (SUCCEEDED(h))
1368 code = (signed char *)MapViewOfFile(h,
1369 FILE_MAP_EXECUTE | FILE_MAP_WRITE,
1370 0, 0x10000000,
1371 0);
1372 #else
1373 code = (signed char *)mmap(NULL,
1374 0x10000000,
1375 PROT_EXEC | PROT_READ | PROT_WRITE,
1376 MAP_PRIVATE | MAP_ANONYMOUS,
1377 1, /* fd */
1378 0);
1379 if ((void *)code == MAP_FAILED)
1380 code =NULL;
1381 #endif
1382
1383 /* ƒƒ‚ƒŠ‚ŞŠm•ۂłŤ‚Ä‚˘‚Č‚˘ę‡‚Ě‚˘‚ń‚ż‚Ť‘΍ô */
1384 if (code == NULL)
1385 code = (signed char *)malloc(crypt64_end - crypt64_sta + 1024 * 1024);
1386 assert(code != NULL);
1387
1388 /* Prologue ‚đ“WŠJ */
1389 memcpy(code, crypt64_sta, crypt64_end - crypt64_sta);
1390 #ifndef __GNUC__
1391 d_crypt64 = (CRYPT64_PP)code;
1392 #endif
1393 memcpy(expr_parse(code + (crypt64_end - crypt64_sta),
1394 1024 * 1024 - (crypt64_ep_end - crypt64_ep),
1395 argv[1]),
1396 crypt64_ep,
1397 crypt64_ep_end - crypt64_ep);
1398
1399 /* ƒL[‚̏‰Šú‰ť */
1400 srand(time(NULL));
1401 key_init();
1402 set_salt(code, key);
1403 for (i = 0; i < 8; i++)
1404 key_set64(&key64, i, okey[i] = key[i], 0, 0x7F);
1405
1406 #if DEBUG>=1
1407 printf("key=%p param=%p\n", &key64, &param64);
1408 #endif
1409 assert(!((ptrdiff_t)&key64 & (sizeof(WS_T) - 1)));
1410 assert(!((ptrdiff_t)&param64 & (sizeof(WS_T) - 1)));
1411
1412 if ((ofp = fopen("log.txt", "at")) != NULL)
1413 setvbuf(ofp, NULL, _IOLBF, BUFSIZ);
1414
1415 for (i = 0; i < N_TS; i++)
1416 ts[i].t = ts[i].c = 0;
1417
1418 mincnt = 0x7FFFFFFF;
1419 n_iter = 0;
1420 cr = 0;
1421 /* ’Tőƒ‹[ƒv‚ž‚ź‚Á‚Ć */
1422 for (;;)
1423 {
1424 int32_t cnt;
1425 int k, kk;
1426
1427 /* ŒŽ‚ĚƒZƒbƒg */
1428 for (i = 0; i < 8; i++)
1429 {
1430 key_set64(&key64, i, key[i], key[i] ^ okey[i], 0);
1431 okey[i] = key[i];
1432 }
1433
1434 /* ‚Ü‚¸‚Í LR ‚đ‰Šú‰ť */
1435 //memset(param64.lr, 0, sizeof(param64.lr));
1436 /* ŒÄ‚Ô! */
1437 #ifdef __GNUC__
1438 asm volatile("call *%3"
1439 : "=a"(cnt)
1440 : "c"(key64.k), "d"(param64.lr), "m"(code)
1441 //: "c"(key64.k), "d"(param64.lr), "m"(crypt64_sta)
1442 : "memory");
1443 #else
1444 cnt = (*d_crypt64)(key64.k[0][0][0].a, param64.lr[0][0].a);
1445 #endif
1446 if (mincnt > cnt && cnt > 0)
1447 {
1448 mincnt = cnt;
1449 if (cr)
1450 fprintf(stderr, "\n");
1451 cr = 0;
1452 fprintf(stderr, "cycle=%d\n", (int)cnt);
1453 }
1454 /* XXX Žč”˛‚Ť‚Ě‚˝‚߁Aƒ[ƒN‚ɂ͂ݏo‚Ä‚˘‚é2ƒrƒbƒg‚𗎂Ƃˇ */
1455 for (i = 0; i < N_ALU; i++)
1456 param64.t[0].a[i] = param64.t[1].a[i] = 0;
1457
1458 /* ƒqƒbƒg‚ľ‚˝‚Ć‚Ť‚̏ˆ— */
1459 for (kk = 0; kk < N_ALU; kk++)
1460 {
1461 ALU_T t;
1462
1463 t = param64.t[31].a[kk];
1464 if (!t)
1465 continue;
1466
1467 for (k = 0; k < ALU_BITS; k++)
1468 {
1469 char hash[16];
1470 unsigned char buf[32];
1471
1472 if (!(t & ((ALU_T)1 << k)))
1473 continue;
1474
1475 for (i = 1; i < 11; i++)
1476 {
1477 unsigned c = 0;
1478 for (j = 0; j < 6; j++)
1479 c = (c << 1) | !!(param64.lr[0][tr_fp[6 * i + j]].a[kk] & ((ALU_T)1 << k));
1480 hash[i - 1] = c["./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"];
1481 }
1482 hash[10] = 0;
1483
1484 memcpy(buf, key, 32);
1485 buf[8] = buf[9] = 0;
1486 buf[7] = (buf[7] & -(1 << N_STRIDE) & 0x7F) + ALU_BITS * kk + k;
1487 if (translate(buf, 0, 1))
1488 {
1489 if (cr)
1490 fprintf(stderr, "\n");
1491 cr = 0;
1492 printf("Ÿ%s #%-10.10s(%02X %02X %02X %02X %02X %02X %02X %02X/%02X)\n",
1493 hash,
1494 buf,
1495 buf[0], buf[1], buf[2], buf[3],
1496 buf[4], buf[5], buf[6], buf[7],
1497 buf[8]);
1498 if (ofp)
1499 fprintf(ofp,
1500 "Ÿ%s #%-10.10s(%02X %02X %02X %02X %02X %02X %02X %02X/%02X)\n",
1501 hash,
1502 buf,
1503 buf[0], buf[1], buf[2], buf[3],
1504 buf[4], buf[5], buf[6], buf[7],
1505 buf[8]);
1506 }
1507 else
1508 {
1509 #if DEBUG>=1
1510 if (cr)
1511 fprintf(stderr, "\n");
1512 cr = 0;
1513 printf("Ÿ%s (%02X %02X %02X %02X %02X %02X %02X %02X )\n",
1514 hash,
1515 buf[0], buf[1], buf[2], buf[3],
1516 buf[4], buf[5], buf[6], buf[7]);
1517 if (ofp)
1518 fprintf(ofp,
1519 "Ÿ%s (%02X %02X %02X %02X %02X %02X %02X %02X )\n",
1520 hash,
1521 buf[0], buf[1], buf[2], buf[3],
1522 buf[4], buf[5], buf[6], buf[7]);
1523 #endif
1524 }
1525 }
1526 }
1527
1528 if (++n_iter - ts[0].c >= 8192)
1529 {
1530 int t = usec();
1531 if (ts[N_TS - 1].c)
1532 {
1533 int a = (100 << N_STRIDE) * (n_iter - ts[N_TS - 1].c) / (t - ts[N_TS - 1].t);
1534 fprintf(stderr,
1535 "%8d.%03d(ktrips/sec)\r",
1536 a / 1000,
1537 a % 1000);
1538 cr++;
1539 }
1540 for (i = N_TS - 1; i >= 1; i--)
1541 ts[i] = ts[i - 1];
1542 ts[0].c = n_iter;
1543 ts[0].t = t;
1544 for (i = 1; i < N_TS; i++)
1545 if (ts[i].c)
1546 break;
1547 else
1548 ts[i] = ts[i - 1];
1549 }
1550 #if 1
1551 if (!key_inc(3))
1552 {
1553 #if DEBUG>=2
1554 printf("********************************\n");
1555 #endif
1556 key_reset(0);
1557 set_salt(code, key);
1558 for (i = 0; i < 8; i++)
1559 key_set64(&key64, i, okey[i] = key[i], 0, 0x7F);
1560 }
1561 #endif
1562 }
1563
1564 return 0;
1565 }
1566
1567 /*
1568 * Local Variables:
1569 * tab-width: 4
1570 * End:
1571 *
1572 * EOF */

Properties

Name Value
svn:eol-style native

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26