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 14 - (hide annotations) (download) (as text)
Fri Mar 9 06:49:26 2007 UTC (17 years, 1 month ago) by chapuni
Original Path: mty/mty.c
File MIME type: text/x-csrc
File size: 32107 byte(s)
種別 USE_64 (64-bit ALU 使用) を追加。
ただし、今回追加のアセンブラモジュールには対応コードが含まれていません。
準備だけ。

準備として、以下の変更を行う。
* ポインタ BP, SI の役割を入れ替えた。(BP) のとき disp 0 が省略できないため。
* LRがBPとなったため、デフォルトで disp8 がつくようになった。そのためアセンブル時のゲタ OX は、64ビット演算時は 0x00 に固定した。Salt固定のときは crypt64 のエントリを直接呼べる(ハズ)。
reg_op(), reg_mem() 周りを抽象化した。比較器に対して正しいコードが吐けている(200509相当の拡張)。

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

Properties

Name Value
svn:eol-style native

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