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

Properties

Name Value
svn:eol-style native

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