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 14 - (show annotations) (download) (as text)
Fri Mar 9 06:49:26 2007 UTC (17 years, 1 month ago) by chapuni
Original Path: mty/mty.c
File MIME type: text/x-csrc
File size: 32107 byte(s)
種別 USE_64 (64-bit ALU 使用) を追加。
ただし、今回追加のアセンブラモジュールには対応コードが含まれていません。
準備だけ。

準備として、以下の変更を行う。
* ポインタ BP, SI の役割を入れ替えた。(BP) のとき disp 0 が省略できないため。
* LRがBPとなったため、デフォルトで disp8 がつくようになった。そのためアセンブル時のゲタ OX は、64ビット演算時は 0x00 に固定した。Salt固定のときは crypt64 のエントリを直接呼べる(ハズ)。
reg_op(), reg_mem() 周りを抽象化した。比較器に対して正しいコードが吐けている(200509相当の拡張)。

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

Properties

Name Value
svn:eol-style native

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