Develop and Download Open Source Software

Browse Subversion Repository

Contents of /branches/mty-makai/mty.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations) (download) (as text)
Thu Mar 1 14:32:05 2007 UTC (17 years, 1 month ago) by chapuni
Original Path: mty/mty.c
File MIME type: text/x-csrc
File size: 29732 byte(s)
John由来の x86-mmx.S をくっつけてみた。
1 /***********************************************************************
2 *
3 * file: mty.cpp
4 *
5 * ‚Ü‚ A‘҂ĉŽ
6 *
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 #include <sys/time.h>
24 #endif
25
26 #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 /* ŒŽ“]’u 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ĹI“]’u */
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ƒrƒbƒg•Ş */
63 struct SLICE
64 {
65 unsigned long a[2];
66 };
67
68 /* crypt64() ‚Ş‹ň‚¤ƒpƒ‰ƒ[ƒ^ */
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 ‚ƁA‚ť‚ĚƒRƒs[‚Ş•K—v */
78 struct KEY
79 {
80 struct SLICE k[2][2][28];
81 };
82
83 /* ŠżŽšƒNƒ‰ƒX•\ */
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 /* ŒŽƒNƒ‰ƒX */
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 /* ŒŽƒLƒ—pŽŤ‘ƒCƒ“ƒfƒNƒX */
108 struct DT *kd[8 + 8];
109
110 /* ŽŤ‘ƒCƒ“ƒfƒNƒX */
111 struct DT *dtidx[0x100 + 1];
112 #endif
113
114 /* Žw’肳‚ę‚˝ƒNƒ‰ƒX‚Ć“ü‚Á‚Ä‚˘‚éƒL[‚Š‚çAclassify ‚đs‚¤ */
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 /* ŽŤ‘‚ĚƒPƒc‚Ě•śŽšBŒă‚ë‚Ƀiƒjƒ„ƒ‰ƒLƒƒƒ‰ƒNƒ^‚Ş—ˆ‚é */
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•śŽš‚đE‚Á‚Ä‚˘‚Ť‚܂ */
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 /* ƒJƒ^ƒJƒi–„‚ߍž‚Ý‚˘‚Ť‚Ü‚ˇ */
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 ‚đśŹ‚ˇ‚é•K—vƒiƒV */
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 /* ƒ}ƒbƒv‚Š‚ç•śŽš‚đE‚Á‚ăZƒbƒg */
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 ‚đƒZƒbƒg */
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 /* ƒZƒbƒg */
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 /* Žw’肳‚ę‚˝ƒNƒ‰ƒX‚ĚŠJŽn’l‚ÉƒŠƒZƒbƒg
411 ’ź‘O‚Ě•śŽš‚ĚƒNƒ‰ƒX‚É”›‚ç‚ę‚é */
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 •śŽš–ÚˆČ~‚͏‰Šú’l‚É */
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 /* ƒZƒbƒg‚ł‚ę‚˝•śŽš‚đŒł‚ÉAŽŸƒLƒƒƒ‰‚Ě•śŽšƒNƒ‰ƒX‚đŒˆ‚ß‚é */
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 /* Žw’肳‚ę‚˝ŒŽ‹óŠÔ‚Ě’†‚ŁAƒL[‚đ‚ЂƂi‚ß‚é
473 ˆŔ‘S‚ɃCƒ“ƒNƒŠƒƒ“ƒg‚Ĺ‚Ť‚˝ę‡ 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 ‚̓Cƒ“ƒNƒŠƒƒ“ƒg‚ľ‚Č‚˘–ń‘Ђɂˇ‚é */
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 /* ŽŤ‘Œę‚̓Cƒ“ƒNƒŠƒƒ“ƒg‚ľ‚Ä‚˘‚˘–ń‘Ђɂˇ‚é */
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 /* ”źŠ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 * ‰ÂŽ‹•śŽš—ń‚ɕϊˇ
697 * n = 0, flag !=0 ‚ĹŒÄ‚Ô‚ą‚Ć
698 *
699 * ptr ‚ĹŽw‚ł‚ę‚é•śŽš—ń‚́A•ĎŠˇ‚ÉŹŒ÷‚ľ‚˝‚珑‚ŤŠˇ‚Ś‚ç‚ę‚é
700 *
701 * ŹŒ÷‚ľ‚˝‚ç flg, ޏ”s‚ľ‚˝‚ç 0 ‚đ•Ô‚ˇB
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 ‚ĚƒZƒbƒg
835 * ƒIƒyƒ‰ƒ“ƒh‚ĚƒIƒtƒZƒbƒg‚đ‘‚ŤŠˇ‚ڂĉń‚Á‚Ä‚é‚̂ŒˆÓ
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 * ƒIƒyƒR[ƒh‚đ“WŠJ
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 * —^‚Ś‚ç‚ę‚˝ŽŽ‚đ‰đÍE–˝—ߐśŹ
959 *
960 * ^ ć“ŞŒĹ’č
961 * $ ––”öŒĹ’č
962 * ? ”CˆÓ‚Ě1•śŽš
963 * * ”CˆÓ‚Ě0•śŽšˆČă
964 * & ‘召‹ć•ĘƒiƒVAƒOƒ‹[ƒv‚ÉŽg‚í‚ę‚˝ę‡Acapitalize
965 * () ƒOƒ‹[ƒv‰ť
966 * \s or
967 * \1 ˆę’v‚ľ‚˝ƒOƒ‹[ƒv(ŽŔ‘Ě)
968 * $(fn) ƒeƒLƒXƒg‚đ“WŠJ(ƒOƒ‹[ƒv‚̓Nƒ‰ƒX‚Ć‚ľ‚Ĉľ‚í‚ę‚é)
969 *
970 * ˆČ‰şAƒNƒ‰ƒX“WŠJ‚Ěƒƒ^ƒLƒƒƒ‰
971 * [A-Z] •śŽšƒNƒ‰ƒX’č‹` ^ ‚Í”r‘ź
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 /* ˆę•śŽš‚“WŠJ */
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 /* ƒNƒ‰ƒX‚đ‚܂Ƃ߂é */
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 /* ƒ}ƒbƒv‚ł‚ę‚˝ƒ‚ƒm‚Š‚ç–˝—ß‚đśŹ‚ˇ‚é */
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 /* ƒtƒ@ƒCƒ‹‚đ“ǂݍž‚Ţ
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 ƒ^[ƒQƒbƒg‚ĚƒTƒCƒY‚đƒ`ƒFƒbƒN */
1136 if (sz == TARGET_SIZ)
1137 {
1138 /* ƒg[ƒNƒ“‚Ěƒgƒ‰ƒo[ƒX */
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, ">‚ć‚čŒă‚ë‚Ěƒ^[ƒQƒbƒg<%s(ry>‚̓I‡hƒ‹\n",
1153 ds);
1154 *pe = 0;
1155 }
1156
1157 /* PXOR MM7,MM7 */
1158 iptr = reg_op(iptr, 0xEF, 7, 7);
1159
1160 /* ‡ŒJ‚č‚É 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 /* ƒg[ƒNƒ“‚đŘ‚čo‚ˇ */
1175 for (p = expr; expr[0] && !isspace(expr[0]); expr++)
1176 ;
1177
1178 /* “WŠJ‚ˇ‚é */
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 * ƒƒCƒ“ƒ‹[ƒv‚Ć‚Š
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 signed char *code;
1257 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] ‚́A“ŕ•”‰‰ŽZ‚ĹŽg—p‚ˇ‚éAall 1 ‚Ş“ü‚Á‚Ä‚˘‚é */
1281 param64.t[16].a[0] = param64.t[16].a[1] = 0xFFFFFFFFUL;
1282
1283 /* ŒĹ’čƒL[‚ĚƒRƒs[ */
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‚đ‰Á–Ą‚ľ‚Č‚˘ę‡‚́AƒR[ƒh—Ěˆć‚đ
1299 writable —Ěˆć‚É“WŠJ‚ľ‚Č‚­‚Ä‚ŕ‚悢B
1300 [XXX] OS‚É‚ć‚Á‚ẮA‘ž&ŽŔs‰Â”\—Ěˆć‚đę—p‚ĚƒT[ƒ”ƒBƒX‚Ĺ
1301 Žć“ž‚ľ‚Ȃ݂ę‚΂Ȃç‚Č‚˘‚ŕ‚Ě‚ŕ‚ ‚邊‚ŕ‚ľ‚ę‚Č‚˘‚̂ŁA’ˆÓ */
1302 #ifdef __WIN32
1303 HANDLE h = CreateFileMapping(INVALID_HANDLE_VALUE,
1304 NULL,
1305 PAGE_EXECUTE_READWRITE,
1306 0, 0x20000000,
1307 NULL);
1308 assert(SUCCEEDED(h));
1309 code = (signed char *)MapViewOfFile(h,
1310 SECTION_MAP_EXECUTE | FILE_MAP_WRITE,
1311 0, 0x10000000,
1312 0);
1313 assert(code);
1314 #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 if ((void *)code == MAP_FAILED) perror(argv[0]);
1322 #endif
1323 memcpy(code, crypt64_sta, crypt64_end - crypt64_sta);
1324 #ifndef __GNUC__
1325 d_crypt64 = (CRYPT64_PP)code;
1326 #endif
1327 memcpy(expr_parse(code + (crypt64_end - crypt64_sta),
1328 1024 * 1024 - (crypt64_ep_end - crypt64_ep),
1329 argv[1]),
1330 crypt64_ep,
1331 crypt64_ep_end - crypt64_ep);
1332
1333 /* ƒL[‚̏‰Šú‰ť */
1334 srand(time(NULL));
1335 key_init();
1336 set_salt(code, key);
1337 for (i = 0; i < 8; i++)
1338 key_set64(&key64, i, okey[i] = key[i], 0, 0x7F);
1339
1340 #if DEBUG>=1
1341 printf("key=%p param=%p\n", &key64, &param64);
1342 #endif
1343 assert(!((unsigned)&key64 & 7));
1344 assert(!((unsigned)&param64 & 7));
1345
1346 if ((ofp = fopen("log.txt", "at")) != NULL)
1347 setvbuf(ofp, NULL, _IOLBF, BUFSIZ);
1348
1349 for (i = 0; i < N_TS; i++)
1350 ts[i].t = ts[i].c = 0;
1351
1352 mincnt = 0x7FFFFFFF;
1353 n_iter = 0;
1354 cr = 0;
1355 /* ’Tőƒ‹[ƒv‚ž‚ź‚Á‚Ć */
1356 for (;;)
1357 {
1358 int cnt;
1359 int k, kk;
1360
1361 /* ŒŽ‚ĚƒZƒbƒg */
1362 #if 1
1363 for (i = 0; i < 8; i++)
1364 {
1365 key_set64(&key64, i, key[i], key[i] ^ okey[i], 0);
1366 okey[i] = key[i];
1367 }
1368 #if 0
1369 for (j = 0; j < 7; j++)
1370 {
1371 int o = tr_pc1[i][6 - j] - 1;
1372 if (i == 7 && j < 6) continue;
1373 if (o < 28)
1374 {
1375 assert(o >= 0);
1376 key64.k[0][0][o].a[0]
1377 = key64.k[0][0][o].a[1]
1378 = key64.k[0][1][o].a[0]
1379 = key64.k[0][1][o].a[1]
1380 = -!!(key[i] & (1 << j));
1381 }
1382 else
1383 {
1384 assert(o >= 28);
1385 assert(o < 56);
1386 key64.k[1][0][o - 28].a[0]
1387 = key64.k[1][0][o - 28].a[1]
1388 = key64.k[1][1][o - 28].a[0]
1389 = key64.k[1][1][o - 28].a[1]
1390 = -!!(key[i] & (1 << j));
1391 }
1392 }
1393 #endif
1394 #endif
1395
1396 /* ‚Ü‚¸‚Í LR ‚đ‰Šú‰ť */
1397 //memset(param64.lr, 0, sizeof(param64.lr));
1398 /* ŒÄ‚Ô! */
1399 #ifdef __GNUC__
1400 asm volatile("call *%3"
1401 : "=a"(cnt)
1402 : "c"(key64.k), "d"(param64.lr), "m"(code)
1403 //: "c"(key64.k), "d"(param64.lr), "m"(crypt64_sta)
1404 : "memory");
1405 #else
1406 cnt = (*d_crypt64)(key64.k[0][0][0].a, param64.lr[0][0].a);
1407 #endif
1408 if (mincnt > cnt && cnt > 0)
1409 {
1410 mincnt = cnt;
1411 if (cr)
1412 fprintf(stderr, "\n");
1413 cr = 0;
1414 fprintf(stderr, "cycle=%d\n", cnt);
1415 }
1416 /* XXX Žč”˛‚Ť‚Ě‚˝‚߁Aƒ[ƒN‚ɂ͂ݏo‚Ä‚˘‚é2ƒrƒbƒg‚𗎂Ƃˇ */
1417 memset(param64.t[0].a, 0, 2 * 8);
1418
1419 /* ƒqƒbƒg‚ľ‚˝‚Ć‚Ť‚̏ˆ— */
1420 for (kk = 0; kk < 2; kk++)
1421 {
1422 unsigned t;
1423 //continue;/*XXX*/
1424 t = param64.t[31].a[kk];
1425 #if 1
1426 if (!t)
1427 continue;
1428 #endif
1429 for (k = 0; k < 32; k++)
1430 {
1431 char hash[16];
1432 unsigned char buf[32];
1433 #if 1
1434 if (!(t & (1 << k)))
1435 continue;
1436 #endif
1437 for (i = 1; i < 11; i++)
1438 {
1439 unsigned c = 0;
1440 for (j = 0; j < 6; j++)
1441 c = (c << 1) | !!(param64.lr[0][tr_fp[6 * i + j]].a[kk] & (1 << k));
1442 hash[i - 1] = c["./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"];
1443 }
1444 hash[10] = 0;
1445
1446 memcpy(buf, key, 32);
1447 buf[8] = buf[9] = 0;
1448 buf[7] = (buf[7] & 0x40) + 32 * kk + k;
1449 if (translate(buf, 0, 1))
1450 {
1451 if (cr)
1452 fprintf(stderr, "\n");
1453 cr = 0;
1454 printf("Ÿ%s #%-10.10s(%02X %02X %02X %02X %02X %02X %02X %02X/%02X)\n",
1455 hash,
1456 buf,
1457 buf[0], buf[1], buf[2], buf[3],
1458 buf[4], buf[5], buf[6], buf[7],
1459 buf[8]);
1460 if (ofp)
1461 fprintf(ofp,
1462 "Ÿ%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 }
1469 else
1470 {
1471 #if DEBUG>=1
1472 if (cr)
1473 fprintf(stderr, "\n");
1474 cr = 0;
1475 printf("Ÿ%s (%02X %02X %02X %02X %02X %02X %02X %02X )\n",
1476 hash,
1477 buf[0], buf[1], buf[2], buf[3],
1478 buf[4], buf[5], buf[6], buf[7]);
1479 if (ofp)
1480 fprintf(ofp,
1481 "Ÿ%s (%02X %02X %02X %02X %02X %02X %02X %02X )\n",
1482 hash,
1483 buf[0], buf[1], buf[2], buf[3],
1484 buf[4], buf[5], buf[6], buf[7]);
1485 #endif
1486 }
1487 }
1488 }
1489
1490 if (++n_iter - ts[0].c >= 8192)
1491 {
1492 int t = usec();
1493 if (ts[N_TS - 1].c)
1494 {
1495 int a = 100 * 64 * (n_iter - ts[N_TS - 1].c) / (t - ts[N_TS - 1].t);
1496 fprintf(stderr,
1497 "%8d.%03d(ktrips/sec)\r",
1498 a / 1000,
1499 a % 1000);
1500 cr++;
1501 }
1502 for (i = N_TS - 1; i >= 1; i--)
1503 ts[i] = ts[i - 1];
1504 ts[0].c = n_iter;
1505 ts[0].t = t;
1506 for (i = 1; i < N_TS; i++)
1507 if (ts[i].c)
1508 break;
1509 else
1510 ts[i] = ts[i - 1];
1511 }
1512 #if 1
1513 if (!key_inc(3))
1514 {
1515 #if DEBUG>=2
1516 printf("********************************\n");
1517 #endif
1518 key_reset(0);
1519 set_salt(code, key);
1520 for (i = 0; i < 8; i++)
1521 key_set64(&key64, i, okey[i] = key[i], 0, 0x7F);
1522 }
1523 #endif
1524 }
1525
1526 return 0;
1527 }
1528
1529 /* EOF */

Properties

Name Value
svn:eol-style native

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