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

Properties

Name Value
svn:eol-style native

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