Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 21 - (hide 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 chapuni 1 /***********************************************************************
2     *
3     * file: mty.cpp
4     *
5 chapuni 2 * ‚Ü‚ A‘Ň‚Ä‰ŽB
6 chapuni 1 *
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 chapuni 13 #include <malloc.h>
21 chapuni 9 #include <limits.h>
22 chapuni 20 #include <stddef.h>
23 chapuni 1 #include <stdio.h>
24     #include <stdlib.h>
25     #include <string.h>
26     #include <time.h>
27 chapuni 10
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 chapuni 13 typedef __int8 int8_t;
45 chapuni 10 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 chapuni 1 #include "crypt64.h"
66     #include "dt4.h"
67    
68 chapuni 9 #if defined(USE_MMX)
69 chapuni 6
70     #define N_STRIDE 6
71     typedef uint64_t WS_T;
72     typedef uint32_t ALU_T;
73    
74 chapuni 15 #define CRYPT64_CLOBBER /* "%ecx", "%edx", */
75    
76 chapuni 14 #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 chapuni 20 #define CRYPT64_CLOBBER /* "%rcx", "%rdx",*/ "%r8", "%r9",
83    
84 chapuni 9 #elif defined(USE_64_XMM)
85 chapuni 6
86     #define N_STRIDE 7
87 chapuni 10 typedef DQWORD_T WS_T;
88 chapuni 9 typedef uint64_t ALU_T;
89    
90 chapuni 15 #define CRYPT64_CLOBBER /* "%rcx", "%rdx",*/
91    
92 chapuni 9 #else /* XMM */
93    
94     #define N_STRIDE 7
95 chapuni 10 typedef DQWORD_T WS_T;
96 chapuni 6 typedef uint32_t ALU_T;
97    
98 chapuni 15 #define CRYPT64_CLOBBER /* "%ecx", "%edx", */
99    
100 chapuni 6 #endif
101    
102 chapuni 9 #define N_I (sizeof(WS_T) / sizeof(uint32_t))
103 chapuni 6 #define N_ALU (sizeof(WS_T) / sizeof(ALU_T))
104 chapuni 9 #define ALU_BITS (CHAR_BIT * sizeof(ALU_T))
105 chapuni 6
106 chapuni 1 /* ŒŽ“]’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 chapuni 15 /* ŒŽƒ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 chapuni 1 /* 1ƒrƒbƒg•Ş */
147 chapuni 6 typedef union SLICE
148 chapuni 1 {
149 chapuni 9 uint32_t i[N_I]; /* 32-bit initializer */
150 chapuni 6 ALU_T a[N_ALU]; /* C ‚Ĺˆľ‚˘‚₡‚˘ƒTƒCƒY */
151     WS_T w; /* ƒGƒ“ƒR[ƒh‚Ĺˆľ‚¤ƒTƒCƒY */
152     } SLICE;
153 chapuni 1
154     /* crypt64() ‚Ş‹ň‚¤ƒpƒ‰ƒ[ƒ^ */
155     struct PARAM
156     {
157 chapuni 6 SLICE lr[2][32];
158     SLICE t[32];
159     SLICE hit[10][64];
160     SLICE hiti[10][26];
161 chapuni 1 };
162    
163 chapuni 15 /* ŒŽ‚Í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 chapuni 1 struct KEY
168     {
169 chapuni 6 SLICE k[2][2][28];
170 chapuni 15 SLICE ks[28];
171 chapuni 1 };
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 chapuni 6 int i, j;
443 chapuni 1 if (!((vk | sk) & 0x7F))
444     return;
445    
446     for (i = 0; i < 7; i++)
447     {
448 chapuni 6 if (n == 7 && i < N_STRIDE) continue;
449 chapuni 1 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 chapuni 6 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 chapuni 1 }
461     else
462     {
463     assert(o >= 28);
464     assert(o < 56);
465 chapuni 6 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 chapuni 1 }
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 chapuni 10 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 chapuni 1 }
483     else
484     {
485     assert(o >= 28);
486     assert(o < 56);
487 chapuni 10 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 chapuni 1 }
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 chapuni 6 /* ĹŒă‚ĚƒoƒCƒg */
537     if (N_STRIDE == 7)
538     return 0;
539    
540 chapuni 1 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 chapuni 9 #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 chapuni 6 #endif
902    
903 chapuni 1 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 chapuni 6 //printf("Salt %d:%d %+3d:%+3d",
930     printf("Salt %d:%d %08lX:%08lX",
931 chapuni 1 i, j,
932 chapuni 6 C(code, i, j, 0),
933     C(code, i, j, 24));
934 chapuni 1 #endif
935     if (s & (1 << j))
936     {
937 chapuni 6 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 chapuni 1 }
940     else
941     {
942 chapuni 6 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 chapuni 1 }
945 chapuni 6 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 chapuni 1 #if DEBUG>=2
948 chapuni 6 //printf(" => %+3d:%+3d\n",
949     printf(" => %08lX:%08lX\n",
950     C(code, i, j, 0),
951     C(code, i, j, 24));
952 chapuni 1 #endif
953     }
954     }
955     }
956    
957     /***************************************************************
958     *
959     * ƒIƒyƒR[ƒh‚đ“WŠJ
960     *
961     * r EAX, ECX, EDX, EBX
962 chapuni 14 * SIB, EBP, ESI, EDI
963 chapuni 1 *
964     */
965    
966 chapuni 14 /* ofs8(i) ‚ŕ‚ľ‚­‚Í ofs32(i) ‚đśŹ */
967 chapuni 1 static
968     signed char *
969 chapuni 14 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 chapuni 15 #define PTR_T 7 /* DI(LR+16) */
998     #define OFS_T (64 + 32 - 16)
999 chapuni 14
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 chapuni 1 reg_op(signed char *pc,
1021     unsigned op,
1022     unsigned d,
1023     unsigned s)
1024     {
1025 chapuni 14 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 chapuni 10 #ifndef USE_MMX
1064 chapuni 6 *pc++ = 0x66;
1065     #endif
1066 chapuni 1 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 chapuni 14 unsigned i,
1081 chapuni 10 int ofs)
1082 chapuni 1 {
1083 chapuni 10 #ifndef USE_MMX
1084 chapuni 6 *pc++ = 0x66;
1085     #endif
1086 chapuni 1 pc[0] = 0x0F;
1087     pc[1] = op;
1088 chapuni 14 return disp_rm(pc + 2, d, i, ofs);
1089 chapuni 1 }
1090    
1091 chapuni 14 #endif
1092    
1093 chapuni 1 /***************************************************************
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 chapuni 14 unsigned op = OP_MOV;
1143 chapuni 1 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 chapuni 14 assert(op != OP_MOV);
1161 chapuni 1 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 chapuni 14 oop = OP_MOV;
1199 chapuni 1 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 chapuni 14 1, /* MM1/R9 */
1207     PTR_T,
1208 chapuni 15 sizeof(WS_T) * (OFS_T + (64 * ofs + j)));
1209 chapuni 14 oop = OP_OR;
1210 chapuni 1 }
1211 chapuni 14 if (oop != OP_OR)
1212 chapuni 1 {
1213     if (ofs == 9)
1214     return -1;
1215     }
1216     else
1217     {
1218     iptr = reg_op(iptr,
1219     op,
1220 chapuni 14 0, /* MM0/R8 */
1221     1); /* MM1/R9 */
1222     op = OP_AND;
1223 chapuni 1 }
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 chapuni 14 0, /* MM0/R8 */
1237     PTR_T,
1238 chapuni 15 sizeof(WS_T) * (OFS_T + (64 * ofs + c)));
1239 chapuni 14 op = OP_AND;
1240 chapuni 1 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 chapuni 14 /* MM7 ‚Ƀ^[ƒQƒbƒg–ˆ‚É”äŠrŒ‹‰Ę‚đ OR ‚ľ‚Ä‚˘‚­‚˝‚ß
1295     ‚Ü‚¸‚̓[ƒƒNƒŠƒA */
1296     iptr = reg_op(iptr, OP_XOR, 7, 7); /* MM7/R15 := 0 */
1297 chapuni 1
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 chapuni 14 /* 1ƒ^[ƒQƒbƒg•Ş‚Ě”äŠrŒ‹‰Ę‚đ MM7 ‚ɒljÁ */
1332 chapuni 1 if (n > 0)
1333     iptr = reg_op(iptr + n,
1334 chapuni 14 OP_OR,
1335     7, /* MM7/R15 */
1336     0); /* MM0/R8 */
1337 chapuni 1 }
1338     }
1339    
1340 chapuni 14 /* MM7 ‚ɐśŹ‚ł‚ę‚˝Œ‹‰Ę‚đ t[31] ‚ÉŠi”[ */
1341 chapuni 1 return reg_mem(iptr,
1342 chapuni 14 OP_STOR,
1343     7, /* MM7/R15 */
1344     PTR_T,
1345 chapuni 15 sizeof(WS_T) * (64 + 31 - 16));
1346 chapuni 1 }
1347    
1348     static
1349 chapuni 10 unsigned
1350 chapuni 1 usec()
1351     {
1352 chapuni 10 #if !defined(WIN32)
1353 chapuni 1 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 chapuni 6 #if N_STRIDE == 7
1371     static SLICE const sk6[N_STRIDE] =
1372 chapuni 1 {
1373 chapuni 6 {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 chapuni 1 {0xAAAAAAAAUL, 0xAAAAAAAAUL},
1385     {0xCCCCCCCCUL, 0xCCCCCCCCUL},
1386     {0xF0F0F0F0UL, 0xF0F0F0F0UL},
1387     {0xFF00FF00UL, 0xFF00FF00UL},
1388     {0xFFFF0000UL, 0xFFFF0000UL},
1389     {0x00000000UL, 0xFFFFFFFFUL},
1390     };
1391 chapuni 6 #endif
1392 chapuni 1
1393 chapuni 10 #ifdef WIN32
1394     typedef int (__fastcall *CRYPT64_PP)(ALU_T const *k, ALU_T *lr);
1395 chapuni 1 #endif
1396    
1397 chapuni 10 ALIGN_PREFIX(16) struct KEY key64 ALIGN_SUFFIX(16);
1398     ALIGN_PREFIX(16) struct PARAM param64 ALIGN_SUFFIX(16);
1399 chapuni 1
1400     int
1401     main(int argc, char *argv[])
1402     {
1403     int i, j;
1404     int mincnt;
1405 chapuni 2 signed char *code = NULL;
1406 chapuni 1 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 chapuni 10 #ifdef WIN32
1418     HANDLE h;
1419     #endif
1420    
1421 chapuni 1 #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 chapuni 10 assert((1 << N_STRIDE) == N_ALU * ALU_BITS);
1434    
1435 chapuni 1 /* t[16] ‚́A“ŕ•”‰‰ŽZ‚ĹŽg—p‚ˇ‚éAall 1 ‚Ş“ü‚Á‚Ä‚˘‚é */
1436 chapuni 6 for (i = 0; i < N_ALU; i++)
1437     param64.t[16].a[i] = -1;
1438 chapuni 1
1439     /* ŒĹ’čƒL[‚ĚƒRƒs[ */
1440 chapuni 6 for (i = 0; i < N_STRIDE; i++)
1441 chapuni 1 {
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 chapuni 15 /* ƒ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 chapuni 1 /* Salt‚đ‰Á–Ą‚ľ‚Č‚˘ę‡‚́AƒR[ƒh—Ěˆć‚đ
1460     writable —Ěˆć‚É“WŠJ‚ľ‚Č‚­‚Ä‚ŕ‚悢B
1461     [XXX] OS‚É‚ć‚Á‚ẮA‘ž&ŽŔs‰Â”\—Ěˆć‚đę—p‚ĚƒT[ƒ”ƒBƒX‚Ĺ
1462     Žć“ž‚ľ‚Ȃ݂ę‚΂Ȃç‚Č‚˘‚ŕ‚Ě‚ŕ‚ ‚邊‚ŕ‚ľ‚ę‚Č‚˘‚̂ŁA’ˆÓ */
1463 chapuni 10 #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 chapuni 2 if (SUCCEEDED(h))
1473     code = (signed char *)MapViewOfFile(h,
1474 chapuni 10 FILE_MAP_EXECUTE | FILE_MAP_WRITE,
1475 chapuni 2 0, 0x10000000,
1476     0);
1477 chapuni 1 #else
1478     code = (signed char *)mmap(NULL,
1479     0x10000000,
1480     PROT_EXEC | PROT_READ | PROT_WRITE,
1481 chapuni 20 MAP_PRIVATE | MAP_ANON,
1482 chapuni 1 1, /* fd */
1483     0);
1484 chapuni 2 if ((void *)code == MAP_FAILED)
1485     code =NULL;
1486 chapuni 1 #endif
1487 chapuni 2
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 chapuni 1 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 chapuni 10 assert(!((ptrdiff_t)&key64 & (sizeof(WS_T) - 1)));
1515     assert(!((ptrdiff_t)&param64 & (sizeof(WS_T) - 1)));
1516 chapuni 1
1517     if ((ofp = fopen("log.txt", "at")) != NULL)
1518 chapuni 21 setvbuf(ofp, NULL, _IONBF, BUFSIZ); /* XXX MSVCRT ‚Ĺ‚Í _IOLBF ‚ŞŠú‘Ň’Ę‚č‚É“Žě‚ľ‚Č‚˘ */
1519 chapuni 1
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 chapuni 9 int32_t cnt;
1530 chapuni 1 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 chapuni 14 /* ŒÄ‚Ô!
1540     LR ‰Šú‰ť‚́AƒTƒuƒ‚ƒWƒ…[ƒ‹“ŕ‚ōs‚¤‚ׂľ
1541     FASTCALL ‚ɏ€‚ś‚˝ŒÄ‚яo‚ľ‚Ě‚˝‚߁A
1542     ƒzƒ“ƒg‚Í‚˘‚낢‚냌ƒWƒXƒ^‚Ş”j‰ó‚ł‚ę‚éƒnƒYc‚Č‚ń‚ž‚ށB */
1543 chapuni 1 #ifdef __GNUC__
1544     asm volatile("call *%3"
1545     : "=a"(cnt)
1546 chapuni 14 : "c"(key64.k), "d"(param64.lr),
1547     "m"(code)
1548     //"m"(crypt64_sta)
1549 chapuni 15 : CRYPT64_CLOBBER "memory");
1550 chapuni 1 #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 chapuni 9 fprintf(stderr, "cycle=%d\n", (int)cnt);
1560 chapuni 1 }
1561    
1562     /* ƒqƒbƒg‚ľ‚˝‚Ć‚Ť‚̏ˆ— */
1563 chapuni 6 for (kk = 0; kk < N_ALU; kk++)
1564 chapuni 1 {
1565 chapuni 6 ALU_T t;
1566 chapuni 9
1567 chapuni 1 t = param64.t[31].a[kk];
1568     if (!t)
1569     continue;
1570 chapuni 9
1571 chapuni 6 for (k = 0; k < ALU_BITS; k++)
1572 chapuni 1 {
1573     char hash[16];
1574     unsigned char buf[32];
1575 chapuni 9
1576     if (!(t & ((ALU_T)1 << k)))
1577 chapuni 1 continue;
1578 chapuni 9
1579 chapuni 14 /* 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 chapuni 1 for (i = 1; i < 11; i++)
1584     {
1585     unsigned c = 0;
1586     for (j = 0; j < 6; j++)
1587 chapuni 9 c = (c << 1) | !!(param64.lr[0][tr_fp[6 * i + j]].a[kk] & ((ALU_T)1 << k));
1588 chapuni 1 hash[i - 1] = c["./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"];
1589     }
1590     hash[10] = 0;
1591    
1592     memcpy(buf, key, 32);
1593     buf[8] = buf[9] = 0;
1594 chapuni 10 buf[7] = (buf[7] & -(1 << N_STRIDE) & 0x7F) + ALU_BITS * kk + k;
1595 chapuni 1 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 chapuni 6 int a = (100 << N_STRIDE) * (n_iter - ts[N_TS - 1].c) / (t - ts[N_TS - 1].t);
1642 chapuni 1 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 chapuni 2 /*
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