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

Properties

Name Value
svn:eol-style native

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