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

Properties

Name Value
svn:eol-style native

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