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 2 - (hide annotations) (download) (as text)
Fri Mar 2 07:03:17 2007 UTC (17 years, 1 month ago) by chapuni
Original Path: mty/mty.c
File MIME type: text/x-csrc
File size: 29957 byte(s)
W2k などにおいて、XP 拡張された引数を mmap しようとし失敗していたため、
対策として、legacy malloc() を試みるように変更。
1 chapuni 1 /***********************************************************************
2     *
3     * file: mty.cpp
4     *
5 chapuni 2 * まあ、待て屋。
6 chapuni 1 *
7     * $Id$
8     *
9     */
10    
11     #define DEBUG 0
12     #define USE_DT 1
13    
14     #ifndef DEBUG
15     #define NDEBUG
16     #endif
17    
18     #ifdef __MSVCRT__
19     #include <windows.h>
20     #include <sys/timeb.h>
21     #else
22     #include <sys/mman.h>
23     #endif
24    
25 chapuni 2 #include <sys/time.h>
26 chapuni 1 #include <assert.h>
27     #include <ctype.h>
28     #include <stdio.h>
29     #include <stdlib.h>
30     #include <string.h>
31     #include <time.h>
32     #include "crypt64.h"
33     #include "dt4.h"
34    
35     /* 鍵転置 PC1 */
36     static int const tr_pc1[8][7] =
37     {
38     { 8, 16, 24, 56, 52, 44, 36},
39     { 7, 15, 23, 55, 51, 43, 35},
40     { 6, 14, 22, 54, 50, 42, 34},
41     { 5, 13, 21, 53, 49, 41, 33},
42     { 4, 12, 20, 28, 48, 40, 32},
43     { 3, 11, 19, 27, 47, 39, 31},
44     { 2, 10, 18, 26, 46, 38, 30},
45     { 1, 9, 17, 25, 45, 37, 29},
46     };
47    
48     /* LR最終転置 */
49     static int const tr_fp[64 + 2] =
50     {
51     39, 7, 47, 15, 55, 23, 63, 31,
52     38, 6, 46, 14, 54, 22, 62, 30,
53     37, 5, 45, 13, 53, 21, 61, 29,
54     36, 4, 44, 12, 52, 20, 60, 28,
55     35, 3, 43, 11, 51, 19, 59, 27,
56     34, 2, 42, 10, 50, 18, 58, 26,
57     33, 1, 41, 9, 49, 17, 57, 25,
58     32, 0, 40, 8, 48, 16, 56, 24,
59     64, 64,
60     };
61    
62     /* 1ビット分 */
63     struct SLICE
64     {
65     unsigned long a[2];
66     };
67    
68     /* crypt64() が喰うパラメータ */
69     struct PARAM
70     {
71     struct SLICE lr[2][32];
72     struct SLICE t[32];
73     struct SLICE hit[10][64];
74     struct SLICE hiti[10][26];
75     };
76    
77     /* 鍵はLR と、そのコピーが必要 */
78     struct KEY
79     {
80     struct SLICE k[2][2][28];
81     };
82    
83     /* 漢字クラス表 */
84     unsigned char cp932[0x10000] = {
85     #include "cp932.inc"
86     };
87    
88     /* 鍵文字列 */
89     unsigned char key[8 + 8];
90     unsigned char okey[8 + 8];
91    
92     /* 鍵クラス */
93     struct
94     {
95     unsigned cls;
96     unsigned map[256];
97     } kcls[8 + 8];
98    
99     #define KCLS_AN 1
100     #define KCLS_KA 2
101     #define KCLS_K1 4
102     #define KCLS_DT0 64
103     #define KCLS_DT1 128
104     #define KCLS_K2 256
105    
106     #if USE_DT
107     /* 鍵キメ用辞書インデクス */
108     struct DT *kd[8 + 8];
109    
110     /* 辞書インデクス */
111     struct DT *dtidx[0x100 + 1];
112     #endif
113    
114     /* 指定されたクラスと入っているキーから、classify を行う */
115     void
116     key_make_map(int n)
117     {
118     int i, j;
119     unsigned c = kcls[n].map[key[n]];
120    
121     if (3 <= n && n < 7 && kd[n - 3])
122     {
123     /* 辞書のケツの文字。後ろにナニヤラキャラクタが来る */
124     c = kd[n - 3]->c[0];
125     if ((0x81 <= c && c <= 0x9F)
126     || (0xE0 <= c && c <= 0xFC))
127     c = KCLS_K2;
128     else
129     c = (cp932[256 * key[n]]
130     | cp932[256 * (key[n] ^ 0x80)]);
131     #if DEBUG>=1
132     printf("*n=%d, key=%02X, cls=%04X\n",
133     n,
134     key[n],
135     c);
136     #endif
137     }
138     else if (2 <= n && n < 6 && kd[n - 2])
139     {
140     return;
141     }
142     else if (1 <= n && n < 5 && kd[n - 1])
143     {
144     return;
145     }
146     else if (1 <= n && n < 5 && !kd[n - 1]
147     //&& (c & KCLS_K2)
148     && (c & KCLS_DT1))
149     {
150     /* 漢字2文字を拾っていきまつ */
151     #if DEBUG>=1
152     printf("(%d)%02X %02X(%02X:%02X:%02X:%02X)\n",
153     n, key[n - 1], key[n],
154     cp932[(256 * key[n - 1] + key[n])],
155     cp932[(256 * key[n - 1] + key[n]) ^ 0x0080],
156     cp932[(256 * key[n - 1] + key[n]) ^ 0x8000],
157     cp932[(256 * key[n - 1] + key[n]) ^ 0x8080]);
158     #endif
159     if (n != 1 && n != 2
160     && (cp932[(256 * key[n - 1] + key[n]) ^ 0x0080] & KCLS_DT1))
161     key[n] ^= 0x80;
162     else if (n != 2 && n != 3
163     && (cp932[(256 * key[n - 1] + key[n]) ^ 0x8000] & KCLS_DT1))
164     key[n - 1] ^= 0x80;
165     else if (n > 3 && (cp932[(256 * key[n - 1] + key[n]) ^ 0x8080] & KCLS_DT1))
166     key[n - 1] ^= 0x80, key[n] ^= 0x80;
167     if (cp932[256 * key[n - 1] + key[n]] & KCLS_DT1)
168     {
169     for (kd[n - 1] = dtidx[key[n - 1]];
170     kd[n - 1]->c[1] != key[n];
171     kd[n - 1]++)
172     assert(kd[n - 1]->c[0] == key[n - 1]);
173     #if DEBUG>=1
174     printf("(%02X%02X:%02X%02X)%c%c%c%c\n",
175     kd[n - 1]->c[0],
176     kd[n - 1]->c[1],
177     kd[n - 1]->c[2],
178     kd[n - 1]->c[3],
179     kd[n - 1]->c[0],
180     kd[n - 1]->c[1],
181     kd[n - 1]->c[2],
182     kd[n - 1]->c[3]);
183     #endif
184     return;
185     }
186     }
187     else if (n < 4 && (c & KCLS_DT0) && kd[n] == NULL)
188     {
189     /* カタカナ埋め込みいきます */
190     assert(kd[n] == NULL);
191     #if DEBUG>=1
192     printf("n=%d, key=%02X\n", n, key[n]);
193     #endif
194     kd[n] = dtidx[key[n]];
195     if (!kd[n]
196     && !(n == 1 || n == 2)
197     && dtidx[key[n] ^ 0x80])
198     {
199     key[n] ^= 0x80;
200     kd[n] = dtidx[key[n]];
201     }
202     if (kd[n])
203     return;
204     }
205     else
206     {
207     kd[n] = NULL;
208     }
209    
210     /* 最後の部分は class map を生成する必要ナシ */
211     if (n >= 6)
212     return;
213    
214     for (i = 0; i < 256; i++)
215     {
216     unsigned bs = 0, bm = 0;
217     #if 1
218     if (c & KCLS_K1)
219     {
220     if (cp932[256 * key[n] + i] & KCLS_K1)
221     bm |= KCLS_K2 | (cp932[256 * key[n] + i] & KCLS_DT1);
222     if (cp932[256 * (key[n] ^ 0x80) + i] & KCLS_K1)
223     bm |= KCLS_K2 | (cp932[256 * (key[n] ^ 0x80) + i] & KCLS_DT1);
224     #if 0
225     bm |= ((cp932[256 * key[n] + i] & KCLS_K1)
226     || (cp932[256 * (key[n] ^ 0x80) + i] & KCLS_K1)
227     ? KCLS_K2 : 0);
228     #endif
229     }
230     if (c & (KCLS_AN | KCLS_KA | KCLS_K2))
231     for (j = 0; j < 256; j++)
232     {
233     bm |= cp932[256 * i + j] & (KCLS_AN | KCLS_KA | KCLS_K1
234     | KCLS_DT0);
235     #if 0
236     if (j >= 127 && !(n == 0 || n == 1))
237     break;
238     #endif
239     }
240     kcls[n + 1].map[i] = bm;
241     #endif
242     if (i >= 128 && !(n == 0 || n == 1))
243     kcls[n + 1].map[i - 128] |= kcls[n + 1].map[i];
244     }
245    
246     if (n < 6)
247     kcls[n + 1].map[0x00] = kcls[n + 1].map[0x80] = 0;
248     if (n == 6)
249     kcls[7].map[0x00] |= KCLS_AN;
250     }
251    
252     unsigned
253     dt_get(int kdn,
254     int xn,
255     int n,
256     int ch)
257     {
258     int i;
259     #if DEBUG>=1
260     printf("*dt_get(%d)%c%c%c%c(%02X%02X:%02X%02X)->ch=%d",
261     n,
262     kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],
263     kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],
264     ch);
265     #endif
266     /* まずは数える */
267     for (i = 0;
268     kd[kdn][i].c[xn] == kd[kdn]->c[xn];
269     i++)
270     ;
271     assert(i > 0);
272     kd[kdn] += ch % i;
273     #if DEBUG>=1
274     printf("/%d\n dt_get: %c%c%c%c(%02X%02X:%02X%02X)->ch=%d\n",
275     i,
276     kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],
277     kd[kdn]->c[0], kd[kdn]->c[1], kd[kdn]->c[2], kd[kdn]->c[3],
278     ch);
279     #endif
280     return kd[kdn]->c[n];
281     }
282    
283     /* マップから文字を拾ってセット */
284     unsigned
285     key_set(int n, unsigned ch)
286     {
287     int cnt = 0, i;
288    
289     if (3 <= n && n < 7 && kd[n - 3])
290     {
291     return dt_get(n - 3, 2, 3, ch);
292     return kd[n - 3]->c[3];
293     }
294     else if (2 <= n && n < 6 && kd[n - 2])
295     {
296     return dt_get(n - 2, 1, 2, ch);
297     return kd[n - 2]->c[2];
298     }
299     else if (1 <= n && n < 5 && kd[n - 1])
300     {
301     return dt_get(n - 1, 0, 1, ch);
302     return kd[n - 1]->c[1];
303     }
304    
305     #if DEBUG>=3
306     if (cnt == 0)
307     {
308     printf("n=%d, ch=%d, (n-1)=%02X\n", n, ch, key[n - 1]);
309     int j;
310     for (i = 0; i < 16; i++)
311     {
312     printf("map[0x%02X] =", 16 * i);
313     for (j = 0; j < 16; j++)
314     printf(" %03X", kcls[n].map[16 * i + j]);
315     printf("\n");
316     }
317     }
318     #endif
319     for (i = 0; i < 256; i++)
320     {
321     if (kcls[n].map[i])
322     {
323     if (ch-- == 0)
324     return i;
325     cnt++;
326     }
327     if (n != 1 && n != 2 && i >= 127)
328     break;
329     }
330     /* 見つからなかったのでもいっぺん */
331     assert(cnt > 0);
332     ch %= cnt;
333     for (i = 0; i < 256; i++)
334     if (kcls[n].map[i])
335     {
336     if (ch-- == 0)
337     return i;
338     }
339     assert(!"not matched");
340     return 0;
341     }
342    
343     /* bitwise key をセット */
344     static
345     void
346     key_set64(struct KEY *key64,
347     int n,
348     unsigned k,
349     unsigned vk,
350     unsigned sk)
351     {
352     int i;
353     if (!((vk | sk) & 0x7F))
354     return;
355    
356     for (i = 0; i < 7; i++)
357     {
358     if (n == 7 && i < 6) continue;
359     if (sk & (1 << i))
360     {
361     /* セット */
362     int o = tr_pc1[n][6 - i] - 1;
363     if (o < 28)
364     {
365     assert(o >= 0);
366     key64->k[0][0][o].a[0]
367     = key64->k[0][0][o].a[1]
368     = key64->k[0][1][o].a[0]
369     = key64->k[0][1][o].a[1]
370     = -!!(k & (1 << i));
371     }
372     else
373     {
374     assert(o >= 28);
375     assert(o < 56);
376     key64->k[1][0][o - 28].a[0]
377     = key64->k[1][0][o - 28].a[1]
378     = key64->k[1][1][o - 28].a[0]
379     = key64->k[1][1][o - 28].a[1]
380     = -!!(k & (1 << i));
381     }
382     }
383     else if (vk & (1 << i))
384     {
385     /* 反転 */
386     int o = tr_pc1[n][6 - i] - 1;
387     if (o < 28)
388     {
389     assert(o >= 0);
390     key64->k[0][0][o].a[0]
391     = key64->k[0][0][o].a[1]
392     = key64->k[0][1][o].a[0]
393     = key64->k[0][1][o].a[1]
394     = ~key64->k[0][0][o].a[0];
395     }
396     else
397     {
398     assert(o >= 28);
399     assert(o < 56);
400     key64->k[1][0][o - 28].a[0]
401     = key64->k[1][0][o - 28].a[1]
402     = key64->k[1][1][o - 28].a[0]
403     = key64->k[1][1][o - 28].a[1]
404     = ~key64->k[1][0][o - 28].a[0];
405     }
406     }
407     }
408     }
409    
410     /* 指定されたクラスの開始値にリセット
411     直前の文字のクラスに縛られる */
412     int
413     key_reset(int n)
414     {
415     int i, j;
416     unsigned c;
417    
418     if (n >= 8)
419     return 1;
420     if (n == 7)
421     {
422     key[7] = 0;
423     return 1;
424     }
425    
426     /* 0-2 文字目はランダムに決める
427     3 文字目以降は初期値に */
428     if (n >= 3)
429     key[n] = key_set(n, 0);
430     else
431     key[n] = key_set(n, rand());
432    
433     #if DEBUG>=3
434     printf("key[%d]=%02X ncls=%04X\n", n, key[n], kcls[n].map[key[n]]);
435     #endif
436    
437     /* セットされた文字を元に、次キャラの文字クラスを決める */
438     #if 1
439     key_make_map(n);
440     #else
441     for (i = 0; i < 256; i++)
442     {
443     unsigned bs = 0, bm = 0;
444     unsigned c = kcls[n].map[key[n]];
445     #if 1
446     if (c & KCLS_K1)
447     bm |= ((cp932[256 * key[n] + i] & KCLS_K1)
448     || (cp932[256 * (key[n] ^ 0x80) + i] & KCLS_K1)
449     ? KCLS_K2 : 0);
450     else if (c & (KCLS_AN | KCLS_KA | KCLS_K2))
451     for (j = 0; j < 256; j++)
452     {
453     bm |= cp932[256 * i + j] & (KCLS_AN | KCLS_KA | KCLS_K1);
454     #if 0
455     if (j >= 127 && !(n == 0 || n == 1))
456     break;
457     #endif
458     }
459     kcls[n + 1].map[i] = bm;
460     #endif
461     if (i >= 128 && !(n == 0 || n == 1))
462     kcls[n + 1].map[i - 128] |= kcls[n + 1].map[i];
463     }
464    
465     if (n == 6)
466     kcls[7].map[0] |= KCLS_AN;
467     #endif
468    
469     return key_reset(n + 1);
470     }
471    
472     /* 指定された鍵空間の中で、キーをひとつ進める
473     安全にインクリメントできた場合 true を返す */
474     static
475     int
476     key_inc(int n)
477     {
478     if (n >= 8)
479     return 0;
480     else if (n == 7)
481     {
482     key[7] = (key[7] + 64) & 127;
483     if (key[7]) return 1;
484     else return 0;
485     }
486     else if (key_inc(n + 1)
487     /*
488     && key_inc(n + 1)
489     && key_inc(n + 1)
490     && key_inc(n + 1)*/
491     )
492     return 1;
493    
494     /* Salt はインクリメントしない約束にする */
495     if (n == 1 || n == 2)
496     return 1;
497    
498     #if DEBUG>=3
499     printf("key_inc(n=%d,ck=%02X)\n", n, key[n]);
500     #endif
501    
502     /* 辞書語はインクリメントしていい約束にする */
503     if (3 <= n && n < 7 && kd[n - 3])
504     {
505     if ((key[n - 3] & 0x7F) == ((kd[n - 3] + 1)->c[0] & 0x7F)
506     && (key[n - 2] & 0x7F) == ((kd[n - 3] + 1)->c[1] & 0x7F)
507     && (key[n - 1] & 0x7F) == ((kd[n - 3] + 1)->c[2] & 0x7F))
508     {
509     memcpy(&key[n - 3], &(++kd[n - 3])->c[0], 4);
510     #if DEBUG>=2
511     printf(">dt_get:%c%c%c%c(%02X%02X:%02X%02X)\n",
512     kd[n - 3]->c[0], kd[n - 3]->c[1], kd[n - 3]->c[2], kd[n - 3]->c[3],
513     kd[n - 3]->c[0], kd[n - 3]->c[1], kd[n - 3]->c[2], kd[n - 3]->c[3]);
514     #endif
515     return 1;
516     }
517     else
518     {
519     return 0;
520     }
521     }
522     else if (2 <= n && n < 6 && kd[n - 2])
523     {
524     if ((key[n - 2] & 0x7F) == ((kd[n - 2] + 1)->c[0] & 0x7F)
525     && (key[n - 1] & 0x7F) == ((kd[n - 2] + 1)->c[1] & 0x7F))
526     {
527     memcpy(&key[n - 2], &(++kd[n - 2])->c[0], 4);
528     #if DEBUG>=2
529     printf(">dt_get:%c%c%c%c(%02X%02X:%02X%02X)\n",
530     kd[n - 2]->c[0], kd[n - 2]->c[1], kd[n - 2]->c[2], kd[n - 2]->c[3],
531     kd[n - 2]->c[0], kd[n - 2]->c[1], kd[n - 2]->c[2], kd[n - 2]->c[3]);
532     #endif
533     return 1;
534     }
535     else
536     {
537     return 0;
538     }
539     if (kd[n - 2]->c[0] == key[n - 2])
540     return 1;
541     else
542     return 0;
543     }
544     else if (1 <= n && n < 5 && kd[n - 1])
545     {
546     unsigned c2 = kd[n - 1]->c[0];
547     if ((0x81 <= c2 && c2 <= 0x9F)
548     || (0xE0 <= c2 && c2 <= 0xFC))
549     {
550     kd[n - 1] = NULL;
551     #if 0
552     if (!(n == 1 && n == 2))
553     key[n] &= 0x7F;
554     if (!(n == 2 && n == 3))
555     key[n - 1] &= 0x7F;
556     #endif
557     key_make_map(n - 1);
558     }
559     else if ((key[n - 1] & 0x7F) == ((kd[n - 1] + 1)->c[0] & 0x7F))
560     {
561     memcpy(&key[n - 1], &(++kd[n - 1])->c[0], 4);
562     #if DEBUG>=2
563     printf(">dt_get:%c%c%c%c(%02X%02X:%02X%02X)\n",
564     kd[n - 1]->c[0], kd[n - 1]->c[1], kd[n - 1]->c[2], kd[n - 1]->c[3],
565     kd[n - 1]->c[0], kd[n - 1]->c[1], kd[n - 1]->c[2], kd[n - 1]->c[3]);
566     #endif
567     return 1;
568     }
569     else
570     {
571     return 0;
572     }
573     #if 0
574     if (kd[n - 1]->c[0] == key[n - 1])
575     return 1;
576     else
577     return 0;
578     #endif
579     }
580     else if (n < 4 && kd[n])
581     {
582     if (0 && kd[n]->c[0] == key[n])
583     return 1;
584     kd[n] = NULL;
585     #if 0
586     if (!(n == 1 || n == 2))
587     key[n] &= 0x7F;
588     #endif
589     }
590    
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     /* 半角カタカナの1バイト目 */
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     /* 鍵を完全にリセットする
629     Saltもセットし直す */
630     static
631     void
632     key_init()
633     {
634     int i, j;
635    
636     #if USE_DT
637     /* 辞書を、インデクスを作りながらマップにはめこんで逝く
638     辞書はコード順昇順に並んでるものとする */
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 鯖でしにそうな文字は残念ながら除外 */
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     /* インデクス */
655     if (!dtidx[c])
656     dtidx[c] = &dt[i];
657    
658     if ((0x81 <= c && c <= 0x9F)
659     || (0xE0 <= c && c <= 0xFC))
660     {
661     /* 全角なので、2バイトきまった時点で立てる */
662     cp932[256 * c + dt[i].c[1]] |= KCLS_DT1;
663     }
664     else if (0xA1 <= c && c <= 0xDF)
665     {
666     /* 半角カナ */
667     for (j = 0; j < 256; j++)
668     cp932[256 * c + j] |= KCLS_DT0;
669     }
670     }
671     /* ケツ、ちうか番人 */
672     dtidx[0x100] = &dt[i];
673     #endif
674    
675     key[8] = 0;
676    
677     /* 初期マップを組む */
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     * 可視文字列に変換
697     * n = 0, flag !=0 で呼ぶこと
698     *
699     * ptr で指される文字列は、変換に成功したら書き換えられる
700     *
701     * 成功したら flg, 失敗したら 0 を返す。
702     *
703     */
704    
705     unsigned
706     translate(unsigned char *ptr,
707     int n,
708     unsigned flag)
709     {
710     int r;
711     unsigned char buf[32];
712     unsigned s0 = (n == 1 || n == 2 ? 0x00 : 0x80);
713     unsigned s1 = (n == 0 || n == 1 ? 0x00 : 0x80);
714     unsigned c0 = ptr[n] << 8;
715     unsigned c1 = ptr[n + 1];
716     unsigned cs0 = c0 ^ (s0 << 8);
717     unsigned cs1 = c1 ^ s1;
718    
719     if (n >= 8)
720     return flag;
721    
722     if (n == 7)
723     {
724     int i;
725     /* 最後の1文字 */
726     if (!(ptr[7] & 0x7F))
727     return flag;
728    
729     for (i = 0x00; i <= 0x7E; i++)
730     {
731     if (cp932[c0 | i] & KCLS_K1)
732     {
733     ptr[8] = i;
734     return flag;
735     }
736     if (cp932[c0 | (0x80 + i)] & KCLS_K1)
737     {
738     ptr[8] = 0x80 + i;
739     return flag;
740     }
741     }
742    
743     ptr[7] ^= 0x80; c0 = ptr[7] << 8;
744     for (i = 0x00; i <= 0x7E; i++)
745     {
746     if (cp932[c0 | i] & KCLS_K1)
747     {
748     ptr[8] = i;
749     return flag;
750     }
751     if (cp932[c0 | (0x80 + i)] & KCLS_K1)
752     {
753     ptr[8] = 0x80 + i;
754     return flag;
755     }
756     }
757     ptr[7] ^= 0x80; c0 = ptr[7] << 8;
758     }
759    
760     /* K1 */
761     if (cp932[c0 | c1] & KCLS_K1)
762     {
763     r = translate(ptr, n + 2, flag);
764     if (r)
765     return r;
766     }
767     if (s0
768     && cp932[cs0 | c1] & KCLS_K1)
769     {
770     memcpy(buf, ptr, sizeof(buf));
771     buf[n] ^= s0;
772     r = translate(buf, n + 2, flag);
773     if (r)
774     {
775     memcpy(ptr, buf, sizeof(buf));
776     return r;
777     }
778     }
779     if (s1
780     && cp932[c0 | cs1] & KCLS_K1)
781     {
782     memcpy(buf, ptr, sizeof(buf));
783     buf[n + 1] ^= s1;
784     r = translate(buf, n + 2, flag);
785     if (r)
786     {
787     memcpy(ptr, buf, sizeof(buf));
788     return r;
789     }
790     }
791     if (s0 && s1
792     && cp932[cs0 | cs1] & KCLS_K1)
793     {
794     memcpy(buf, ptr, sizeof(buf));
795     buf[n] ^= s0;
796     buf[n + 1] ^= s1;
797     r = translate(buf, n + 2, flag);
798     if (r)
799     {
800     memcpy(ptr, buf, sizeof(buf));
801     return r;
802     }
803     }
804    
805     /* AN */
806     if (cp932[c0] & (KCLS_AN | KCLS_KA))
807     {
808     r = translate(ptr, n + 1, flag);
809     if (r)
810     return r;
811     }
812     if (s0 && cp932[cs0] & (KCLS_AN | KCLS_KA))
813     {
814     memcpy(buf, ptr, sizeof(buf));
815     buf[n] ^= s0;
816     r = translate(buf, n + 1, flag);
817     if (r)
818     {
819     memcpy(ptr, buf, sizeof(buf));
820     return r;
821     }
822     }
823    
824     /* KA */
825     /* KG */
826     /* KD */
827     /* AD */
828    
829     return 0;
830     }
831    
832     /***************************************************************
833     *
834     * Salt のセット
835     * オペランドのオフセットを書き換えて回ってるので注意
836     *
837     */
838    
839     void
840     set_salt(signed char *code,
841     unsigned char const *k)
842     {
843     int i, j;
844    
845     for (i = 0; i < 2; i++)
846     {
847     unsigned s = k[1 + i] & 255;
848     if (s > 'z')
849     s = 0;
850     else if (s >= 'a')
851     s = s - 'a' + 2 + 10 + 26;
852     else if (s >= 'A')
853     s = s - 'A' + 2 + 10;
854     else if (s >= '.')
855     s = s - '.';
856     else
857     s = 0;
858    
859     #if DEBUG>=1
860     printf("Salt %d:%3o\n", i, s & 63);
861     #endif
862     for (j = 0; j < 6; j++)
863     {
864     #if DEBUG>=2
865     printf("Salt %d:%d %+3d:%+3d",
866     i, j,
867     code[loo - crypt64_sta + los[6 * i + j ]],
868     code[loo - crypt64_sta + los[6 * i + j + 24]]);
869     #endif
870     if (s & (1 << j))
871     {
872     code[loo - crypt64_sta + los[6 * i + j ]] = 8 * ((4 * i + j + 15) & 31) - 128;
873     code[loo - crypt64_sta + los[6 * i + j + 24]] = 8 * ((4 * i + j - 1) & 31) - 128;
874     }
875     else
876     {
877     code[loo - crypt64_sta + los[6 * i + j ]] = 8 * ((4 * i + j - 1) & 31) - 128;
878     code[loo - crypt64_sta + los[6 * i + j + 24]] = 8 * ((4 * i + j + 15) & 31) - 128;
879     }
880     code[loo - crypt64_sta + los[6 * i + j + 12]] = 8 * ((4 * i + j + 7) & 31) - 128;
881     code[loo - crypt64_sta + los[6 * i + j + 36]] = 8 * ((4 * i + j + 23) & 31) - 128;
882     #if DEBUG>=2
883     printf(" => %+3d:%+3d\n",
884     code[loo - crypt64_sta + los[6 * i + j ]],
885     code[loo - crypt64_sta + los[6 * i + j + 24]]);
886     #endif
887     }
888     }
889     }
890    
891     /***************************************************************
892     *
893     * オペコードを展開
894     *
895     * op
896     * 0x6F MOVQ
897     * 0x7F STORE
898     * 0xDB PAND
899     * 0xDF PANDN
900     * 0xEB POR
901     * 0xEF PXOR
902     *
903     * r EAX, ECX, EDX, EBX
904     * ESP, EBP, ESI, EDI
905     *
906     */
907    
908     static
909     signed char *
910     reg_op(signed char *pc,
911     unsigned op,
912     unsigned d,
913     unsigned s)
914     {
915     pc[0] = 0x0F;
916     pc[1] = op;
917     /* 11 ddd sss */
918     pc[2] = (0300
919     | ((d << 3) & 0070)
920     | (s & 0007));
921     return pc + 3;
922     }
923    
924     static
925     signed char *
926     reg_mem(signed char *pc,
927     unsigned op,
928     unsigned d,
929     unsigned s,
930     long ofs)
931     {
932     pc[0] = 0x0F;
933     pc[1] = op;
934     if (-128 <= ofs && ofs <= 127)
935     {
936     /* short ofs
937     01 ddd sss [ofs.b] */
938     pc[2] = (0100
939     | ((d << 3) & 0070)
940     | (s & 0007));
941     pc[3] = ofs;
942     return pc + 4;
943     }
944     else
945     {
946     /* long ofs
947     10 ddd sss [ofs.l] */
948     pc[2] = (0200
949     | ((d << 3) & 0070)
950     | (s & 0007));
951     *(long *)&pc[3] = ofs;
952     return pc + 7;
953     }
954     }
955    
956     /***************************************************************
957     *
958     * 与えられた式を解析・命令生成
959     *
960     * ^ 先頭固定
961     * $ 末尾固定
962     * ? 任意の1文字
963     * * 任意の0文字以上
964     * & 大小区別ナシ、グループに使われた場合、capitalize
965     * () グループ化
966     * \s or
967     * \1 一致したグループ(実体)
968     * $(fn) テキストを展開(グループはクラスとして扱われる)
969     *
970     * 以下、クラス展開のメタキャラ
971     * [A-Z] 文字クラス定義 ^ は排他
972     * {} 0文字以上
973     * {n} n文字
974     * {n,} n文字以上
975     * {,n} n文字以下
976     * {m,n} m-n文字
977     *
978     */
979    
980     static
981     int
982     cv64(int c)
983     {
984     if ('.' <= c && c <= '/')
985     return c - '.';
986     else if ('0' <= c && c <= '9')
987     return c - '0' + 2;
988     else if ('A' <= c && c <= 'Z')
989     return c - 'A' + 2 + 10;
990     else if ('a' <= c && c <= 'z')
991     return c - 'a' + 2 + 10 + 26;
992     else
993     return -1;
994     }
995    
996     static
997     int
998     expr_make(signed char *iptr,
999     int ofs,
1000     char const *expr,
1001     int len)
1002     {
1003     /* 先頭制約 */
1004     signed char *o_iptr = iptr;
1005     unsigned op = 0x6F;
1006     int i;
1007    
1008     if (expr[0] == '^')
1009     {
1010     if (len == 0 || ofs > 0)
1011     return -1;
1012     expr++;
1013     len--;
1014     }
1015    
1016     /* 一文字づつ展開 */
1017     for (i = 0; i < len; i++)
1018     {
1019     int c = expr[i];
1020    
1021     if (c == '$')
1022     {
1023     assert(op != 0x6F);
1024     if (ofs < 10)
1025     return 0;
1026     else if (ofs > 10)
1027     return -1;
1028     return iptr - o_iptr;
1029     }
1030    
1031     if (ofs >= 10)
1032     return -1;
1033    
1034     if (c == '[')
1035     {
1036     /* クラスをまとめる */
1037     unsigned oop; /* MOVQ */
1038     int j;
1039     int cs[64];
1040     memset(cs, 0, 64 * sizeof(int));
1041     for (i++; c = expr[i], c != ']'; i++)
1042     {
1043     c = cv64(c);
1044     if (c < 0)
1045     return -1;
1046     if (expr[i + 1] == '-')
1047     {
1048     int ce = cv64(expr[i + 2]);
1049     if (ce < 0)
1050     return -1;
1051     while (c <= ce)
1052     cs[c++]++;
1053     i += 2;
1054     }
1055     else
1056     cs[c]++;
1057     }
1058     assert(c == ']');
1059    
1060     /* マップされたモノから命令を生成する */
1061     oop = 0x6F; /* MOVQ */
1062     for (j = 0; j < 64; j++)
1063     if (cs[j])
1064     {
1065     if (ofs == 9 && (j & 3))
1066     continue;
1067     iptr = reg_mem(iptr,
1068     oop,
1069     1, /* MM1 */
1070     5, /* EBP */
1071     8 * (64 * ofs + j) + 8 * 32 - 8 * 16);
1072     oop = 0xEB;
1073     }
1074     if (oop != 0xEB)
1075     {
1076     if (ofs == 9)
1077     return -1;
1078     }
1079     else
1080     {
1081     iptr = reg_op(iptr,
1082     op,
1083     0, /* MM0 */
1084     1); /* MM1 */
1085     op = 0xDB;
1086     }
1087     ofs++;
1088     }
1089     else if (c == '?')
1090     {
1091     ofs++;
1092     }
1093     else if ((c = cv64(c)) >= 0)
1094     {
1095     if (ofs == 9 && (c & 3))
1096     return -1;
1097     iptr = reg_mem(iptr,
1098     op,
1099     0, /* MM0 */
1100     5, /* EBP */
1101     8 * (64 * ofs + c) + 8 * 32 - 8 * 16);
1102     op = 0xDB;
1103     ofs++;
1104     }
1105     else
1106     return -1;
1107     }
1108    
1109     return iptr - o_iptr;
1110     }
1111     /*
1112     Fighters ^FIGHTERS ^BayStars ^Red[Ss]tar/ ^REDSTAR/ ^Parsifal ^VALKYRIE ^Valkyrie
1113     ^Dr.Death ^IamCHONO ^RAGNAROK ^MARAOH.. ^MARAOH// ......... God[Ff]ather GODFATHER
1114     ^maraGULO[./] BLACKJACK ^[Bb]lackjack ^BlackJack [Pp]atagonia PATAGONIA ^JC.PENNEY
1115     ^JC.Penney ^syombolic ROCKNROLL stammerB4U Ms.Erie.W. MARA.w/w/w R3[0-4]SKYLINE
1116     100000[Gg]et. 100000GET.
1117     */
1118     signed char *
1119     expr_parse(signed char *iptr,
1120     int codesiz_limit,
1121     char const *expr)
1122     {
1123     char expr_buf[65536 + 1];
1124     FILE *fp;
1125     size_t sz;
1126    
1127     /* ファイルを読み込む
1128     この版では手抜きで 64K 制限 */
1129     #define TARGET_SIZ 65536
1130     fp = fopen("target.txt", "rb");
1131     memset(expr_buf, 0, TARGET_SIZ + 1);
1132     sz = fread(expr_buf, sizeof(char), TARGET_SIZ, fp);
1133     fclose(fp);
1134    
1135     /* XXX ターゲットのサイズをチェック */
1136     if (sz == TARGET_SIZ)
1137     {
1138     /* トークンのトラバース */
1139     char *ds, *pe, *ps;
1140     for (ds = &expr_buf[TARGET_SIZ - 1];
1141     !isspace(*ds);
1142     ds--)
1143     assert(ds >= expr_buf);
1144     for (pe = ds++; isspace(*pe); pe--)
1145     assert(pe >= expr_buf);
1146     for (ps = pe++; !isspace(*ps); ps--)
1147     assert(ps >= expr_buf);
1148     fprintf(stderr, "WARNING: <");
1149     ps++;
1150     while (ps < pe)
1151     fputc(*ps++, stderr);
1152     fprintf(stderr, ">より後ろのターゲット<%s(ry>はオ�ル\n",
1153     ds);
1154     *pe = 0;
1155     }
1156    
1157     /* PXOR MM7,MM7 */
1158     iptr = reg_op(iptr, 0xEF, 7, 7);
1159    
1160     /* 順繰りに parse */
1161     expr = expr_buf;
1162     while (expr[0])
1163     {
1164     char const *p;
1165     int i;
1166    
1167     /* 頭の Whitespace を読み飛ばす */
1168     while (isspace(expr[0]))
1169     expr++;
1170    
1171     if (!expr[0])
1172     break;
1173    
1174     /* トークンを切り出す */
1175     for (p = expr; expr[0] && !isspace(expr[0]); expr++)
1176     ;
1177    
1178     /* 展開する */
1179     for (i = 0; i < 10; i++)
1180     {
1181     int n = expr_make(iptr, i, p, expr - p);
1182     if (n < 0)
1183     break;
1184     #if DEBUG>=1
1185     if (n > 0)
1186     {
1187     int j;
1188     for (j = 0; &p[j] < expr; j++)
1189     putchar(p[j]);
1190     printf(": of=%d len=%d\n", i, expr - p);
1191     }
1192     #endif
1193     if (n > 0)
1194     iptr = reg_op(iptr + n,
1195     0xEB,
1196     7,
1197     0);
1198     }
1199     }
1200    
1201     return reg_mem(iptr,
1202     0x7F,
1203     7,
1204     5,
1205     8 * 31 - 8 * 16);
1206     }
1207    
1208     static
1209     unsigned long
1210     usec()
1211     {
1212     #ifdef __GNUC__
1213     struct timeval tv;
1214     gettimeofday(&tv, NULL);
1215     return 100 * tv.tv_sec + (tv.tv_usec / 10000);
1216     #else
1217     struct timeb tm;
1218     ftime(&tm);
1219     return 100 * tm.time + tm.millitm / 10;
1220     #endif
1221     }
1222    
1223     /***************************************************************
1224     *
1225     * メインループとか
1226     *
1227     */
1228    
1229     /* 定数項 */
1230     static struct SLICE const sk6[] =
1231     {
1232     {0xAAAAAAAAUL, 0xAAAAAAAAUL},
1233     {0xCCCCCCCCUL, 0xCCCCCCCCUL},
1234     {0xF0F0F0F0UL, 0xF0F0F0F0UL},
1235     {0xFF00FF00UL, 0xFF00FF00UL},
1236     {0xFFFF0000UL, 0xFFFF0000UL},
1237     {0x00000000UL, 0xFFFFFFFFUL},
1238     };
1239    
1240     #ifndef __GNUC__
1241     //typedef int (__msfastcall *CRYPT64_PP)(unsigned long const *k, unsigned long *lr);
1242     typedef int (*CRYPT64_PP)(unsigned long const *k, unsigned long *lr);
1243     #endif
1244    
1245     int dmy;
1246    
1247     struct KEY key64;
1248     struct PARAM param64;
1249    
1250     int
1251     main(int argc, char *argv[])
1252     {
1253     int i, j;
1254     int lc;
1255     int mincnt;
1256 chapuni 2 signed char *code = NULL;
1257 chapuni 1 FILE *ofp;
1258     int n_iter;
1259     int cr;
1260    
1261     #define N_TS 4
1262     struct
1263     {
1264     unsigned t;
1265     int c;
1266     } ts[N_TS];
1267    
1268     #ifndef __GNUC__
1269     CRYPT64_PP d_crypt64;
1270     #endif
1271    
1272     #if 0
1273     if (argc < 2)
1274     {
1275     fprintf(stderr, "式きぼんぬ\n");
1276     return 1;
1277     }
1278     #endif
1279    
1280     /* t[16] は、内部演算で使用する、all 1 が入っている */
1281     param64.t[16].a[0] = param64.t[16].a[1] = 0xFFFFFFFFUL;
1282    
1283     /* 固定キーのコピー */
1284     for (i = 0; i < 6; i++)
1285     {
1286     int o = tr_pc1[7][6 - i] - 1;
1287     if (o < 28)
1288     {
1289     key64.k[0][0][o] = key64.k[0][1][o] = sk6[i];
1290     }
1291     else
1292     {
1293     o -= 28;
1294     key64.k[1][0][o] = key64.k[1][1][o] = sk6[i];
1295     }
1296     }
1297    
1298     /* Saltを加味しない場合は、コード領域を
1299     writable 領域に展開しなくてもよい。
1300     [XXX] OSによっては、書込&実行可能領域を専用のサーヴィスで
1301     取得しなければならないものもあるかもしれないので、注意 */
1302     #ifdef __WIN32
1303     HANDLE h = CreateFileMapping(INVALID_HANDLE_VALUE,
1304     NULL,
1305     PAGE_EXECUTE_READWRITE,
1306     0, 0x20000000,
1307     NULL);
1308 chapuni 2 if (SUCCEEDED(h))
1309     code = (signed char *)MapViewOfFile(h,
1310     SECTION_MAP_EXECUTE | FILE_MAP_WRITE,
1311     0, 0x10000000,
1312     0);
1313    
1314 chapuni 1 #else
1315     code = (signed char *)mmap(NULL,
1316     0x10000000,
1317     PROT_EXEC | PROT_READ | PROT_WRITE,
1318     MAP_PRIVATE | MAP_ANONYMOUS,
1319     1, /* fd */
1320     0);
1321 chapuni 2 if ((void *)code == MAP_FAILED)
1322     code =NULL;
1323 chapuni 1 #endif
1324 chapuni 2
1325     /* メモリが確保できていない場合のいんちき対策 */
1326     if (code == NULL)
1327     code = (signed char *)malloc(crypt64_end - crypt64_sta + 1024 * 1024);
1328     assert(code != NULL);
1329    
1330     /* Prologue を展開 */
1331 chapuni 1 memcpy(code, crypt64_sta, crypt64_end - crypt64_sta);
1332     #ifndef __GNUC__
1333     d_crypt64 = (CRYPT64_PP)code;
1334     #endif
1335     memcpy(expr_parse(code + (crypt64_end - crypt64_sta),
1336     1024 * 1024 - (crypt64_ep_end - crypt64_ep),
1337     argv[1]),
1338     crypt64_ep,
1339     crypt64_ep_end - crypt64_ep);
1340    
1341     /* キーの初期化 */
1342     srand(time(NULL));
1343     key_init();
1344     set_salt(code, key);
1345     for (i = 0; i < 8; i++)
1346     key_set64(&key64, i, okey[i] = key[i], 0, 0x7F);
1347    
1348     #if DEBUG>=1
1349     printf("key=%p param=%p\n", &key64, &param64);
1350     #endif
1351     assert(!((unsigned)&key64 & 7));
1352     assert(!((unsigned)&param64 & 7));
1353    
1354     if ((ofp = fopen("log.txt", "at")) != NULL)
1355     setvbuf(ofp, NULL, _IOLBF, BUFSIZ);
1356    
1357     for (i = 0; i < N_TS; i++)
1358     ts[i].t = ts[i].c = 0;
1359    
1360     mincnt = 0x7FFFFFFF;
1361     n_iter = 0;
1362     cr = 0;
1363     /* 探索ループだぞっと */
1364     for (;;)
1365     {
1366     int cnt;
1367     int k, kk;
1368    
1369     /* 鍵のセット */
1370     #if 1
1371     for (i = 0; i < 8; i++)
1372     {
1373     key_set64(&key64, i, key[i], key[i] ^ okey[i], 0);
1374     okey[i] = key[i];
1375     }
1376     #if 0
1377     for (j = 0; j < 7; j++)
1378     {
1379     int o = tr_pc1[i][6 - j] - 1;
1380     if (i == 7 && j < 6) continue;
1381     if (o < 28)
1382     {
1383     assert(o >= 0);
1384     key64.k[0][0][o].a[0]
1385     = key64.k[0][0][o].a[1]
1386     = key64.k[0][1][o].a[0]
1387     = key64.k[0][1][o].a[1]
1388     = -!!(key[i] & (1 << j));
1389     }
1390     else
1391     {
1392     assert(o >= 28);
1393     assert(o < 56);
1394     key64.k[1][0][o - 28].a[0]
1395     = key64.k[1][0][o - 28].a[1]
1396     = key64.k[1][1][o - 28].a[0]
1397     = key64.k[1][1][o - 28].a[1]
1398     = -!!(key[i] & (1 << j));
1399     }
1400     }
1401     #endif
1402     #endif
1403    
1404     /* まずは LR を初期化 */
1405     //memset(param64.lr, 0, sizeof(param64.lr));
1406     /* 呼ぶ! */
1407     #ifdef __GNUC__
1408     asm volatile("call *%3"
1409     : "=a"(cnt)
1410     : "c"(key64.k), "d"(param64.lr), "m"(code)
1411     //: "c"(key64.k), "d"(param64.lr), "m"(crypt64_sta)
1412     : "memory");
1413     #else
1414     cnt = (*d_crypt64)(key64.k[0][0][0].a, param64.lr[0][0].a);
1415     #endif
1416     if (mincnt > cnt && cnt > 0)
1417     {
1418     mincnt = cnt;
1419     if (cr)
1420     fprintf(stderr, "\n");
1421     cr = 0;
1422     fprintf(stderr, "cycle=%d\n", cnt);
1423     }
1424     /* XXX 手抜きのため、ワークにはみ出ている2ビットを落とす */
1425     memset(param64.t[0].a, 0, 2 * 8);
1426    
1427     /* ヒットしたときの処理 */
1428     for (kk = 0; kk < 2; kk++)
1429     {
1430     unsigned t;
1431     //continue;/*XXX*/
1432     t = param64.t[31].a[kk];
1433     #if 1
1434     if (!t)
1435     continue;
1436     #endif
1437     for (k = 0; k < 32; k++)
1438     {
1439     char hash[16];
1440     unsigned char buf[32];
1441     #if 1
1442     if (!(t & (1 << k)))
1443     continue;
1444     #endif
1445     for (i = 1; i < 11; i++)
1446     {
1447     unsigned c = 0;
1448     for (j = 0; j < 6; j++)
1449     c = (c << 1) | !!(param64.lr[0][tr_fp[6 * i + j]].a[kk] & (1 << k));
1450     hash[i - 1] = c["./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"];
1451     }
1452     hash[10] = 0;
1453    
1454     memcpy(buf, key, 32);
1455     buf[8] = buf[9] = 0;
1456     buf[7] = (buf[7] & 0x40) + 32 * kk + k;
1457     if (translate(buf, 0, 1))
1458     {
1459     if (cr)
1460     fprintf(stderr, "\n");
1461     cr = 0;
1462     printf("◆%s #%-10.10s(%02X %02X %02X %02X %02X %02X %02X %02X/%02X)\n",
1463     hash,
1464     buf,
1465     buf[0], buf[1], buf[2], buf[3],
1466     buf[4], buf[5], buf[6], buf[7],
1467     buf[8]);
1468     if (ofp)
1469     fprintf(ofp,
1470     "◆%s #%-10.10s(%02X %02X %02X %02X %02X %02X %02X %02X/%02X)\n",
1471     hash,
1472     buf,
1473     buf[0], buf[1], buf[2], buf[3],
1474     buf[4], buf[5], buf[6], buf[7],
1475     buf[8]);
1476     }
1477     else
1478     {
1479     #if DEBUG>=1
1480     if (cr)
1481     fprintf(stderr, "\n");
1482     cr = 0;
1483     printf("◆%s (%02X %02X %02X %02X %02X %02X %02X %02X )\n",
1484     hash,
1485     buf[0], buf[1], buf[2], buf[3],
1486     buf[4], buf[5], buf[6], buf[7]);
1487     if (ofp)
1488     fprintf(ofp,
1489     "◆%s (%02X %02X %02X %02X %02X %02X %02X %02X )\n",
1490     hash,
1491     buf[0], buf[1], buf[2], buf[3],
1492     buf[4], buf[5], buf[6], buf[7]);
1493     #endif
1494     }
1495     }
1496     }
1497    
1498     if (++n_iter - ts[0].c >= 8192)
1499     {
1500     int t = usec();
1501     if (ts[N_TS - 1].c)
1502     {
1503     int a = 100 * 64 * (n_iter - ts[N_TS - 1].c) / (t - ts[N_TS - 1].t);
1504     fprintf(stderr,
1505     "%8d.%03d(ktrips/sec)\r",
1506     a / 1000,
1507     a % 1000);
1508     cr++;
1509     }
1510     for (i = N_TS - 1; i >= 1; i--)
1511     ts[i] = ts[i - 1];
1512     ts[0].c = n_iter;
1513     ts[0].t = t;
1514     for (i = 1; i < N_TS; i++)
1515     if (ts[i].c)
1516     break;
1517     else
1518     ts[i] = ts[i - 1];
1519     }
1520     #if 1
1521     if (!key_inc(3))
1522     {
1523     #if DEBUG>=2
1524     printf("********************************\n");
1525     #endif
1526     key_reset(0);
1527     set_salt(code, key);
1528     for (i = 0; i < 8; i++)
1529     key_set64(&key64, i, okey[i] = key[i], 0, 0x7F);
1530     }
1531     #endif
1532     }
1533    
1534     return 0;
1535     }
1536    
1537 chapuni 2 /*
1538     * Local Variables:
1539     * tab-width: 4
1540     * End:
1541     *
1542     * EOF */

Properties

Name Value
svn:eol-style native

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