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

Properties

Name Value
svn:eol-style native

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