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

Properties

Name Value
svn:eol-style native

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