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

Properties

Name Value
svn:eol-style native

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