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 39 - (hide annotations) (download) (as text)
Tue Mar 27 10:53:45 2007 UTC (17 years ago) by chapuni
Original Path: mty/mty.c
File MIME type: text/x-csrc
File size: 22455 byte(s)
ヲナヌー辞書の痕跡(USE_DT)を条件除外した。
cp932[] を、cp932.[ch] に切り離した。(ちうか名前変えたいよね)
translate.h の文字コードがやや腐ってたので変換。
1 chapuni 1 /***********************************************************************
2     *
3 chapuni 26 * file: mty.c
4 chapuni 1 *
5 chapuni 2 * ‚Ü‚ A‘Ň‚Ä‰ŽB
6 chapuni 1 *
7     * $Id$
8     *
9     */
10    
11     #include <assert.h>
12     #include <ctype.h>
13 chapuni 24 #include <errno.h>
14 chapuni 13 #include <malloc.h>
15 chapuni 9 #include <limits.h>
16 chapuni 24 #include <stdarg.h>
17 chapuni 20 #include <stddef.h>
18 chapuni 1 #include <stdio.h>
19     #include <stdlib.h>
20     #include <string.h>
21     #include <time.h>
22 chapuni 10
23     #if defined(WIN32)
24    
25     #include <windows.h>
26     #include <sys/timeb.h>
27    
28     #elif defined(__GNUC__)
29    
30     #include <sys/mman.h>
31     #include <sys/time.h>
32    
33     #endif
34    
35 chapuni 26 #include "config.h"
36 chapuni 39 #include "cp932.h"
37 chapuni 1 #include "crypt64.h"
38 chapuni 26 #include "expr.h"
39     #include "translate.h"
40 chapuni 1
41 chapuni 39 #if USE_DT
42     #include "dt4.h"
43     #endif
44    
45 chapuni 9 #define N_I (sizeof(WS_T) / sizeof(uint32_t))
46 chapuni 6 #define N_ALU (sizeof(WS_T) / sizeof(ALU_T))
47 chapuni 9 #define ALU_BITS (CHAR_BIT * sizeof(ALU_T))
48 chapuni 6
49 chapuni 1 /* ŒŽ“]’u PC1 */
50     static int const tr_pc1[8][7] =
51     {
52     { 8, 16, 24, 56, 52, 44, 36},
53     { 7, 15, 23, 55, 51, 43, 35},
54     { 6, 14, 22, 54, 50, 42, 34},
55     { 5, 13, 21, 53, 49, 41, 33},
56     { 4, 12, 20, 28, 48, 40, 32},
57     { 3, 11, 19, 27, 47, 39, 31},
58     { 2, 10, 18, 26, 46, 38, 30},
59     { 1, 9, 17, 25, 45, 37, 29},
60     };
61    
62     /* LRĹI“]’u */
63     static int const tr_fp[64 + 2] =
64     {
65     39, 7, 47, 15, 55, 23, 63, 31,
66     38, 6, 46, 14, 54, 22, 62, 30,
67     37, 5, 45, 13, 53, 21, 61, 29,
68     36, 4, 44, 12, 52, 20, 60, 28,
69     35, 3, 43, 11, 51, 19, 59, 27,
70     34, 2, 42, 10, 50, 18, 58, 26,
71     33, 1, 41, 9, 49, 17, 57, 25,
72     32, 0, 40, 8, 48, 16, 56, 24,
73     64, 64,
74     };
75    
76 chapuni 15 /* ŒŽƒVƒtƒgƒXƒPƒWƒ…[ƒ‹
77     KEY::k[2] ‚đćґň‚É—p‚˘‚ÄŽć‚čo‚ľ‚ĚŠČ‘f‰ť‚đ}‚é */
78     static int ks_ls[] =
79     {
80     1, 1, 2, -1,
81     2, -1, 2, -1,
82     2, -1, 2, -1,
83     2, -1, 1, 2,
84     -1, 2, -1, 2,
85     -1, 2, -1, 2,
86     -1, 2, -1, 1 - 28,
87     };
88    
89 chapuni 1 /* 1ƒrƒbƒg•Ş */
90 chapuni 6 typedef union SLICE
91 chapuni 1 {
92 chapuni 9 uint32_t i[N_I]; /* 32-bit initializer */
93 chapuni 6 ALU_T a[N_ALU]; /* C ‚Ĺˆľ‚˘‚₡‚˘ƒTƒCƒY */
94     WS_T w; /* ƒGƒ“ƒR[ƒh‚Ĺˆľ‚¤ƒTƒCƒY */
95     } SLICE;
96 chapuni 1
97     /* crypt64() ‚Ş‹ň‚¤ƒpƒ‰ƒ[ƒ^ */
98     struct PARAM
99     {
100 chapuni 6 SLICE lr[2][32];
101     SLICE t[32];
102     SLICE hit[10][64];
103     SLICE hiti[10][26];
104 chapuni 1 };
105    
106 chapuni 15 /* ŒŽ‚ÍLR ‚ƁA‚ť‚ĚƒRƒs[‚Ş•K—v
107     KEY::k[0] LR
108     KEY::k[1] LR‚ĚƒRƒs[(č—]‚đČ‚­‚˝‚ß)
109     KEY::k[2][0][i].a[0] ŽŸŒŽ‚Ö‚Ě‘•Ş */
110 chapuni 1 struct KEY
111     {
112 chapuni 6 SLICE k[2][2][28];
113 chapuni 15 SLICE ks[28];
114 chapuni 1 };
115    
116     /* ŒŽ•śŽš—ń */
117     unsigned char key[8 + 8];
118     unsigned char okey[8 + 8];
119    
120     /* ŒŽƒNƒ‰ƒX */
121     struct
122     {
123     unsigned cls;
124     unsigned map[256];
125     } kcls[8 + 8];
126    
127 chapuni 26
128     /* Šg’ŁŒŽƒNƒ‰ƒX */
129 chapuni 1 #define KCLS_DT0 64
130     #define KCLS_DT1 128
131     #define KCLS_K2 256
132    
133     #if USE_DT
134     /* ŒŽƒLƒ—pŽŤ‘ƒCƒ“ƒfƒNƒX */
135     struct DT *kd[8 + 8];
136    
137     /* ŽŤ‘ƒCƒ“ƒfƒNƒX */
138     struct DT *dtidx[0x100 + 1];
139     #endif
140    
141     /* Žw’肳‚ę‚˝ƒNƒ‰ƒX‚Ć“ü‚Á‚Ä‚˘‚éƒL[‚Š‚çAclassify ‚đs‚¤ */
142     void
143     key_make_map(int n)
144     {
145     int i, j;
146     unsigned c = kcls[n].map[key[n]];
147    
148 chapuni 39 #if USE_DT
149 chapuni 1 if (3 <= n && n < 7 && kd[n - 3])
150     {
151     /* ŽŤ‘‚ĚƒPƒc‚Ě•śŽšBŒă‚ë‚Ƀiƒjƒ„ƒ‰ƒLƒƒƒ‰ƒNƒ^‚Ş—ˆ‚é */
152     c = kd[n - 3]->c[0];
153     if ((0x81 <= c && c <= 0x9F)
154     || (0xE0 <= c && c <= 0xFC))
155     c = KCLS_K2;
156     else
157     c = (cp932[256 * key[n]]
158     | cp932[256 * (key[n] ^ 0x80)]);
159     #if DEBUG>=1
160     printf("*n=%d, key=%02X, cls=%04X\n",
161     n,
162     key[n],
163     c);
164     #endif
165     }
166     else if (2 <= n && n < 6 && kd[n - 2])
167     {
168     return;
169     }
170     else if (1 <= n && n < 5 && kd[n - 1])
171     {
172     return;
173     }
174     else if (1 <= n && n < 5 && !kd[n - 1]
175     //&& (c & KCLS_K2)
176     && (c & KCLS_DT1))
177     {
178     /* ŠżŽš2•śŽš‚đE‚Á‚Ä‚˘‚Ť‚܂ */
179     #if DEBUG>=1
180     printf("(%d)%02X %02X(%02X:%02X:%02X:%02X)\n",
181     n, key[n - 1], key[n],
182     cp932[(256 * key[n - 1] + key[n])],
183     cp932[(256 * key[n - 1] + key[n]) ^ 0x0080],
184     cp932[(256 * key[n - 1] + key[n]) ^ 0x8000],
185     cp932[(256 * key[n - 1] + key[n]) ^ 0x8080]);
186     #endif
187     if (n != 1 && n != 2
188     && (cp932[(256 * key[n - 1] + key[n]) ^ 0x0080] & KCLS_DT1))
189     key[n] ^= 0x80;
190     else if (n != 2 && n != 3
191     && (cp932[(256 * key[n - 1] + key[n]) ^ 0x8000] & KCLS_DT1))
192     key[n - 1] ^= 0x80;
193     else if (n > 3 && (cp932[(256 * key[n - 1] + key[n]) ^ 0x8080] & KCLS_DT1))
194     key[n - 1] ^= 0x80, key[n] ^= 0x80;
195     if (cp932[256 * key[n - 1] + key[n]] & KCLS_DT1)
196     {
197     for (kd[n - 1] = dtidx[key[n - 1]];
198     kd[n - 1]->c[1] != key[n];
199     kd[n - 1]++)
200     assert(kd[n - 1]->c[0] == key[n - 1]);
201     #if DEBUG>=1
202     printf("(%02X%02X:%02X%02X)%c%c%c%c\n",
203     kd[n - 1]->c[0],
204     kd[n - 1]->c[1],
205     kd[n - 1]->c[2],
206     kd[n - 1]->c[3],
207     kd[n - 1]->c[0],
208     kd[n - 1]->c[1],
209     kd[n - 1]->c[2],
210     kd[n - 1]->c[3]);
211     #endif
212     return;
213     }
214     }
215     else if (n < 4 && (c & KCLS_DT0) && kd[n] == NULL)
216     {
217     /* ƒJƒ^ƒJƒi–„‚ߍž‚Ý‚˘‚Ť‚Ü‚ˇ */
218     assert(kd[n] == NULL);
219     #if DEBUG>=1
220     printf("n=%d, key=%02X\n", n, key[n]);
221     #endif
222     kd[n] = dtidx[key[n]];
223     if (!kd[n]
224     && !(n == 1 || n == 2)
225     && dtidx[key[n] ^ 0x80])
226     {
227     key[n] ^= 0x80;
228     kd[n] = dtidx[key[n]];
229     }
230     if (kd[n])
231     return;
232     }
233     else
234     {
235     kd[n] = NULL;
236     }
237 chapuni 39 #endif
238 chapuni 1
239     /* ĹŒă‚Ě•”•Ş‚Í class map ‚đśŹ‚ˇ‚é•K—vƒiƒV */
240     if (n >= 6)
241     return;
242    
243     for (i = 0; i < 256; i++)
244     {
245 chapuni 25 unsigned bm = 0;
246 chapuni 1 #if 1
247     if (c & KCLS_K1)
248     {
249     if (cp932[256 * key[n] + i] & KCLS_K1)
250     bm |= KCLS_K2 | (cp932[256 * key[n] + i] & KCLS_DT1);
251     if (cp932[256 * (key[n] ^ 0x80) + i] & KCLS_K1)
252     bm |= KCLS_K2 | (cp932[256 * (key[n] ^ 0x80) + i] & KCLS_DT1);
253     #if 0
254     bm |= ((cp932[256 * key[n] + i] & KCLS_K1)
255     || (cp932[256 * (key[n] ^ 0x80) + i] & KCLS_K1)
256     ? KCLS_K2 : 0);
257     #endif
258     }
259     if (c & (KCLS_AN | KCLS_KA | KCLS_K2))
260     for (j = 0; j < 256; j++)
261     {
262     bm |= cp932[256 * i + j] & (KCLS_AN | KCLS_KA | KCLS_K1
263     | KCLS_DT0);
264     #if 0
265     if (j >= 127 && !(n == 0 || n == 1))
266     break;
267     #endif
268     }
269     kcls[n + 1].map[i] = bm;
270     #endif
271     if (i >= 128 && !(n == 0 || n == 1))
272     kcls[n + 1].map[i - 128] |= kcls[n + 1].map[i];
273     }
274    
275     if (n < 6)
276     kcls[n + 1].map[0x00] = kcls[n + 1].map[0x80] = 0;
277     if (n == 6)
278     kcls[7].map[0x00] |= KCLS_AN;
279     }
280    
281 chapuni 39 #if USE_DT
282 chapuni 1 unsigned
283     dt_get(int kdn,
284     int xn,
285     int n,
286     int ch)
287     {
288     int i;
289     #if DEBUG>=1
290     printf("*dt_get(%d)%c%c%c%c(%02X%02X:%02X%02X)->ch=%d",
291     n,
292     kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],
293     kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],
294     ch);
295     #endif
296     /* ‚Ü‚¸‚͐”‚Ś‚é */
297     for (i = 0;
298     kd[kdn][i].c[xn] == kd[kdn]->c[xn];
299     i++)
300     ;
301     assert(i > 0);
302     kd[kdn] += ch % i;
303     #if DEBUG>=1
304     printf("/%d\n dt_get: %c%c%c%c(%02X%02X:%02X%02X)->ch=%d\n",
305     i,
306     kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],
307     kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],
308     ch);
309     #endif
310     return kd[kdn]->c[n];
311     }
312 chapuni 39 #endif
313 chapuni 1
314     /* ƒ}ƒbƒv‚Š‚ç•śŽš‚đE‚Á‚ăZƒbƒg */
315     unsigned
316     key_set(int n, unsigned ch)
317     {
318     int cnt = 0, i;
319    
320 chapuni 39 #if USE_DT
321 chapuni 1 if (3 <= n && n < 7 && kd[n - 3])
322     {
323     return dt_get(n - 3, 2, 3, ch);
324     return kd[n - 3]->c[3];
325     }
326     else if (2 <= n && n < 6 && kd[n - 2])
327     {
328     return dt_get(n - 2, 1, 2, ch);
329     return kd[n - 2]->c[2];
330     }
331     else if (1 <= n && n < 5 && kd[n - 1])
332     {
333     return dt_get(n - 1, 0, 1, ch);
334     return kd[n - 1]->c[1];
335     }
336 chapuni 39 #endif
337 chapuni 1
338     #if DEBUG>=3
339     if (cnt == 0)
340     {
341     printf("n=%d, ch=%d, (n-1)=%02X\n", n, ch, key[n - 1]);
342     int j;
343     for (i = 0; i < 16; i++)
344     {
345     printf("map[0x%02X] =", 16 * i);
346     for (j = 0; j < 16; j++)
347     printf(" %03X", kcls[n].map[16 * i + j]);
348     printf("\n");
349     }
350     }
351     #endif
352     for (i = 0; i < 256; i++)
353     {
354     if (kcls[n].map[i])
355     {
356     if (ch-- == 0)
357     return i;
358     cnt++;
359     }
360     if (n != 1 && n != 2 && i >= 127)
361     break;
362     }
363     /* ŒŠ‚Â‚Š‚ç‚ȂЂÁ‚˝‚Ě‚Ĺ‚ŕ‚˘‚Á‚Ř‚ń */
364     assert(cnt > 0);
365     ch %= cnt;
366     for (i = 0; i < 256; i++)
367     if (kcls[n].map[i])
368     {
369     if (ch-- == 0)
370     return i;
371     }
372     assert(!"not matched");
373     return 0;
374     }
375    
376     /* bitwise key ‚đƒZƒbƒg */
377     static
378     void
379     key_set64(struct KEY *key64,
380     int n,
381     unsigned k,
382     unsigned vk,
383     unsigned sk)
384     {
385 chapuni 6 int i, j;
386 chapuni 1 if (!((vk | sk) & 0x7F))
387     return;
388    
389     for (i = 0; i < 7; i++)
390     {
391 chapuni 6 if (n == 7 && i < N_STRIDE) continue;
392 chapuni 1 if (sk & (1 << i))
393     {
394     /* ƒZƒbƒg */
395     int o = tr_pc1[n][6 - i] - 1;
396     if (o < 28)
397     {
398     assert(o >= 0);
399 chapuni 6 for (j = 0; j < N_ALU; j++)
400     key64->k[0][0][o].a[j]
401     = key64->k[0][1][o].a[j]
402     = -!!(k & (1 << i));
403 chapuni 1 }
404     else
405     {
406     assert(o >= 28);
407     assert(o < 56);
408 chapuni 6 for (j = 0; j < N_ALU; j++)
409     key64->k[1][0][o - 28].a[j]
410     = key64->k[1][1][o - 28].a[j]
411     = -!!(k & (1 << i));
412 chapuni 1 }
413     }
414     else if (vk & (1 << i))
415     {
416     /* ”˝“] */
417     int o = tr_pc1[n][6 - i] - 1;
418     if (o < 28)
419     {
420     assert(o >= 0);
421 chapuni 10 for (j = 0; j < N_ALU; j++)
422     key64->k[0][0][o].a[j]
423     = key64->k[0][1][o].a[j]
424     = ~key64->k[0][0][o].a[j];
425 chapuni 1 }
426     else
427     {
428     assert(o >= 28);
429     assert(o < 56);
430 chapuni 10 for (j = 0; j < N_ALU; j++)
431     key64->k[1][0][o - 28].a[j]
432     = key64->k[1][1][o - 28].a[j]
433     = ~key64->k[1][0][o - 28].a[j];
434 chapuni 1 }
435     }
436     }
437     }
438    
439     /* Žw’肳‚ę‚˝ƒNƒ‰ƒX‚ĚŠJŽn’l‚ÉƒŠƒZƒbƒg
440     ’ź‘O‚Ě•śŽš‚ĚƒNƒ‰ƒX‚É”›‚ç‚ę‚é */
441     int
442     key_reset(int n)
443     {
444     if (n >= 8)
445     return 1;
446     if (n == 7)
447     {
448     key[7] = 0;
449     return 1;
450     }
451    
452     /* 0-2 •śŽš–ڂ̓‰ƒ“ƒ_ƒ€‚ÉŒˆ‚ß‚é
453     3 •śŽš–ÚˆČ~‚͏‰Šú’l‚É */
454     if (n >= 3)
455     key[n] = key_set(n, 0);
456     else
457     key[n] = key_set(n, rand());
458    
459     #if DEBUG>=3
460     printf("key[%d]=%02X ncls=%04X\n", n, key[n], kcls[n].map[key[n]]);
461     #endif
462    
463     /* ƒZƒbƒg‚ł‚ę‚˝•śŽš‚đŒł‚ÉAŽŸƒLƒƒƒ‰‚Ě•śŽšƒNƒ‰ƒX‚đŒˆ‚ß‚é */
464     key_make_map(n);
465    
466     return key_reset(n + 1);
467     }
468    
469     /* Žw’肳‚ę‚˝ŒŽ‹óŠÔ‚Ě’†‚ŁAƒL[‚đ‚ЂƂi‚ß‚é
470     ˆŔ‘S‚ɃCƒ“ƒNƒŠƒƒ“ƒg‚Ĺ‚Ť‚˝ę‡ true ‚đ•Ô‚ˇ */
471     static
472     int
473     key_inc(int n)
474     {
475     if (n >= 8)
476     return 0;
477     else if (n == 7)
478     {
479 chapuni 6 /* ĹŒă‚ĚƒoƒCƒg */
480 chapuni 25 key[7] = (key[7] + (1 << N_STRIDE)) & 0x7F;
481 chapuni 1 if (key[7]) return 1;
482     else return 0;
483     }
484     else if (key_inc(n + 1)
485     /*
486     && key_inc(n + 1)
487     && key_inc(n + 1)
488     && key_inc(n + 1)*/
489     )
490     return 1;
491    
492     /* Salt ‚̓Cƒ“ƒNƒŠƒƒ“ƒg‚ľ‚Č‚˘–ń‘Ђɂˇ‚é */
493     if (n == 1 || n == 2)
494     return 1;
495    
496     #if DEBUG>=3
497     printf("key_inc(n=%d,ck=%02X)\n", n, key[n]);
498     #endif
499    
500 chapuni 39 #if USE_DT
501 chapuni 1 /* ŽŤ‘Œę‚̓Cƒ“ƒNƒŠƒƒ“ƒg‚ľ‚Ä‚˘‚˘–ń‘Ђɂˇ‚é */
502     if (3 <= n && n < 7 && kd[n - 3])
503     {
504     if ((key[n - 3] & 0x7F) == ((kd[n - 3] + 1)->c[0] & 0x7F)
505     && (key[n - 2] & 0x7F) == ((kd[n - 3] + 1)->c[1] & 0x7F)
506     && (key[n - 1] & 0x7F) == ((kd[n - 3] + 1)->c[2] & 0x7F))
507     {
508     memcpy(&key[n - 3], &(++kd[n - 3])->c[0], 4);
509     #if DEBUG>=2
510     printf(">dt_get:%c%c%c%c(%02X%02X:%02X%02X)\n",
511     kd[n - 3]->c[0], kd[n - 3]->c[1], kd[n - 3]->c[2], kd[n - 3]->c[3],
512     kd[n - 3]->c[0], kd[n - 3]->c[1], kd[n - 3]->c[2], kd[n - 3]->c[3]);
513     #endif
514     return 1;
515     }
516     else
517     {
518     return 0;
519     }
520     }
521     else if (2 <= n && n < 6 && kd[n - 2])
522     {
523     if ((key[n - 2] & 0x7F) == ((kd[n - 2] + 1)->c[0] & 0x7F)
524     && (key[n - 1] & 0x7F) == ((kd[n - 2] + 1)->c[1] & 0x7F))
525     {
526     memcpy(&key[n - 2], &(++kd[n - 2])->c[0], 4);
527     #if DEBUG>=2
528     printf(">dt_get:%c%c%c%c(%02X%02X:%02X%02X)\n",
529     kd[n - 2]->c[0], kd[n - 2]->c[1], kd[n - 2]->c[2], kd[n - 2]->c[3],
530     kd[n - 2]->c[0], kd[n - 2]->c[1], kd[n - 2]->c[2], kd[n - 2]->c[3]);
531     #endif
532     return 1;
533     }
534     else
535     {
536     return 0;
537     }
538     if (kd[n - 2]->c[0] == key[n - 2])
539     return 1;
540     else
541     return 0;
542     }
543     else if (1 <= n && n < 5 && kd[n - 1])
544     {
545     unsigned c2 = kd[n - 1]->c[0];
546     if ((0x81 <= c2 && c2 <= 0x9F)
547     || (0xE0 <= c2 && c2 <= 0xFC))
548     {
549     kd[n - 1] = NULL;
550     #if 0
551     if (!(n == 1 && n == 2))
552     key[n] &= 0x7F;
553     if (!(n == 2 && n == 3))
554     key[n - 1] &= 0x7F;
555     #endif
556     key_make_map(n - 1);
557     }
558     else if ((key[n - 1] & 0x7F) == ((kd[n - 1] + 1)->c[0] & 0x7F))
559     {
560     memcpy(&key[n - 1], &(++kd[n - 1])->c[0], 4);
561     #if DEBUG>=2
562     printf(">dt_get:%c%c%c%c(%02X%02X:%02X%02X)\n",
563     kd[n - 1]->c[0], kd[n - 1]->c[1], kd[n - 1]->c[2], kd[n - 1]->c[3],
564     kd[n - 1]->c[0], kd[n - 1]->c[1], kd[n - 1]->c[2], kd[n - 1]->c[3]);
565     #endif
566     return 1;
567     }
568     else
569     {
570     return 0;
571     }
572     #if 0
573     if (kd[n - 1]->c[0] == key[n - 1])
574     return 1;
575     else
576     return 0;
577     #endif
578     }
579     else if (n < 4 && kd[n])
580     {
581     if (0 && kd[n]->c[0] == key[n])
582     return 1;
583     kd[n] = NULL;
584     #if 0
585     if (!(n == 1 || n == 2))
586     key[n] &= 0x7F;
587     #endif
588     }
589 chapuni 39 #endif
590 chapuni 1
591     /* ŽŔŰ‚É‘‚₾‚Ă݂é */
592     assert(n >= 3);
593     for (;;)
594     {
595     if (n <= 3
596     && !(key[n] & 0x80)
597     && kcls[n].map[key[n] ^ 0x80] & (KCLS_DT0))
598     {
599     /* ”źŠpƒJƒ^ƒJƒi‚Ě1ƒoƒCƒg–Ú */
600     key[n] ^= 0x80;
601     }
602     else
603     {
604     key[n] = (key[n] & 0x7F) + 1;
605     if (key[n] >= 0x80)
606     return 0;
607     }
608    
609     if (kcls[n].map[key[n]])
610     {
611     key_make_map(n);
612     key_reset(n + 1);
613     return 1;
614     }
615     }
616     while (++key[n] < 0x80)
617     {
618     if (kcls[n].map[key[n]])
619     {
620     key_make_map(n);
621     key_reset(n + 1);
622     return 1;
623     }
624     }
625     return 0;
626     }
627    
628     /* ŒŽ‚đŠŽ‘S‚ÉƒŠƒZƒbƒg‚ˇ‚é
629     Salt‚ŕƒZƒbƒg‚ľ’ꂎ */
630     static
631     void
632     key_init()
633     {
634     int i, j;
635    
636     #if USE_DT
637     /* ŽŤ‘‚đAƒCƒ“ƒfƒNƒX‚đě‚č‚Č‚Ş‚çƒ}ƒbƒv‚ɂ͂߂ą‚ń‚ŐŔ‚­
638     ŽŤ‘‚̓R[ƒh‡¸‡‚É•Ŕ‚ń‚Ĺ‚é‚ŕ‚̂Ƃˇ‚é */
639     for (i = 0; i < dtcnt; i++)
640     {
641     unsigned c = dt[i].c[0];
642    
643     assert(dt[i].c[0]
644     && dt[i].c[1]
645     && dt[i].c[2]
646     && dt[i].c[3]);
647    
648     /* BSD ŽI‚Ĺ‚ľ‚É‚ť‚¤‚Č•śŽš‚ÍŽc”O‚Č‚Ş‚çœŠO */
649     assert((dt[i].c[0] & 0x7F)
650     && (dt[i].c[1] & 0x7F)
651     && (dt[i].c[2] & 0x7F)
652     && (dt[i].c[3] & 0x7F));
653    
654     /* ƒCƒ“ƒfƒNƒX */
655     if (!dtidx[c])
656     dtidx[c] = &dt[i];
657    
658     if ((0x81 <= c && c <= 0x9F)
659     || (0xE0 <= c && c <= 0xFC))
660     {
661     /* ‘SŠp‚Ȃ̂ŁA2ƒoƒCƒg‚Ť‚Ü‚Á‚˝Žž“_‚Ĺ—§‚Ä‚é */
662     cp932[256 * c + dt[i].c[1]] |= KCLS_DT1;
663     }
664     else if (0xA1 <= c && c <= 0xDF)
665     {
666     /* ”źŠpƒJƒi */
667     for (j = 0; j < 256; j++)
668     cp932[256 * c + j] |= KCLS_DT0;
669     }
670     }
671     /* ƒPƒcA‚ż‚¤‚Š”Ôl */
672     dtidx[0x100] = &dt[i];
673     #endif
674    
675     key[8] = 0;
676    
677     /* ‰Šúƒ}ƒbƒv‚đ‘g‚Ţ */
678     for (i = 0; i < 256; i++)
679     {
680     unsigned bm = 0;
681     kcls[0].map[i] = 0;
682     for (j = 0; j < 256; j++)
683     bm |= cp932[256 * i + j];
684     kcls[0].map[i] = bm & (KCLS_AN | KCLS_KA | KCLS_K1
685     | KCLS_DT0
686     );
687     if (i >= 128)
688     kcls[0].map[i - 128] |= kcls[0].map[i];
689     }
690    
691     key_reset(0);
692     }
693    
694     /***************************************************************
695     *
696     * Salt ‚ĚƒZƒbƒg
697     * ƒIƒyƒ‰ƒ“ƒh‚ĚƒIƒtƒZƒbƒg‚đ‘‚ŤŠˇ‚ڂĉń‚Á‚Ä‚é‚̂ŒˆÓ
698     *
699     */
700    
701 chapuni 9 #if N_STRIDE == 6
702     #define C(c,i,j,o) (*(int8_t *)((c) + (loo - crypt64_sta) + los[6 * (i) + (j) + (o)]))
703     #elif N_STRIDE == 7
704     #define C(c,i,j,o) (*(int32_t *)((c) + (loo - crypt64_sta) + los[6 * (i) + (j) + (o)]))
705 chapuni 6 #endif
706    
707 chapuni 1 void
708     set_salt(signed char *code,
709     unsigned char const *k)
710     {
711     int i, j;
712    
713     for (i = 0; i < 2; i++)
714     {
715     unsigned s = k[1 + i] & 255;
716     if (s > 'z')
717     s = 0;
718     else if (s >= 'a')
719     s = s - 'a' + 2 + 10 + 26;
720     else if (s >= 'A')
721     s = s - 'A' + 2 + 10;
722     else if (s >= '.')
723     s = s - '.';
724     else
725     s = 0;
726    
727     #if DEBUG>=1
728     printf("Salt %d:%3o\n", i, s & 63);
729     #endif
730     for (j = 0; j < 6; j++)
731     {
732     #if DEBUG>=2
733 chapuni 6 //printf("Salt %d:%d %+3d:%+3d",
734     printf("Salt %d:%d %08lX:%08lX",
735 chapuni 1 i, j,
736 chapuni 6 C(code, i, j, 0),
737     C(code, i, j, 24));
738 chapuni 1 #endif
739     if (s & (1 << j))
740     {
741 chapuni 6 C(code, i, j, 0) = sizeof(WS_T) * (((4 * i + j + 15) & 31) - 16);
742     C(code, i, j, 24) = sizeof(WS_T) * (((4 * i + j - 1) & 31) - 16);
743 chapuni 1 }
744     else
745     {
746 chapuni 6 C(code, i, j, 0) = sizeof(WS_T) * (((4 * i + j - 1) & 31) - 16);
747     C(code, i, j, 24) = sizeof(WS_T) * (((4 * i + j + 15) & 31) - 16);
748 chapuni 1 }
749 chapuni 6 C(code, i, j, 12) = sizeof(WS_T) * (((4 * i + j + 7) & 31) - 16);
750     C(code, i, j, 36) = sizeof(WS_T) * (((4 * i + j + 23) & 31) - 16);
751 chapuni 1 #if DEBUG>=2
752 chapuni 6 //printf(" => %+3d:%+3d\n",
753     printf(" => %08lX:%08lX\n",
754     C(code, i, j, 0),
755     C(code, i, j, 24));
756 chapuni 1 #endif
757     }
758     }
759     }
760    
761     static
762 chapuni 10 unsigned
763 chapuni 1 usec()
764     {
765 chapuni 10 #if !defined(WIN32)
766 chapuni 1 struct timeval tv;
767     gettimeofday(&tv, NULL);
768     return 100 * tv.tv_sec + (tv.tv_usec / 10000);
769     #else
770     struct timeb tm;
771     ftime(&tm);
772     return 100 * tm.time + tm.millitm / 10;
773     #endif
774     }
775    
776 chapuni 24 static
777     int
778     log_printf(FILE *ofp, char const *fmt, ...)
779     {
780     int r;
781     va_list ap;
782     va_start(ap, fmt);
783     vfprintf(stdout, fmt, ap);
784     r = vfprintf(ofp, fmt, ap);
785     va_end(ap);
786     if (r > 0)
787     return r;
788     perror("log_printf");
789     exit(errno);
790     }
791    
792 chapuni 1 /***************************************************************
793     *
794     * ƒƒCƒ“ƒ‹[ƒv‚Ć‚Š
795     *
796     */
797    
798     /* ’萔€ */
799 chapuni 6 #if N_STRIDE == 7
800     static SLICE const sk6[N_STRIDE] =
801 chapuni 1 {
802 chapuni 6 {0xAAAAAAAAUL, 0xAAAAAAAAUL, 0xAAAAAAAAUL, 0xAAAAAAAAUL},
803     {0xCCCCCCCCUL, 0xCCCCCCCCUL, 0xCCCCCCCCUL, 0xCCCCCCCCUL},
804     {0xF0F0F0F0UL, 0xF0F0F0F0UL, 0xF0F0F0F0UL, 0xF0F0F0F0UL},
805     {0xFF00FF00UL, 0xFF00FF00UL, 0xFF00FF00UL, 0xFF00FF00UL},
806     {0xFFFF0000UL, 0xFFFF0000UL, 0xFFFF0000UL, 0xFFFF0000UL},
807     {0x00000000UL, 0xFFFFFFFFUL, 0x00000000UL, 0xFFFFFFFFUL},
808     {0x00000000UL, 0x00000000UL, 0xFFFFFFFFUL, 0xFFFFFFFFUL},
809     };
810     #elif N_STRIDE == 6
811     static SLICE const sk6[N_STRIDE] =
812     {
813 chapuni 1 {0xAAAAAAAAUL, 0xAAAAAAAAUL},
814     {0xCCCCCCCCUL, 0xCCCCCCCCUL},
815     {0xF0F0F0F0UL, 0xF0F0F0F0UL},
816     {0xFF00FF00UL, 0xFF00FF00UL},
817     {0xFFFF0000UL, 0xFFFF0000UL},
818     {0x00000000UL, 0xFFFFFFFFUL},
819     };
820 chapuni 6 #endif
821 chapuni 1
822 chapuni 10 #ifdef WIN32
823     typedef int (__fastcall *CRYPT64_PP)(ALU_T const *k, ALU_T *lr);
824 chapuni 1 #endif
825    
826 chapuni 10 ALIGN_PREFIX(16) struct KEY key64 ALIGN_SUFFIX(16);
827     ALIGN_PREFIX(16) struct PARAM param64 ALIGN_SUFFIX(16);
828 chapuni 1
829     int
830     main(int argc, char *argv[])
831     {
832     int i, j;
833     int mincnt;
834 chapuni 2 signed char *code = NULL;
835 chapuni 1 FILE *ofp;
836     int n_iter;
837     int cr;
838    
839     #define N_TS 4
840     struct
841     {
842     unsigned t;
843     int c;
844     } ts[N_TS];
845    
846 chapuni 10 #ifdef WIN32
847     HANDLE h;
848     #endif
849    
850 chapuni 1 #ifndef __GNUC__
851     CRYPT64_PP d_crypt64;
852     #endif
853    
854     #if 0
855     if (argc < 2)
856     {
857     fprintf(stderr, "ŽŽ‚Ť‚Ú‚ń‚Ę\n");
858     return 1;
859     }
860     #endif
861    
862 chapuni 10 assert((1 << N_STRIDE) == N_ALU * ALU_BITS);
863    
864 chapuni 1 /* t[16] ‚́A“ŕ•”‰‰ŽZ‚ĹŽg—p‚ˇ‚éAall 1 ‚Ş“ü‚Á‚Ä‚˘‚é */
865 chapuni 6 for (i = 0; i < N_ALU; i++)
866     param64.t[16].a[i] = -1;
867 chapuni 1
868     /* ŒĹ’čƒL[‚ĚƒRƒs[ */
869 chapuni 6 for (i = 0; i < N_STRIDE; i++)
870 chapuni 1 {
871     int o = tr_pc1[7][6 - i] - 1;
872     if (o < 28)
873     {
874     key64.k[0][0][o] = key64.k[0][1][o] = sk6[i];
875     }
876     else
877     {
878     o -= 28;
879     key64.k[1][0][o] = key64.k[1][1][o] = sk6[i];
880     }
881     }
882    
883 chapuni 15 /* ƒL[ƒXƒPƒWƒ…[ƒ‹‚đ‚ą‚ą‚ɉŸ‚ľž‚߂è‚­
884     ]—ˆ‚Í crypt64.S “ŕ‚ĹŠŽŒ‹‚ˇ‚é‚悤‚Ɉř‚˘‚Ä‚˘‚˝ */
885     for (i = 0; i < 28; i++)
886     key64.ks[i].a[0] = sizeof(WS_T) * ks_ls[i];
887    
888 chapuni 1 /* Salt‚đ‰Á–Ą‚ľ‚Č‚˘ę‡‚́AƒR[ƒh—Ěˆć‚đ
889     writable —Ěˆć‚É“WŠJ‚ľ‚Č‚­‚Ä‚ŕ‚悢B
890     [XXX] OS‚É‚ć‚Á‚ẮA‘ž&ŽŔs‰Â”\—Ěˆć‚đę—p‚ĚƒT[ƒ”ƒBƒX‚Ĺ
891     Žć“ž‚ľ‚Ȃ݂ę‚΂Ȃç‚Č‚˘‚ŕ‚Ě‚ŕ‚ ‚邊‚ŕ‚ľ‚ę‚Č‚˘‚̂ŁA’ˆÓ */
892 chapuni 10 #ifdef WIN32
893     h = CreateFileMapping(INVALID_HANDLE_VALUE,
894     NULL,
895     PAGE_EXECUTE_READWRITE,
896     0, 0x20000000,
897     NULL);
898     #ifndef FILE_MAP_EXECUTE
899     #define FILE_MAP_EXECUTE SECTION_MAP_EXECUTE /* XXX cygwin */
900     #endif
901 chapuni 2 if (SUCCEEDED(h))
902     code = (signed char *)MapViewOfFile(h,
903 chapuni 10 FILE_MAP_EXECUTE | FILE_MAP_WRITE,
904 chapuni 2 0, 0x10000000,
905     0);
906 chapuni 1 #else
907     code = (signed char *)mmap(NULL,
908     0x10000000,
909     PROT_EXEC | PROT_READ | PROT_WRITE,
910 chapuni 20 MAP_PRIVATE | MAP_ANON,
911 chapuni 1 1, /* fd */
912     0);
913 chapuni 2 if ((void *)code == MAP_FAILED)
914     code =NULL;
915 chapuni 1 #endif
916 chapuni 2
917     /* ƒƒ‚ƒŠ‚ŞŠm•ۂłŤ‚Ä‚˘‚Č‚˘ę‡‚Ě‚˘‚ń‚ż‚Ť‘΍ô */
918     if (code == NULL)
919     code = (signed char *)malloc(crypt64_end - crypt64_sta + 1024 * 1024);
920     assert(code != NULL);
921    
922     /* Prologue ‚đ“WŠJ */
923 chapuni 1 memcpy(code, crypt64_sta, crypt64_end - crypt64_sta);
924     #ifndef __GNUC__
925     d_crypt64 = (CRYPT64_PP)code;
926     #endif
927     memcpy(expr_parse(code + (crypt64_end - crypt64_sta),
928     1024 * 1024 - (crypt64_ep_end - crypt64_ep),
929     argv[1]),
930     crypt64_ep,
931     crypt64_ep_end - crypt64_ep);
932    
933     /* ƒL[‚̏‰Šú‰ť */
934     srand(time(NULL));
935     key_init();
936     set_salt(code, key);
937     for (i = 0; i < 8; i++)
938     key_set64(&key64, i, okey[i] = key[i], 0, 0x7F);
939    
940     #if DEBUG>=1
941     printf("key=%p param=%p\n", &key64, &param64);
942     #endif
943 chapuni 10 assert(!((ptrdiff_t)&key64 & (sizeof(WS_T) - 1)));
944     assert(!((ptrdiff_t)&param64 & (sizeof(WS_T) - 1)));
945 chapuni 1
946 chapuni 24 if ((ofp = fopen("log.txt", "at")) == NULL)
947     {
948     perror("log.txt");
949     return errno;
950     }
951 chapuni 1
952 chapuni 24 setvbuf(ofp, NULL, _IONBF, BUFSIZ); /* XXX MSVCRT ‚Ĺ‚Í _IOLBF ‚ŞŠú‘Ň’Ę‚č‚É“Žě‚ľ‚Č‚˘ */
953    
954 chapuni 1 for (i = 0; i < N_TS; i++)
955     ts[i].t = ts[i].c = 0;
956    
957     mincnt = 0x7FFFFFFF;
958     n_iter = 0;
959     cr = 0;
960     /* ’Tőƒ‹[ƒv‚ž‚ź‚Á‚Ć */
961     for (;;)
962     {
963 chapuni 9 int32_t cnt;
964 chapuni 1 int k, kk;
965    
966     /* ŒŽ‚ĚƒZƒbƒg */
967     for (i = 0; i < 8; i++)
968     {
969     key_set64(&key64, i, key[i], key[i] ^ okey[i], 0);
970     okey[i] = key[i];
971     }
972    
973 chapuni 14 /* ŒÄ‚Ô!
974     LR ‰Šú‰ť‚́AƒTƒuƒ‚ƒWƒ…[ƒ‹“ŕ‚ōs‚¤‚ׂľ
975     FASTCALL ‚ɏ€‚ś‚˝ŒÄ‚яo‚ľ‚Ě‚˝‚߁A
976     ƒzƒ“ƒg‚Í‚˘‚낢‚냌ƒWƒXƒ^‚Ş”j‰ó‚ł‚ę‚éƒnƒYc‚Č‚ń‚ž‚ށB */
977 chapuni 1 #ifdef __GNUC__
978     asm volatile("call *%3"
979     : "=a"(cnt)
980 chapuni 14 : "c"(key64.k), "d"(param64.lr),
981     "m"(code)
982     //"m"(crypt64_sta)
983 chapuni 15 : CRYPT64_CLOBBER "memory");
984 chapuni 1 #else
985     cnt = (*d_crypt64)(key64.k[0][0][0].a, param64.lr[0][0].a);
986     #endif
987     if (mincnt > cnt && cnt > 0)
988     {
989     mincnt = cnt;
990     if (cr)
991     fprintf(stderr, "\n");
992     cr = 0;
993 chapuni 9 fprintf(stderr, "cycle=%d\n", (int)cnt);
994 chapuni 1 }
995    
996     /* ƒqƒbƒg‚ľ‚˝‚Ć‚Ť‚̏ˆ— */
997 chapuni 6 for (kk = 0; kk < N_ALU; kk++)
998 chapuni 1 {
999 chapuni 6 ALU_T t;
1000 chapuni 9
1001 chapuni 1 t = param64.t[31].a[kk];
1002     if (!t)
1003     continue;
1004 chapuni 9
1005 chapuni 6 for (k = 0; k < ALU_BITS; k++)
1006 chapuni 1 {
1007     char hash[16];
1008     unsigned char buf[32];
1009 chapuni 9
1010     if (!(t & ((ALU_T)1 << k)))
1011 chapuni 1 continue;
1012 chapuni 9
1013 chapuni 14 /* XXX Žč”˛‚Ť‚Ě‚˝‚߁Aƒ[ƒN‚ɂ͂ݏo‚Ä‚˘‚é 2 ƒrƒbƒg‚đ‚ą‚ą‚Ĺ—Ž‚Ć‚ˇ
1014     ƒqƒbƒg‚ˇ‚é‚˝‚Ń‚Éç’ˇ‚ɍs‚í‚ę‚邪A‹C‚É‚ľ‚Ă͂˘‚Š‚ń */
1015 chapuni 29 param64.t[0].a[kk] = param64.t[1].a[kk] = 0;
1016 chapuni 1 for (i = 1; i < 11; i++)
1017     {
1018     unsigned c = 0;
1019     for (j = 0; j < 6; j++)
1020 chapuni 9 c = (c << 1) | !!(param64.lr[0][tr_fp[6 * i + j]].a[kk] & ((ALU_T)1 << k));
1021 chapuni 1 hash[i - 1] = c["./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"];
1022     }
1023     hash[10] = 0;
1024    
1025     memcpy(buf, key, 32);
1026     buf[8] = buf[9] = 0;
1027 chapuni 10 buf[7] = (buf[7] & -(1 << N_STRIDE) & 0x7F) + ALU_BITS * kk + k;
1028 chapuni 1 if (translate(buf, 0, 1))
1029     {
1030     if (cr)
1031     fprintf(stderr, "\n");
1032     cr = 0;
1033 chapuni 24 log_printf(ofp,
1034     "Ÿ%s #%-10.10s(%02X %02X %02X %02X %02X %02X %02X %02X/%02X)\n",
1035     hash,
1036     buf,
1037     buf[0], buf[1], buf[2], buf[3],
1038     buf[4], buf[5], buf[6], buf[7],
1039     buf[8]);
1040 chapuni 1 }
1041     else
1042     {
1043     #if DEBUG>=1
1044     if (cr)
1045     fprintf(stderr, "\n");
1046     cr = 0;
1047 chapuni 24 log_printf(ofp,
1048     "Ÿ%s (%02X %02X %02X %02X %02X %02X %02X %02X )\n",
1049     hash,
1050     buf[0], buf[1], buf[2], buf[3],
1051     buf[4], buf[5], buf[6], buf[7]);
1052 chapuni 1 #endif
1053     }
1054     }
1055     }
1056    
1057     if (++n_iter - ts[0].c >= 8192)
1058     {
1059     int t = usec();
1060     if (ts[N_TS - 1].c)
1061     {
1062 chapuni 6 int a = (100 << N_STRIDE) * (n_iter - ts[N_TS - 1].c) / (t - ts[N_TS - 1].t);
1063 chapuni 1 fprintf(stderr,
1064     "%8d.%03d(ktrips/sec)\r",
1065     a / 1000,
1066     a % 1000);
1067     cr++;
1068     }
1069     for (i = N_TS - 1; i >= 1; i--)
1070     ts[i] = ts[i - 1];
1071     ts[0].c = n_iter;
1072     ts[0].t = t;
1073     for (i = 1; i < N_TS; i++)
1074     if (ts[i].c)
1075     break;
1076     else
1077     ts[i] = ts[i - 1];
1078     }
1079     #if 1
1080     if (!key_inc(3))
1081     {
1082     #if DEBUG>=2
1083     printf("********************************\n");
1084     #endif
1085     key_reset(0);
1086     set_salt(code, key);
1087     for (i = 0; i < 8; i++)
1088     key_set64(&key64, i, okey[i] = key[i], 0, 0x7F);
1089     }
1090     #endif
1091     }
1092    
1093     return 0;
1094     }
1095    
1096 chapuni 2 /*
1097     * Local Variables:
1098     * tab-width: 4
1099     * End:
1100     *
1101     * EOF */

Properties

Name Value
svn:eol-style native

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