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 10 - (hide 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 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 9 #include <limits.h>
21 chapuni 1 #include <stdio.h>
22     #include <stdlib.h>
23     #include <string.h>
24     #include <time.h>
25 chapuni 10
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 chapuni 1 #include "crypt64.h"
63     #include "dt4.h"
64    
65 chapuni 9 #if defined(USE_MMX)
66 chapuni 6
67     #define N_STRIDE 6
68     typedef uint64_t WS_T;
69     typedef uint32_t ALU_T;
70    
71 chapuni 9 #elif defined(USE_64_XMM)
72 chapuni 6
73     #define N_STRIDE 7
74 chapuni 10 typedef DQWORD_T WS_T;
75 chapuni 9 typedef uint64_t ALU_T;
76    
77     #else /* XMM */
78    
79     #define N_STRIDE 7
80 chapuni 10 typedef DQWORD_T WS_T;
81 chapuni 6 typedef uint32_t ALU_T;
82    
83     #endif
84    
85 chapuni 9 #define N_I (sizeof(WS_T) / sizeof(uint32_t))
86 chapuni 6 #define N_ALU (sizeof(WS_T) / sizeof(ALU_T))
87 chapuni 9 #define ALU_BITS (CHAR_BIT * sizeof(ALU_T))
88 chapuni 6
89 chapuni 1 /* ŒŽ“]’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 chapuni 6 typedef union SLICE
118 chapuni 1 {
119 chapuni 9 uint32_t i[N_I]; /* 32-bit initializer */
120 chapuni 6 ALU_T a[N_ALU]; /* C ‚Ĺˆľ‚˘‚₡‚˘ƒTƒCƒY */
121     WS_T w; /* ƒGƒ“ƒR[ƒh‚Ĺˆľ‚¤ƒTƒCƒY */
122     } SLICE;
123 chapuni 1
124     /* crypt64() ‚Ş‹ň‚¤ƒpƒ‰ƒ[ƒ^ */
125     struct PARAM
126     {
127 chapuni 6 SLICE lr[2][32];
128     SLICE t[32];
129     SLICE hit[10][64];
130     SLICE hiti[10][26];
131 chapuni 1 };
132    
133     /* ŒŽ‚ÍLR ‚ƁA‚ť‚ĚƒRƒs[‚Ş•K—v */
134     struct KEY
135     {
136 chapuni 6 SLICE k[2][2][28];
137 chapuni 1 };
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 chapuni 6 int i, j;
409 chapuni 1 if (!((vk | sk) & 0x7F))
410     return;
411    
412     for (i = 0; i < 7; i++)
413     {
414 chapuni 6 if (n == 7 && i < N_STRIDE) continue;
415 chapuni 1 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 chapuni 6 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 chapuni 1 }
427     else
428     {
429     assert(o >= 28);
430     assert(o < 56);
431 chapuni 6 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 chapuni 1 }
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 chapuni 10 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 chapuni 1 }
449     else
450     {
451     assert(o >= 28);
452     assert(o < 56);
453 chapuni 10 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 chapuni 1 }
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 chapuni 6 /* ĹŒă‚ĚƒoƒCƒg */
503     if (N_STRIDE == 7)
504     return 0;
505    
506 chapuni 1 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 chapuni 9 #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 chapuni 6 #endif
868    
869 chapuni 1 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 chapuni 6 //printf("Salt %d:%d %+3d:%+3d",
896     printf("Salt %d:%d %08lX:%08lX",
897 chapuni 1 i, j,
898 chapuni 6 C(code, i, j, 0),
899     C(code, i, j, 24));
900 chapuni 1 #endif
901     if (s & (1 << j))
902     {
903 chapuni 6 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 chapuni 1 }
906     else
907     {
908 chapuni 6 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 chapuni 1 }
911 chapuni 6 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 chapuni 1 #if DEBUG>=2
914 chapuni 6 //printf(" => %+3d:%+3d\n",
915     printf(" => %08lX:%08lX\n",
916     C(code, i, j, 0),
917     C(code, i, j, 24));
918 chapuni 1 #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 chapuni 10 #ifndef USE_MMX
948 chapuni 6 *pc++ = 0x66;
949     #endif
950 chapuni 1 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 chapuni 10 int ofs)
966 chapuni 1 {
967 chapuni 10 #ifndef USE_MMX
968 chapuni 6 *pc++ = 0x66;
969     #endif
970 chapuni 1 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 chapuni 6 sizeof(WS_T) * ((64 * ofs + j) + 32 - 16));
1110 chapuni 1 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 chapuni 6 sizeof(WS_T) * ((64 * ofs + c) + 32 - 16));
1140 chapuni 1 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 chapuni 6 sizeof(WS_T) * (31 - 16));
1244 chapuni 1 }
1245    
1246     static
1247 chapuni 10 unsigned
1248 chapuni 1 usec()
1249     {
1250 chapuni 10 #if !defined(WIN32)
1251 chapuni 1 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 chapuni 6 #if N_STRIDE == 7
1269     static SLICE const sk6[N_STRIDE] =
1270 chapuni 1 {
1271 chapuni 6 {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 chapuni 1 {0xAAAAAAAAUL, 0xAAAAAAAAUL},
1283     {0xCCCCCCCCUL, 0xCCCCCCCCUL},
1284     {0xF0F0F0F0UL, 0xF0F0F0F0UL},
1285     {0xFF00FF00UL, 0xFF00FF00UL},
1286     {0xFFFF0000UL, 0xFFFF0000UL},
1287     {0x00000000UL, 0xFFFFFFFFUL},
1288     };
1289 chapuni 6 #endif
1290 chapuni 1
1291 chapuni 10 #ifdef WIN32
1292     typedef int (__fastcall *CRYPT64_PP)(ALU_T const *k, ALU_T *lr);
1293 chapuni 1 #endif
1294    
1295 chapuni 10 ALIGN_PREFIX(16) struct KEY key64 ALIGN_SUFFIX(16);
1296     ALIGN_PREFIX(16) struct PARAM param64 ALIGN_SUFFIX(16);
1297 chapuni 1
1298     int
1299     main(int argc, char *argv[])
1300     {
1301     int i, j;
1302     int mincnt;
1303 chapuni 2 signed char *code = NULL;
1304 chapuni 1 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 chapuni 10 #ifdef WIN32
1316     HANDLE h;
1317     #endif
1318    
1319 chapuni 1 #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 chapuni 10 assert((1 << N_STRIDE) == N_ALU * ALU_BITS);
1332    
1333 chapuni 1 /* t[16] ‚́A“ŕ•”‰‰ŽZ‚ĹŽg—p‚ˇ‚éAall 1 ‚Ş“ü‚Á‚Ä‚˘‚é */
1334 chapuni 6 for (i = 0; i < N_ALU; i++)
1335     param64.t[16].a[i] = -1;
1336 chapuni 1
1337     /* ŒĹ’čƒL[‚ĚƒRƒs[ */
1338 chapuni 6 for (i = 0; i < N_STRIDE; i++)
1339 chapuni 1 {
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 chapuni 10 #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 chapuni 2 if (SUCCEEDED(h))
1366     code = (signed char *)MapViewOfFile(h,
1367 chapuni 10 FILE_MAP_EXECUTE | FILE_MAP_WRITE,
1368 chapuni 2 0, 0x10000000,
1369     0);
1370 chapuni 1 #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 chapuni 2 if ((void *)code == MAP_FAILED)
1378     code =NULL;
1379 chapuni 1 #endif
1380 chapuni 2
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 chapuni 1 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 chapuni 10 assert(!((ptrdiff_t)&key64 & (sizeof(WS_T) - 1)));
1408     assert(!((ptrdiff_t)&param64 & (sizeof(WS_T) - 1)));
1409 chapuni 1
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 chapuni 9 int32_t cnt;
1423 chapuni 1 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 chapuni 9 fprintf(stderr, "cycle=%d\n", (int)cnt);
1451 chapuni 1 }
1452     /* XXX Žč”˛‚Ť‚Ě‚˝‚߁Aƒ[ƒN‚ɂ͂ݏo‚Ä‚˘‚é2ƒrƒbƒg‚𗎂Ƃˇ */
1453 chapuni 6 for (i = 0; i < N_ALU; i++)
1454     param64.t[0].a[i] = param64.t[1].a[i] = 0;
1455 chapuni 1
1456     /* ƒqƒbƒg‚ľ‚˝‚Ć‚Ť‚̏ˆ— */
1457 chapuni 6 for (kk = 0; kk < N_ALU; kk++)
1458 chapuni 1 {
1459 chapuni 6 ALU_T t;
1460 chapuni 9
1461 chapuni 1 t = param64.t[31].a[kk];
1462     if (!t)
1463     continue;
1464 chapuni 9
1465 chapuni 6 for (k = 0; k < ALU_BITS; k++)
1466 chapuni 1 {
1467     char hash[16];
1468     unsigned char buf[32];
1469 chapuni 9
1470     if (!(t & ((ALU_T)1 << k)))
1471 chapuni 1 continue;
1472 chapuni 9
1473 chapuni 1 for (i = 1; i < 11; i++)
1474     {
1475     unsigned c = 0;
1476     for (j = 0; j < 6; j++)
1477 chapuni 9 c = (c << 1) | !!(param64.lr[0][tr_fp[6 * i + j]].a[kk] & ((ALU_T)1 << k));
1478 chapuni 1 hash[i - 1] = c["./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"];
1479     }
1480     hash[10] = 0;
1481    
1482     memcpy(buf, key, 32);
1483     buf[8] = buf[9] = 0;
1484 chapuni 10 buf[7] = (buf[7] & -(1 << N_STRIDE) & 0x7F) + ALU_BITS * kk + k;
1485 chapuni 1 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 chapuni 6 int a = (100 << N_STRIDE) * (n_iter - ts[N_TS - 1].c) / (t - ts[N_TS - 1].t);
1532 chapuni 1 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 chapuni 2 /*
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