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

Properties

Name Value
svn:eol-style native

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