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 207 - (show annotations) (download) (as text)
Sun Aug 17 00:35:36 2008 UTC (15 years, 7 months ago) by notanpe
File MIME type: text/x-csrc
File size: 49258 byte(s)
飛連を追加
1 /***********************************************************************
2 *
3 * file: mty.c
4 *
5 * ‚Ü‚ A‘Ň‚Ä‰ŽB
6 *
7 * $Id$
8 *
9 */
10
11 #include <assert.h>
12 #include <ctype.h>
13 #include <errno.h>
14 #include <limits.h>
15 #include <stdarg.h>
16 #include <stddef.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <string.h>
20 #include <time.h>
21 #include <sys/timeb.h>
22 #include <sys/types.h>
23
24 /* MAKAI start */
25 #include <unistd.h>
26 #include <libgen.h>
27 #include <limits.h>
28 /* MAKAI end */
29
30 #if defined(WIN32)
31
32 #include <windows.h>
33 #include <process.h>
34
35 #elif defined(__GNUC__)
36
37 #include <sys/time.h>
38
39 #endif
40
41 #include "config.h"
42 #include "cp932.h"
43 #include "crypt64.h"
44 #include "desconst.h"
45 #include "expr_parse.h"
46 #include "scoreboard.h"
47 #include "synth.h"
48 #include "tr64.h"
49 #include "translate.h"
50 #include "util.h"
51 #include "wdict.h"
52
53 #if USE_DT
54 #include "dt4.h"
55 #endif
56
57 /* MAKAI start */
58 #define TRIP_LEN 10
59
60 #define MIN_THREAD 1
61 #define MAX_THREAD 32
62 int nThread = 0;
63 uint64_t pmask = 0;
64
65 #define MIN_UME 3
66 #define MAX_UME 6
67 unsigned char umeStr[10];
68 int umeLen;
69
70 FILE *nfp; /* ‘S” */
71 FILE *tfp; /* ŞˆČŠO‚Ě“ÁŽęŒŸő */
72
73 unsigned int seed;
74 int verbose;
75 /* MAKAI end */
76
77 /* CRYPT64 ‹LqŽq */
78 static
79 struct CRYPT64_DESC const *const crypt64_descs[] =
80 {
81 &crypt64_desc,
82 };
83
84 /* ŒŽƒNƒ‰ƒX */
85 static
86 struct
87 {
88 unsigned short map[256];
89 } kcls[8 + 8];
90
91 /* Šg’ŁŒŽƒNƒ‰ƒX */
92 #define KCLS_DT0 64
93 #define KCLS_DT1 128
94 #define KCLS_K2 256
95
96 #if USE_DT
97 /* ŒŽƒLƒ—pŽŤ‘ƒCƒ“ƒfƒNƒX */
98 struct DT *kd[8 + 8];
99
100 /* ŽŤ‘ƒCƒ“ƒfƒNƒX */
101 struct DT *dtidx[0x100 + 1];
102 #endif
103
104 /* MAKAI start */
105 int special = 0;
106 #define ST_ALLN 1 /* ‘S” */
107 #define ST_NIKO 1<<0x1 /* “ń\ */
108 #define ST_BUOO 1<<0x8 /* ‚Ô‚¨ */
109 #define ST_DOSU 1<<0x9 /* “{” */
110 #define ST_HREN 1<<0xd /* ”ň˜A */
111
112 void
113 comment( str )
114 char *str;
115 {
116 if ( strlen( str ) >= 4 ) {
117 if ( str[1] == '[' && str[3] == ']' ) {
118 switch ( str[2] ) {
119 case '0': special |= ST_ALLN; break;
120 case '1': special |= ST_NIKO; break;
121 case '8': special |= ST_BUOO; break;
122 case '9': special |= (ST_DOSU | ST_ALLN); break;
123 case 'd': special |= ST_HREN; break;
124 }
125 }
126 }
127 }
128 /* MAKAI end */
129
130 /* Žw’肳‚ę‚˝ƒNƒ‰ƒX‚Ć“ü‚Á‚Ä‚˘‚éƒL[‚Š‚çAclassify ‚đs‚¤ */
131 void
132 key_make_map(uint8_t *key, int n)
133 {
134 int i, j;
135 unsigned c = kcls[n].map[key[n]];
136
137 #if USE_DT
138 if (3 <= n && n < 7 && kd[n - 3])
139 {
140 /* ŽŤ‘‚ĚƒPƒc‚Ě•śŽšBŒă‚ë‚Ƀiƒjƒ„ƒ‰ƒLƒƒƒ‰ƒNƒ^‚Ş—ˆ‚é */
141 c = kd[n - 3]->c[0];
142 if ((0x81 <= c && c <= 0x9F)
143 || (0xE0 <= c && c <= 0xFC))
144 c = KCLS_K2;
145 else
146 c = (cp932[256 * key[n]]
147 | cp932[256 * (key[n] ^ 0x80)]);
148 #if DEBUG>=1
149 printf("*n=%d, key=%02X, cls=%04X\n",
150 n,
151 key[n],
152 c);
153 #endif
154 }
155 else if (2 <= n && n < 6 && kd[n - 2])
156 {
157 return;
158 }
159 else if (1 <= n && n < 5 && kd[n - 1])
160 {
161 return;
162 }
163 else if (1 <= n && n < 5 && !kd[n - 1]
164 //&& (c & KCLS_K2)
165 && (c & KCLS_DT1))
166 {
167 /* ŠżŽš2•śŽš‚đE‚Á‚Ä‚˘‚Ť‚܂ */
168 #if DEBUG>=1
169 printf("(%d)%02X %02X(%02X:%02X:%02X:%02X)\n",
170 n, key[n - 1], key[n],
171 cp932[(256 * key[n - 1] + key[n])],
172 cp932[(256 * key[n - 1] + key[n]) ^ 0x0080],
173 cp932[(256 * key[n - 1] + key[n]) ^ 0x8000],
174 cp932[(256 * key[n - 1] + key[n]) ^ 0x8080]);
175 #endif
176 if (n != 1 && n != 2
177 && (cp932[(256 * key[n - 1] + key[n]) ^ 0x0080] & KCLS_DT1))
178 key[n] ^= 0x80;
179 else if (n != 2 && n != 3
180 && (cp932[(256 * key[n - 1] + key[n]) ^ 0x8000] & KCLS_DT1))
181 key[n - 1] ^= 0x80;
182 else if (n > 3 && (cp932[(256 * key[n - 1] + key[n]) ^ 0x8080] & KCLS_DT1))
183 key[n - 1] ^= 0x80, key[n] ^= 0x80;
184 if (cp932[256 * key[n - 1] + key[n]] & KCLS_DT1)
185 {
186 for (kd[n - 1] = dtidx[key[n - 1]];
187 kd[n - 1]->c[1] != key[n];
188 kd[n - 1]++)
189 assert(kd[n - 1]->c[0] == key[n - 1]);
190 #if DEBUG>=1
191 printf("(%02X%02X:%02X%02X)%c%c%c%c\n",
192 kd[n - 1]->c[0],
193 kd[n - 1]->c[1],
194 kd[n - 1]->c[2],
195 kd[n - 1]->c[3],
196 kd[n - 1]->c[0],
197 kd[n - 1]->c[1],
198 kd[n - 1]->c[2],
199 kd[n - 1]->c[3]);
200 #endif
201 return;
202 }
203 }
204 else if (n < 4 && (c & KCLS_DT0) && kd[n] == NULL)
205 {
206 /* ƒJƒ^ƒJƒi–„‚ߍž‚Ý‚˘‚Ť‚Ü‚ˇ */
207 assert(kd[n] == NULL);
208 #if DEBUG>=1
209 printf("n=%d, key=%02X\n", n, key[n]);
210 #endif
211 kd[n] = dtidx[key[n]];
212 if (!kd[n]
213 && !(n == 1 || n == 2)
214 && dtidx[key[n] ^ 0x80])
215 {
216 key[n] ^= 0x80;
217 kd[n] = dtidx[key[n]];
218 }
219 if (kd[n])
220 return;
221 }
222 else
223 {
224 kd[n] = NULL;
225 }
226 #endif
227
228 /* ĹŒă‚Ě•”•Ş‚Í class map ‚đśŹ‚ˇ‚é•K—vƒiƒV */
229 if (n >= 6)
230 return;
231
232 for (i = 0; i < 256; i++)
233 {
234 unsigned bm = 0;
235 #if 1
236 if (c & KCLS_K1)
237 {
238 if (cp932[256 * key[n] + i] & KCLS_K1)
239 bm |= KCLS_K2 | (cp932[256 * key[n] + i] & KCLS_DT1);
240 if (cp932[256 * (key[n] ^ 0x80) + i] & KCLS_K1)
241 bm |= KCLS_K2 | (cp932[256 * (key[n] ^ 0x80) + i] & KCLS_DT1);
242 #if 0
243 bm |= ((cp932[256 * key[n] + i] & KCLS_K1)
244 || (cp932[256 * (key[n] ^ 0x80) + i] & KCLS_K1)
245 ? KCLS_K2 : 0);
246 #endif
247 }
248 if (c & (KCLS_AN | KCLS_KA | KCLS_K2))
249 for (j = 0; j < 256; j++)
250 {
251 bm |= cp932[256 * i + j] & (KCLS_AN | KCLS_KA | KCLS_K1
252 | KCLS_DT0);
253 #if 0
254 if (j >= 127 && !(n == 0 || n == 1))
255 break;
256 #endif
257 }
258 kcls[n + 1].map[i] = bm;
259 #endif
260 if (i >= 128 && !(n == 0 || n == 1))
261 kcls[n + 1].map[i - 128] |= kcls[n + 1].map[i];
262 }
263
264 if (n < 6)
265 kcls[n + 1].map[0x00] = kcls[n + 1].map[0x80] = 0;
266 if (n == 6)
267 kcls[7].map[0x00] |= KCLS_AN;
268 }
269
270 #if USE_DT
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 #endif
302
303 /* ƒ}ƒbƒv‚Š‚ç•śŽš‚đE‚Á‚ăZƒbƒg */
304 unsigned
305 key_set(int n, unsigned ch)
306 {
307 int cnt = 0, i;
308
309 #if USE_DT
310 if (3 <= n && n < 7 && kd[n - 3])
311 {
312 return dt_get(n - 3, 2, 3, ch);
313 return kd[n - 3]->c[3];
314 }
315 else if (2 <= n && n < 6 && kd[n - 2])
316 {
317 return dt_get(n - 2, 1, 2, ch);
318 return kd[n - 2]->c[2];
319 }
320 else if (1 <= n && n < 5 && kd[n - 1])
321 {
322 return dt_get(n - 1, 0, 1, ch);
323 return kd[n - 1]->c[1];
324 }
325 #endif
326
327 #if DEBUG>=3
328 if (cnt == 0)
329 {
330 printf("n=%d, ch=%d, (n-1)=%02X\n", n, ch, key[n - 1]);
331 int j;
332 for (i = 0; i < 16; i++)
333 {
334 printf("map[0x%02X] =", 16 * i);
335 for (j = 0; j < 16; j++)
336 printf(" %03X", kcls[n].map[16 * i + j]);
337 printf("\n");
338 }
339 }
340 #endif
341 for (i = 0; i < 256; i++)
342 {
343 if (kcls[n].map[i])
344 {
345 if (ch-- == 0)
346 return i;
347 cnt++;
348 }
349 if (n != 1 && n != 2 && i >= 127)
350 break;
351 }
352 /* ŒŠ‚Â‚Š‚ç‚ȂЂÁ‚˝‚Ě‚Ĺ‚ŕ‚˘‚Á‚Ř‚ń */
353 assert(cnt > 0);
354 ch %= cnt;
355 for (i = 0; i < 256; i++)
356 if (kcls[n].map[i])
357 {
358 if (ch-- == 0)
359 return i;
360 }
361 assert(!"not matched");
362 return 0;
363 }
364
365 /* bitwise key ‚đƒZƒbƒg */
366 static
367 void
368 key_set64(struct KEY *key64,
369 int n,
370 unsigned k,
371 unsigned vk,
372 unsigned sk)
373 {
374 int i, j;
375 if (!((vk | sk) & 0x7F))
376 return;
377
378 for (i = 0; i < 7; i++)
379 {
380 if (n == 7 && i < N_STRIDE) continue;
381 if (sk & (1 << i))
382 {
383 /* ƒZƒbƒg */
384 int o = tr_pc1[n][6 - i] - 1;
385 if (o < 28)
386 {
387 assert(o >= 0);
388 for (j = 0; j < N_ALU; j++)
389 key64->k[0][0][o].a[j]
390 = key64->k[0][1][o].a[j]
391 = -!!(k & (1 << i));
392 }
393 else
394 {
395 assert(o >= 28);
396 assert(o < 56);
397 for (j = 0; j < N_ALU; j++)
398 key64->k[1][0][o - 28].a[j]
399 = key64->k[1][1][o - 28].a[j]
400 = -!!(k & (1 << i));
401 }
402 }
403 else if (vk & (1 << i))
404 {
405 /* ”˝“] */
406 int o = tr_pc1[n][6 - i] - 1;
407 if (o < 28)
408 {
409 assert(o >= 0);
410 for (j = 0; j < N_ALU; j++)
411 key64->k[0][0][o].a[j]
412 = key64->k[0][1][o].a[j]
413 = ~key64->k[0][0][o].a[j];
414 }
415 else
416 {
417 assert(o >= 28);
418 assert(o < 56);
419 for (j = 0; j < N_ALU; j++)
420 key64->k[1][0][o - 28].a[j]
421 = key64->k[1][1][o - 28].a[j]
422 = ~key64->k[1][0][o - 28].a[j];
423 }
424 }
425 }
426 }
427
428 /* Žw’肳‚ę‚˝ƒNƒ‰ƒX‚ĚŠJŽn’l‚ÉƒŠƒZƒbƒg
429 ’ź‘O‚Ě•śŽš‚ĚƒNƒ‰ƒX‚É”›‚ç‚ę‚é */
430 int
431 key_reset(uint8_t *key, int n)
432 {
433 /* MAKAI start */
434 static char firstCall = 1;
435
436 if ( firstCall ) {
437 firstCall = 0;
438 } else {
439 if ( umeStr[0] != '\0' && n == 0 ) {
440 exit( 0 );
441 }
442 }
443 /* MAKAI end */
444
445 if (n >= 8)
446 return 1;
447 if (n == 7)
448 {
449 key[7] = 0;
450 return 1;
451 }
452
453 /* MAKAI start */
454 if (n >= umeLen)
455 key[n] = key_set(n, 0);
456 else {
457 if ( umeStr[0] == '\0' ) {
458 key[n] = key_set(n, rand());
459 } else {
460 key[n] = umeStr[n];
461 }
462 }
463 /* MAKAI end */
464
465 #if DEBUG>=3
466 printf("key[%d]=%02X ncls=%04X\n", n, key[n], kcls[n].map[key[n]]);
467 #endif
468
469 /* ƒZƒbƒg‚ł‚ę‚˝•śŽš‚đŒł‚ÉAŽŸƒLƒƒƒ‰‚Ě•śŽšƒNƒ‰ƒX‚đŒˆ‚ß‚é */
470 key_make_map(key, n);
471
472 return key_reset(key, n + 1);
473 }
474
475 /* Žw’肳‚ę‚˝ŒŽ‹óŠÔ‚Ě’†‚ŁAƒL[‚đ‚ЂƂi‚ß‚é
476 ˆŔ‘S‚ɃCƒ“ƒNƒŠƒƒ“ƒg‚Ĺ‚Ť‚˝ę‡ true ‚đ•Ô‚ˇ */
477 static
478 int
479 key_inc(uint8_t *key, int n)
480 {
481 if (n >= 8)
482 return 0;
483 else if (n == 7)
484 {
485 /* ĹŒă‚ĚƒoƒCƒg */
486 uint8_t o_k = (key[7] + (1 << N_STRIDE)) & 0x7F;
487 if (!o_k)
488 return 0; /* ƒCƒ“ƒNƒŠƒƒ“ƒg‚Ĺ‚Ť‚ȂЂÁ‚˝‚Ć‚Ť‚ÍŽŸ‚֐i‚ß‚¸‘҂ */
489
490 /* i‚ß‚é */
491 key[7] = o_k;
492 return 1;
493 }
494 else if (key_inc(key, n + 1)
495 /*
496 && key_inc(n + 1)
497 && key_inc(n + 1)
498 && key_inc(n + 1)*/
499 )
500 return 1;
501
502 /* Salt ‚̓Cƒ“ƒNƒŠƒƒ“ƒg‚ľ‚Č‚˘–ń‘Ђɂˇ‚é */
503 if (n == 1 || n == 2)
504 return 1;
505
506 #if DEBUG>=3
507 printf("key_inc(n=%d,ck=%02X)\n", n, key[n]);
508 #endif
509
510 #if USE_DT
511 /* ŽŤ‘Œę‚̓Cƒ“ƒNƒŠƒƒ“ƒg‚ľ‚Ä‚˘‚˘–ń‘Ђɂˇ‚é */
512 if (3 <= n && n < 7 && kd[n - 3])
513 {
514 if ((key[n - 3] & 0x7F) == ((kd[n - 3] + 1)->c[0] & 0x7F)
515 && (key[n - 2] & 0x7F) == ((kd[n - 3] + 1)->c[1] & 0x7F)
516 && (key[n - 1] & 0x7F) == ((kd[n - 3] + 1)->c[2] & 0x7F))
517 {
518 memcpy(&key[n - 3], &(++kd[n - 3])->c[0], 4);
519 #if DEBUG>=2
520 printf(">dt_get:%c%c%c%c(%02X%02X:%02X%02X)\n",
521 kd[n - 3]->c[0], kd[n - 3]->c[1], kd[n - 3]->c[2], kd[n - 3]->c[3],
522 kd[n - 3]->c[0], kd[n - 3]->c[1], kd[n - 3]->c[2], kd[n - 3]->c[3]);
523 #endif
524 return 1;
525 }
526 else
527 {
528 return 0;
529 }
530 }
531 else if (2 <= n && n < 6 && kd[n - 2])
532 {
533 if ((key[n - 2] & 0x7F) == ((kd[n - 2] + 1)->c[0] & 0x7F)
534 && (key[n - 1] & 0x7F) == ((kd[n - 2] + 1)->c[1] & 0x7F))
535 {
536 memcpy(&key[n - 2], &(++kd[n - 2])->c[0], 4);
537 #if DEBUG>=2
538 printf(">dt_get:%c%c%c%c(%02X%02X:%02X%02X)\n",
539 kd[n - 2]->c[0], kd[n - 2]->c[1], kd[n - 2]->c[2], kd[n - 2]->c[3],
540 kd[n - 2]->c[0], kd[n - 2]->c[1], kd[n - 2]->c[2], kd[n - 2]->c[3]);
541 #endif
542 return 1;
543 }
544 else
545 {
546 return 0;
547 }
548 if (kd[n - 2]->c[0] == key[n - 2])
549 return 1;
550 else
551 return 0;
552 }
553 else if (1 <= n && n < 5 && kd[n - 1])
554 {
555 unsigned c2 = kd[n - 1]->c[0];
556 if ((0x81 <= c2 && c2 <= 0x9F)
557 || (0xE0 <= c2 && c2 <= 0xFC))
558 {
559 kd[n - 1] = NULL;
560 #if 0
561 if (!(n == 1 && n == 2))
562 key[n] &= 0x7F;
563 if (!(n == 2 && n == 3))
564 key[n - 1] &= 0x7F;
565 #endif
566 key_make_map(n - 1);
567 }
568 else if ((key[n - 1] & 0x7F) == ((kd[n - 1] + 1)->c[0] & 0x7F))
569 {
570 memcpy(&key[n - 1], &(++kd[n - 1])->c[0], 4);
571 #if DEBUG>=2
572 printf(">dt_get:%c%c%c%c(%02X%02X:%02X%02X)\n",
573 kd[n - 1]->c[0], kd[n - 1]->c[1], kd[n - 1]->c[2], kd[n - 1]->c[3],
574 kd[n - 1]->c[0], kd[n - 1]->c[1], kd[n - 1]->c[2], kd[n - 1]->c[3]);
575 #endif
576 return 1;
577 }
578 else
579 {
580 return 0;
581 }
582 #if 0
583 if (kd[n - 1]->c[0] == key[n - 1])
584 return 1;
585 else
586 return 0;
587 #endif
588 }
589 else if (n < 4 && kd[n])
590 {
591 if (0 && kd[n]->c[0] == key[n])
592 return 1;
593 kd[n] = NULL;
594 #if 0
595 if (!(n == 1 || n == 2))
596 key[n] &= 0x7F;
597 #endif
598 }
599 #endif
600
601 /* ŽŔŰ‚É‘‚₾‚Ă݂é */
602 assert(n >= 3);
603 for (;;)
604 {
605 if (n <= 3
606 && !(key[n] & 0x80)
607 && kcls[n].map[key[n] ^ 0x80] & (KCLS_DT0))
608 {
609 /* ”źŠpƒJƒ^ƒJƒi‚Ě1ƒoƒCƒg–Ú */
610 key[n] ^= 0x80;
611 }
612 else
613 {
614 key[n] = (key[n] & 0x7F) + 1;
615 if (key[n] >= 0x80)
616 {
617 key[n] = 0xFF; /* ŽŸ‚ɓ˓ü‚ł‚š‚Č‚˘‚˝‚ß */
618 return 0;
619 }
620 }
621
622 if (kcls[n].map[key[n]])
623 {
624 key_make_map(key, n);
625 key_reset(key, n + 1);
626 return 1;
627 }
628 }
629 }
630
631 /* ŒŽ‚đŠŽ‘S‚ÉƒŠƒZƒbƒg‚ˇ‚é
632 Salt‚ŕƒZƒbƒg‚ľ’ꂎ */
633 static
634 void
635 key_init(uint8_t *key)
636 {
637 int i, j;
638
639 #if USE_DT
640 /* ŽŤ‘‚đAƒCƒ“ƒfƒNƒX‚đě‚č‚Č‚Ş‚çƒ}ƒbƒv‚ɂ͂߂ą‚ń‚ŐŔ‚­
641 ŽŤ‘‚̓R[ƒh‡¸‡‚É•Ŕ‚ń‚Ĺ‚é‚ŕ‚̂Ƃˇ‚é */
642 for (i = 0; i < dtcnt; i++)
643 {
644 unsigned c = dt[i].c[0];
645
646 assert(dt[i].c[0]
647 && dt[i].c[1]
648 && dt[i].c[2]
649 && dt[i].c[3]);
650
651 /* BSD ŽI‚Ĺ‚ľ‚É‚ť‚¤‚Č•śŽš‚ÍŽc”O‚Č‚Ş‚çœŠO */
652 assert((dt[i].c[0] & 0x7F)
653 && (dt[i].c[1] & 0x7F)
654 && (dt[i].c[2] & 0x7F)
655 && (dt[i].c[3] & 0x7F));
656
657 /* ƒCƒ“ƒfƒNƒX */
658 if (!dtidx[c])
659 dtidx[c] = &dt[i];
660
661 if ((0x81 <= c && c <= 0x9F)
662 || (0xE0 <= c && c <= 0xFC))
663 {
664 /* ‘SŠp‚Ȃ̂ŁA2ƒoƒCƒg‚Ť‚Ü‚Á‚˝Žž“_‚Ĺ—§‚Ä‚é */
665 cp932[256 * c + dt[i].c[1]] |= KCLS_DT1;
666 }
667 else if (0xA1 <= c && c <= 0xDF)
668 {
669 /* ”źŠpƒJƒi */
670 for (j = 0; j < 256; j++)
671 cp932[256 * c + j] |= KCLS_DT0;
672 }
673 }
674 /* ƒPƒcA‚ż‚¤‚Š”Ôl */
675 dtidx[0x100] = &dt[i];
676 #endif
677
678 key[8] = 0;
679
680 /* ‰Šúƒ}ƒbƒv‚đ‘g‚Ţ */
681 for (i = 0; i < 256; i++)
682 {
683 unsigned bm = 0;
684 kcls[0].map[i] = 0;
685 for (j = 0; j < 256; j++)
686 bm |= cp932[256 * i + j];
687 kcls[0].map[i] = bm & (KCLS_AN | KCLS_KA | KCLS_K1
688 | KCLS_DT0
689 );
690 if (i >= 128)
691 kcls[0].map[i - 128] |= kcls[0].map[i];
692 }
693
694 key_reset(key, 0);
695 }
696
697 /***************************************************************
698 *
699 * ŒĹ’čƒL[‚̐śŹ
700 *
701 * ˆęŒŠ Big Endian ‚É”ń‘Ήž‚̂悤‚ÉŒŠ‚Ś‚é‚ž‚낤‚Ş
702 * Š‚łɎU‚ç‚΂Á‚Ä‚˘‚é kludge ‚É‚ć‚č
703 * ALU_T ‚Ş 64 ƒrƒbƒg‚Ĺ‚ ‚éŒŔ‚čA‚ą‚ę‚Ĺ–â‘č‚Č‚­“Ž‚­B
704 *
705 */
706
707 static
708 void
709 key_init_sk(struct KEY *key)
710 {
711 int i, j;
712 int o;
713 uint64_t m;
714
715 for (i = 5, m = 0xFFFFFFFF00000000ULL;
716 i >= 0;
717 m ^= (m >> (1 << --i)))
718 {
719 o = tr_pc1[7][6 - i] - 1;
720 #if DEBUG>=2
721 printf("%d:%d->%2d: %08X%08X\n",
722 N_Q, i, o,
723 (unsigned)(m >> 32),
724 (unsigned)m);
725 #endif
726 for (j = 0; j < N_Q; j++)
727 if (o < 28)
728 key->k[0][0][o ].q[j] = key->k[0][1][o ].q[j] = m;
729 else
730 key->k[1][0][o - 28].q[j] = key->k[1][1][o - 28].q[j] = m;
731 }
732 #if N_STRIDE==7
733 /* bit 6 ‚Í Little Endian ‚Ć‚ľ‚Ĉľ‚¤ */
734 o = 0;
735 assert(tr_pc1[7][0] - 1 == o);
736 assert(N_Q == 2);
737 key->k[0][0][o].q[0] = key->k[0][1][o].q[0] = 0x0000000000000000ULL;
738 key->k[0][0][o].q[1] = key->k[0][1][o].q[1] = 0xFFFFFFFFFFFFFFFFULL;
739 #endif
740 }
741
742 /***************************************************************
743 *
744 * Salt ‚ĚƒZƒbƒg
745 * ƒIƒyƒ‰ƒ“ƒh‚ĚƒIƒtƒZƒbƒg‚đ‘‚ŤŠˇ‚ڂĉń‚Á‚Ä‚é‚̂ŒˆÓ
746 *
747 */
748
749 void
750 set_salt(CODE_T *code,
751 struct CRYPT64_DESC const *desc,
752 uint8_t const *k)
753 {
754 int i, j;
755
756 for (i = 0; i < 2; i++)
757 {
758 unsigned s = k[1 + i] & 255;
759 if (s > 'z')
760 s = 0;
761 else if (s >= 'a')
762 s = s - 'a' + 2 + 10 + 26;
763 else if (s >= 'A')
764 s = s - 'A' + 2 + 10;
765 else if (s >= '.')
766 s = s - '.';
767 else
768 s = 0;
769
770 #if DEBUG>=1
771 printf("Salt %d:%3o\n", i, s & 63);
772 #endif
773 for (j = 0; j < 6; j++)
774 {
775 #if DEBUG>=2
776 //printf("Salt %d:%d %+3d:%+3d",
777 printf("Salt %d:%d %08lX:%08lX",
778 i, j,
779 LSALT(desc, code, 0, i, j, 0),
780 LSALT(desc, code, 0, i, j, 24));
781 #endif
782 if (s & (1 << j))
783 {
784 LSALT(desc, code, 0, i, j, 0) = sizeof(WS_T) * (((4 * i + j + 15) & 31) - 16);
785 LSALT(desc, code, 0, i, j, 24) = sizeof(WS_T) * (((4 * i + j - 1) & 31) - 16);
786 }
787 else
788 {
789 LSALT(desc, code, 0, i, j, 0) = sizeof(WS_T) * (((4 * i + j - 1) & 31) - 16);
790 LSALT(desc, code, 0, i, j, 24) = sizeof(WS_T) * (((4 * i + j + 15) & 31) - 16);
791 }
792 LSALT(desc, code, 0, i, j, 12) = sizeof(WS_T) * (((4 * i + j + 7) & 31) - 16);
793 LSALT(desc, code, 0, i, j, 36) = sizeof(WS_T) * (((4 * i + j + 23) & 31) - 16);
794 #if DEBUG>=2
795 //printf(" => %+3d:%+3d\n",
796 printf(" => %08lX:%08lX\n",
797 LSALT(desc, code, 0, i, j, 0),
798 LSALT(desc, code, 0, i, j, 24));
799 #endif
800 }
801 }
802 }
803
804 #define USEC_SEC 1000 /* 1•b */
805
806 static
807 uint64_t
808 usec(void)
809 {
810 uint32_t sec, msec;
811
812 #if !defined(WIN32)
813 struct timeval tv;
814 gettimeofday(&tv, NULL);
815 sec = tv.tv_sec;
816 msec = tv.tv_usec / (1000000 / USEC_SEC);
817 #else
818 struct timeb tm;
819 ftime(&tm);
820 sec = tm.time;
821 msec = tm.millitm / (1000 / USEC_SEC);
822 #endif
823
824 return (uint64_t)USEC_SEC * sec + msec;
825 }
826
827 static
828 int
829 log_printf(FILE *ofp, char const *fmt, ...)
830 {
831 int r;
832 va_list ap;
833 va_start(ap, fmt);
834
835 /* MAKAI start */
836 #if 0
837 if ( ofp != nfp ) {
838 vfprintf(stdout, fmt, ap);
839 }
840 #endif /* 0 */
841 /* MAKAI end */
842
843 vfprintf(stdout, fmt, ap);
844 r = vfprintf(ofp, fmt, ap);
845 va_end(ap);
846 if (r > 0)
847 return r;
848 perror("log_printf");
849 exit(errno);
850 }
851
852 /***************************************************************
853 *
854 * CPU capabilities ‚đŽć“ž
855 * [XXX] ‚ ‚Ü‚č‚É‚ŕŒĂ‚˘ƒvƒƒZƒbƒT‚Ě‚ą‚Ć‚Íl‚ڂȂ˘B
856 *
857 * a[4] = {EAX,EBX,ECX,EDX}
858 *
859 */
860
861 #if defined(__GNUC__)
862
863 #define cpuid(n,a,b,c,d) \
864 asm("cpuid" \
865 : "=a"(a), "=b"(b), "=c"(c), "=d"(d) \
866 : "a"(n))
867
868 #elif defined(WIN32)
869
870 #define cpuid(n,a,b,c,d) \
871 do {int r[4]; __cpuid(r,n); \
872 (a) = r[0]; (b) = r[1]; (c) = r[2]; (d) = r[3];} while (0)
873
874 #endif
875
876 static
877 unsigned
878 cpuid_getfflags(void)
879 {
880 unsigned a, b, c, d;
881 cpuid(1, a, b, c, d);
882 return d;
883 }
884
885 static
886 int
887 cpuid_issupported(void)
888 {
889 unsigned m = REQUIRED_CAPS;
890 return !((cpuid_getfflags() ^ m) & m);
891 }
892
893 /***************************************************************
894 *
895 * ƒoƒbƒ`ˆ——pƒpƒPƒbƒg
896 *
897 */
898
899 static
900 struct PACKET_CRYPT64 *
901 packet_create(int n, /* ƒpƒPƒbƒg” */
902 int tn, /* ––”ö—v‘f‚ɂĕK—v‚Čƒ[ƒN” */
903 uint8_t const *ini_key)
904 {
905 int i;
906 int siz;
907 void *p;
908 intptr_t a = 128;
909 struct PACKET_CRYPT64 *pkts;
910 assert(IS_POWER2(sizeof(struct PACKET_CRYPT64)));
911 assert(n >= 1);
912
913 siz = (a - 1
914 + (n - 1) * sizeof(struct PACKET_CRYPT64)
915 + offsetof(struct PACKET_CRYPT64, param64.hit[tn]));
916 p = calloc(siz, 1);
917 /* ƒoƒ“ƒ_ƒŠ‚ ‚킚 */
918 pkts = (struct PACKET_CRYPT64 *)(((intptr_t)p
919 + a - 1)
920 & -a);
921 #if DEBUG>=1
922 fprintf(stderr,
923 "packet(n=%d,tn=%d) %d allocated; %p aligned to %p\n",
924 n, tn,
925 siz, p, pkts);
926 #endif
927
928 /* “ŕ•”‚̏‰Šú‰ť
929 ƒRƒs[‚ľ‚ĉń‚é‚̂́AŒľ–§‚É‚Í
930 ĹI—v‘f‚ĚƒPƒc‚đ”j‚Á‚Ä‚ľ‚Ü‚¤‚ą‚ƂɂȂé‚Ě‚Ĺ
931 ‚Ç‚¤‚š‘Ź“x‚ŕ—v‹‚ł‚ę‚Č‚˘‚ľƒxƒ^ƒR[ƒh */
932 for (i = 0; i < n; i++)
933 {
934 int j, k;
935
936 /* t[16] ‚́A“ŕ•”‰‰ŽZ‚ĹŽg—p‚ˇ‚éAall 1 ‚Ş“ü‚Á‚Ä‚˘‚é */
937 memset(&pkts[i].param64.t[T_INV], -1, sizeof(SLICE));
938
939 /* ŒĹ’čƒL[‚̐śŹ */
940 key_init_sk(&pkts[i].key64);
941
942 /* ƒL[ƒXƒPƒWƒ…[ƒ‹‚đ‚ą‚ą‚ɉŸ‚ľž‚߂è‚­
943 ]—ˆ‚Í crypt64.S “ŕ‚ĹŠŽŒ‹‚ˇ‚é‚悤‚Ɉř‚˘‚Ä‚˘‚˝ */
944 for (j = 0; j < 28; j++)
945 for (k = 0; k < N_ALU; k++)
946 pkts[i].key64.ks[j].a[k] = sizeof(WS_T) * ks_ls[j];
947
948 /* ”O‚Ě‚˝‚߁AŒŽ‚đ‚ą‚ą‚Ĺ—Ž‚ż’…‚݂è‚­(•s—v?) */
949 for (j = 0; j < 8; j++)
950 key_set64(&pkts[i].key64, j, pkts[i].uk.key[j] = ini_key[j], 0, 0x7F);
951 }
952
953 return pkts;
954 }
955
956 /***************************************************************
957 *
958 * thread
959 *
960 */
961
962 #define NQ_CRYPT 64
963 #define NQ_CMP 32
964
965 #if defined(__GNUC__)
966
967 typedef int32_t ATOMWORD_T;
968
969 #define LOCK_INC(p) \
970 asm volatile ("lock incl %0" \
971 : "=m"(*(p)) \
972 : /*nil*/ \
973 : "memory")
974
975 #define LOCK_DEC(p) \
976 asm volatile ("lock decl %0" \
977 : "=m"(*(p)) \
978 : /*nil*/ \
979 : "memory")
980
981 #define LOCK_CAS(pd,s,r) \
982 ({ ATOMWORD_T a; \
983 asm volatile ("lock cmpxchg %2,%1" \
984 : "=a"(a) \
985 : "m"(*(pd)), "r"(s), "0"(r) \
986 : "memory");a;})
987
988 #define LOCK_CASP(pd,s,r) \
989 ({ void *a; \
990 asm volatile ("lock cmpxchg %2,%1" \
991 : "=a"(a) \
992 : "m"(*(pd)), "r"(s), "0"(r) \
993 : "memory");a;})
994
995 #elif defined(WIN32)
996
997 typedef LONG ATOMWORD_T;
998
999 #define LOCK_INC(p) InterlockedIncrement((LONG *)(p))
1000 #define LOCK_DEC(p) InterlockedDecrement((LONG *)(p))
1001 #define LOCK_CAS(pd,s,r) InterlockedCompareExchange((LONG *)(pd), s, r)
1002 #define LOCK_CASP(pd,s,r) InterlockedCompareExchangePointer((PVOID *)(pd), (PVOID)(s), (PVOID)r)
1003
1004 #else
1005 #error "configuration not implemented"
1006 #endif
1007
1008 #if defined(WIN32)
1009
1010 typedef DWORD THREAD_TIMEOUT_T;
1011
1012 #define THREAD_INFINITE INFINITE
1013
1014 typedef HANDLE THREAD_TH_T;
1015 typedef HANDLE THREAD_EV_T;
1016
1017 #define thread_sleep(n) Sleep(n)
1018 #define thread_create(th, proc, arg) {(th) = (HANDLE)_beginthread(proc, 8192, arg);}
1019 #define thread_create_event(ev, f) {(ev) = CreateEvent(NULL, TRUE, f, NULL);}
1020 #define thread_signal_event(ev) SetEvent(ev)
1021 #define thread_clear_event(ev) ResetEvent(ev)
1022 #define thread_get_tid() GetCurrentThread()
1023 #define thread_set_priority(tid,n) SetThreadPriority(tid, n)
1024 #if 0
1025 #undef thread_set_priority /* MAKAI */
1026 #endif
1027 #define thread_set_affinity(tid,m) SetThreadAffinityMask(tid, (DWORD_PTR)1 << (m))
1028
1029 static
1030 int
1031 thread_wait_event(THREAD_EV_T ev, DWORD tmo)
1032 {
1033 DWORD r = WaitForSingleObject(ev, tmo);
1034 return (r < 0
1035 ? r
1036 : (r == WAIT_TIMEOUT
1037 ? -1
1038 : r));
1039 }
1040
1041 #elif defined(_POSIX_SOURCE)
1042
1043 #include <pthread.h>
1044 #include <unistd.h>
1045
1046 typedef int THREAD_TIMEOUT_T;
1047
1048 #define THREAD_INFINITE INT_MAX
1049
1050 #if defined(THREAD_PRIORITY_BELOW_NOROMAL) || defined(THREAD_PRIORITY_IDLE)
1051 #error "unsupported implementation"
1052 #endif
1053
1054 #define THREAD_PRIORITY_NORMAL 14
1055 #define THREAD_PRIORITY_BELOW_NORMAL 15
1056 #define THREAD_PRIORITY_IDLE 16
1057
1058 typedef pthread_t THREAD_TH_T;
1059 typedef struct
1060 {
1061 pthread_mutex_t m;
1062 pthread_cond_t c;
1063 int volatile f;
1064 } THREAD_EV_T;
1065
1066 #define thread_sleep(n) (usleep(1000 * (n)) != EINVAL || sleep((n) / 1000))
1067 #define thread_create(th, proc, arg) thread_create_p(&(th), proc, arg)
1068 #define thread_create_event(ev, f) thread_create_event_p(&(ev), f)
1069 #define thread_signal_event(ev) thread_set_event_p(&(ev), 1)
1070 #define thread_clear_event(ev) thread_set_event_p(&(ev), 0)
1071 #define thread_wait_event(ev,tmo) thread_wait_event_p(&(ev), tmo)
1072
1073 static
1074 void
1075 thread_create_p(pthread_t *th, NORETURN (*proc)(void *), void *param)
1076 {
1077 pthread_create(th, NULL, (void *(*)(void *))proc, param);
1078 }
1079
1080 static
1081 void
1082 thread_create_event_p(THREAD_EV_T *ev, int f)
1083 {
1084 ev->f = f;
1085 pthread_cond_init(&ev->c, NULL);
1086 pthread_mutex_init(&ev->m, NULL);
1087 }
1088
1089 static
1090 void
1091 thread_set_event_p(THREAD_EV_T *ev, int f)
1092 {
1093 pthread_mutex_lock(&ev->m);
1094 if (ev->f != f)
1095 {
1096 ev->f = f;
1097 pthread_cond_broadcast(&ev->c);
1098 }
1099 pthread_mutex_unlock(&ev->m);
1100 }
1101
1102 static
1103 int
1104 thread_wait_event_p(THREAD_EV_T *ev, int a_tmo)
1105 {
1106 int timeout = a_tmo;
1107 struct timeval now;
1108 struct timespec tmo;
1109 int r;
1110
1111 pthread_mutex_lock(&ev->m);
1112
1113 /* ŒťÝŽž‚Š‚çƒ^ƒCƒ€ƒAƒEƒgŽž‚đ‹‚ß‚é
1114 ‚ß‚ń‚Ç‚­‚š[ */
1115 gettimeofday(&now, NULL);
1116 tmo.tv_sec = now.tv_sec + (timeout / 1000);
1117 timeout %= 1000;
1118 timeout *= 1000;
1119 if (now.tv_usec >= 1000000 - timeout)
1120 {
1121 timeout -= 1000000;
1122 tmo.tv_sec++;
1123 }
1124 tmo.tv_nsec = 1000 * (now.tv_usec + timeout);
1125 r = 0;
1126 while (!ev->f)
1127 {
1128 r = pthread_cond_timedwait(&ev->c, &ev->m, &tmo);
1129 if (r == ETIMEDOUT
1130 && a_tmo < THREAD_INFINITE)
1131 break;
1132 }
1133
1134 pthread_mutex_unlock(&ev->m);
1135
1136 return (r == ETIMEDOUT
1137 ? (ETIMEDOUT < 0 ? ETIMEDOUT : -1)
1138 : 0);
1139 }
1140
1141 #if defined(__linux__)
1142
1143 /* ƒfƒtƒHƒ‹ƒgƒXƒPƒWƒ…[ƒŠƒ“ƒOƒ|ƒŠƒV[‚Ĺ‚Í
1144 —Dć“xÝ’肾‚˝‚čƒAƒCƒhƒ‹ƒXƒŒƒbƒh‹N‚ą‚ľ‚Ä‚ŕ
1145 ‚¨‚ŕ‚ľ‚ë‚­‚Č‚˘‚̂ŁA‚ť‚̂ւń‚͍ĄŒă‚ĚŒ¤‹†‰Ű‘čB */
1146
1147 #include <linux/unistd.h>
1148 _syscall0(pid_t,gettid)
1149
1150 #define thread_get_tid() gettid()
1151
1152 static
1153 int thread_set_affinity(pid_t tid, int i)
1154 {
1155 cpu_set_t m;
1156 CPU_ZERO(&m);
1157 CPU_SET(i, &m);
1158 return sched_setaffinity(tid, sizeof(m), &m);
1159 }
1160
1161 #else
1162
1163 /* POSIX ‚ł́AƒXƒŒƒbƒh’PˆĘ‚ĚƒXƒPƒWƒ…[ƒŠƒ“ƒO‚ɉî“ü‚Ĺ‚Ť‚Č‚˘B */
1164
1165 #endif
1166
1167 #else
1168 #error "configuration not supported"
1169 #endif
1170
1171 struct THREAD_PARAM
1172 {
1173 /* ˆČ‰ş‚Í‹¤’ʏî•ń‚ĚƒRƒs[ */
1174 CODE_T *code;
1175 THREAD_EV_T *p_ev_ks_activated;
1176 ATOMWORD_T volatile *p_nidle; /* ‘Ň‚ż‚É“ü‚Á‚˝‚瑝‰Á */
1177
1178 /* ˆČ‰ş‚̓XƒŒƒbƒhŒĹ—L */
1179 #ifdef thread_set_priority
1180 THREAD_TH_T th;
1181 int pri;
1182 #endif
1183 };
1184
1185 static
1186 volatile ATOMWORD_T wp_crypt, rp_crypt;
1187 static
1188 struct PACKET_CRYPT64 *volatile q_crypt[NQ_CRYPT];
1189
1190 static
1191 volatile ATOMWORD_T wp_cmp, rp_cmp;
1192 static
1193 struct PACKET_CRYPT64 *volatile q_cmp[NQ_CMP];
1194
1195 static
1196 uint64_t
1197 thread_avail(void)
1198 {
1199 #if !USE_MT
1200
1201 return 0x1U;
1202
1203 #elif defined(WIN32) /* Win32 API */
1204 DWORD_PTR mask, mask_s;
1205 if (!GetProcessAffinityMask(GetCurrentProcess(),
1206 &mask,
1207 &mask_s)
1208 || !mask
1209 || !mask_s)
1210 return 0x1U;
1211 #if DEBUG>=1
1212 fprintf(stderr,
1213 "m=%08X s=%08X\n",
1214 (unsigned)mask,
1215 (unsigned)mask_s);
1216 #endif
1217 if (popcnt64(mask_s) == 1)
1218 /* ‰˝‚ŕŒž‚¤‚Ü‚˘ */;
1219 else if (mask == mask_s)
1220 fprintf(stderr,
1221 "’ʏí‚Ě%d”{‚Ƃ͂悭Œž‚Á‚˝‚ŕ‚̂łˇB\n",
1222 popcnt64(mask));
1223 else
1224 fprintf(stderr,
1225 "Ĺ‚‘Ź—Í‚Ě%g”{‚̗͂łĂŤ‚Ć‚¤‚ɂނń‚΂é‚ćB\n",
1226 (double)popcnt64(mask) / popcnt64(mask_s));
1227 return mask;
1228
1229 #elif defined(__linux__) /* sched.h Šg’Ł */
1230
1231 int i;
1232 uint64_t m = 0;
1233 cpu_set_t am;
1234 if (sched_getaffinity(getpid(), sizeof(am), &am) < 0)
1235 return 0x1U;
1236
1237 for (i = 0; i < 64 && i < CPU_SETSIZE; i++)
1238 if (CPU_ISSET(i, &am))
1239 m |= 1ULL << i;
1240
1241 return m;
1242 #else
1243
1244 /* XXX ƒvƒƒZƒbƒT”‚đ’˛‚×ă‚°‚Ä‚­‚ž‚ł‚˘ */
1245 return 0x01U;
1246
1247 #endif
1248 }
1249
1250 static
1251 NORETURN
1252 thread_crypt64(void *a_param)
1253 {
1254 struct THREAD_PARAM *param = a_param;
1255 CODE_T *code = param->code;
1256 struct PACKET_CRYPT64 *pkt;
1257 #ifdef thread_set_priority
1258 THREAD_TH_T th = thread_get_tid();
1259 thread_set_priority(th, param->pri);
1260 #endif
1261
1262 for(;;)
1263 {
1264 ATOMWORD_T rp;
1265 ATOMWORD_T wp;
1266
1267 /* ƒLƒ…[‚Š‚ç—v‹‚đŽć‚čo‚ˇ */
1268 for (;;)
1269 {
1270 while ((rp = rp_crypt,
1271 WRAP(wp_crypt, NQ_CRYPT) == WRAP(rp, NQ_CRYPT)
1272 /*|| q_crypt[WRAP(rp, NQ_CRYPT)] == NULL*/))
1273 {
1274 THREAD_TIMEOUT_T tmo = (WRAP(wp_crypt, NQ_CRYPT) == WRAP(rp, NQ_CRYPT)
1275 ? THREAD_INFINITE
1276 : 1);
1277 int r;
1278
1279 /* Q‚˝ */
1280 if (tmo == THREAD_INFINITE)
1281 {
1282 LOCK_INC(param->p_nidle);
1283 }
1284
1285 /* —v‹‘Ň‚ż */
1286 r = thread_wait_event(*param->p_ev_ks_activated, tmo);
1287
1288 if (tmo == THREAD_INFINITE)
1289 {
1290 /* ‹N‚ą‚ł‚ę‚˝ */
1291 LOCK_DEC(param->p_nidle);
1292 }
1293 else if (r >= 0)
1294 {
1295 /* ‚ŕ‚¤‚ż‚ĺ‚Á‚ƐQ‚Ă݂é */
1296 thread_sleep(tmo);
1297 }
1298
1299 /* ŽŠ‚ç‚Ě—Dć“x‚đ–ß‚ˇ
1300 (ŠO‚Š‚çƒu[ƒXƒg‚ł‚ę‚Ă邊‚ŕ) */
1301 #ifdef thread_set_priority
1302 if (r >= 0)
1303 thread_set_priority(th, param->pri);
1304 #endif
1305 }
1306
1307 if (LOCK_CAS(&rp_crypt, rp + 1, rp) != rp)
1308 continue;
1309 rp = WRAP(rp, NQ_CRYPT);
1310 break;
1311 }
1312
1313 pkt = q_crypt[rp];
1314 assert(pkt != NULL);
1315 pkt = LOCK_CASP(&q_crypt[rp], NULL, pkt);
1316 assert(pkt != NULL);
1317
1318 /* ŽŔs‚ľ‚Ă݂é */
1319 CALL_CRYPT64(code, &pkt->key64, &pkt->param64);
1320
1321 /* Œ‹‰Ę‚đƒLƒ…[‚É‚˝‚˝‚Ťž‚Ţ */
1322 for (;;)
1323 {
1324 while ((wp = wp_cmp,
1325 WRAP(rp_cmp - 1, NQ_CMP) == WRAP(wp, NQ_CMP))
1326 || q_cmp[WRAP(wp, NQ_CMP)] != NULL)
1327 {
1328 #if DEBUG>=1
1329 fprintf(stderr,
1330 "q_cmp stalled(%d,%d) %p\n",
1331 (unsigned)WRAP(wp, NQ_CMP),
1332 (unsigned)WRAP(rp_cmp - 1, NQ_CMP),
1333 q_cmp[WRAP(wp, NQ_CMP)]);
1334 #endif
1335 thread_sleep(1);
1336 }
1337
1338 if (LOCK_CAS(&wp_cmp, wp + 1, wp) != wp)
1339 continue;
1340 wp = WRAP(wp, NQ_CMP);
1341 break;
1342 }
1343
1344 pkt = LOCK_CASP(&q_cmp[wp], pkt, NULL);
1345 assert(pkt == NULL);
1346 }
1347 }
1348
1349 /* MAKAI start */
1350 void
1351 usage( path )
1352 char *path;
1353 {
1354 char *myName, *chPtr;
1355
1356 myName = basename( path );
1357 for ( chPtr = myName; *chPtr != '\0'; chPtr++ ) {
1358 if ( *chPtr == '.' ) {
1359 *chPtr = '\0';
1360 break;
1361 }
1362 }
1363 printf( "%s [-t num|-m mask] [-s num] [-v] [\"str\"]\n", myName );
1364 printf( " -t num : ŒŸőƒXƒŒƒbƒh” ( %d … num … %d )\n",
1365 MIN_THREAD, MAX_THREAD );
1366 printf( " -m mask : ŽŔs‚ˇ‚é CPU ‚đŽw’股‚éƒ}ƒXƒN ( 1 ƒrƒbƒg … mask ‚Ěƒrƒbƒg” … %d ƒrƒbƒg )\n",
1367 MAX_THREAD );
1368 printf( " y-t ‚Ć -m ‚Í”r‘źz\n" );
1369 printf( " -s num : —”‚ĚŽí ( 1 … num … %u )\n", UINT_MAX );
1370 printf( " -v : ç’ˇƒƒbƒZ[ƒW\n" );
1371 printf( " str : ć“ނɖ„‚ߍž‚Ţ•śŽš—ń ( %d … str ‚ĚƒoƒCƒg” … %d )\n",
1372 MIN_UME, MAX_UME );
1373 }
1374
1375 /* ƒqƒbƒgŽž‚ɂ͏o—̓tƒ@ƒCƒ‹‚Ö‚Ěƒ|ƒCƒ“ƒ^‚đ•Ô‚ˇ */
1376 FILE *
1377 checkSpecial( trip, kind )
1378 char *trip;
1379 unsigned char *kind;
1380 {
1381 /* ”ň˜AŠÖ˜A‚ĚƒR[ƒh‚́AžŰŘÝ ŸCeleron/rc ě */
1382 if ( special & ST_HREN ) {
1383 /* ”ň˜A */
1384 int w, x = 0, y = 0;
1385
1386 for ( w = 0; w < TRIP_LEN; w++ ) {
1387 if ( trip[w] == trip[0] ) x += 1;
1388 if ( trip[w] == trip[1] ) y += 1;
1389 if ( x >= 8 || y >= 8 ) {
1390 strcpy( kind, "”ň" );
1391 return( tfp );
1392 }
1393 }
1394 }
1395
1396 if ( special & ST_BUOO ) {
1397 /* ‚Ô‚¨ [A-Za-z]aoo[A-Za-z]uoo$ */
1398 if ( trip[3] == 'a' && trip[4] == 'o' && trip[5] == 'o' &&
1399 trip[7] == 'u' && trip[8] == 'o' && trip[9] == 'o' &&
1400 isalpha( trip[2] ) && isalpha( trip[6] ) ) {
1401 strcpy( kind, "‚Ô" );
1402 return( tfp );
1403 }
1404 }
1405
1406 if ( special & ST_NIKO ) {
1407 /* “ń\ */
1408 int i;
1409 char ch1, ch2;
1410
1411 ch1 = trip[0];
1412 for ( i = 1; i < TRIP_LEN; i++ ) {
1413 if ( trip[i] != ch1 ) break;
1414 }
1415 ch2 = trip[i];
1416 for ( ; i < TRIP_LEN; i++ ) {
1417 if ( trip[i] != ch1 && trip[i] != ch2 ) goto NONIKO;
1418 }
1419 strcpy( kind, "“ń" );
1420 return( tfp );
1421 }
1422 NONIKO:
1423
1424 if ( special & ST_ALLN ) {
1425 /* ‘S” ‚Š “{” */
1426 if ( isdigit( trip[0] ) && isdigit( trip[1] ) && isdigit( trip[2] ) &&
1427 isdigit( trip[3] ) && isdigit( trip[4] ) && isdigit( trip[5] ) &&
1428 isdigit( trip[6] ) && isdigit( trip[7] ) && isdigit( trip[8] ) &&
1429 isdigit( trip[9] ) ) {
1430 if ( special & ST_DOSU ) {
1431 /* ‘S” & ‰ń•ś */
1432 if ( trip[0] == trip[9] && trip[1] == trip[8] && trip[2] == trip[7] &&
1433 trip[3] == trip[6] && trip[4] == trip[5] ) {
1434 strcpy( kind, "“{" );
1435 return( tfp );
1436 }
1437 /* ‘S” & ‘o˜A */
1438 if ( trip[0] == trip[1] && trip[2] == trip[3] && trip[4] == trip[5] &&
1439 trip[6] == trip[7] && trip[8] == trip[9] ) {
1440 strcpy( kind, "“{" );
1441 return( tfp );
1442 }
1443 /* ‘S” & ŽR•F */
1444 if ( trip[0] == trip[5] && trip[1] == trip[6] && trip[2] == trip[7] &&
1445 trip[3] == trip[8] && trip[4] == trip[9] ) {
1446 strcpy( kind, "“{" );
1447 return( tfp );
1448 }
1449 /* ĹŹ‚˂炢 */
1450 if ( trip[0] == '0' && trip[1] == '0' && trip[2] == '0' &&
1451 trip[3] == '0' && trip[4] == '0' && trip[5] == '0' &&
1452 trip[6] == '0' ) {
1453 strcpy( kind, "“{" );
1454 return( tfp );
1455 }
1456 /* Ĺ‘ĺ‚˂炢 */
1457 if ( trip[0] == '9' && trip[1] == '9' && trip[2] == '9' &&
1458 trip[3] == '9' && trip[4] == '9' && trip[5] == '9' &&
1459 trip[6] == '9' ) {
1460 strcpy( kind, "“{" );
1461 return( tfp );
1462 }
1463 } else {
1464 strcpy( kind, "”" );
1465 return( nfp );
1466 }
1467 }
1468 }
1469
1470 return( NULL );
1471 }
1472 /* MAKAI end */
1473
1474 /***************************************************************
1475 *
1476 * ƒƒCƒ“ƒ‹[ƒv‚Ć‚Š
1477 *
1478 */
1479
1480 int
1481 main(int argc, char *argv[])
1482 {
1483 int i;
1484 int mincnt;
1485 int nblk_hit, nblk_total;
1486 int nap_hit, nap_total;
1487 CODE_T *code = NULL;
1488 off_t code_cmp;
1489 FILE *ofp;
1490 FILE *sfp; /* scoreboard */
1491 struct ITREE *root_expr;
1492 uint64_t proc_mask;
1493 int ks_activated;
1494 static THREAD_EV_T event_ks_activated;
1495 static ATOMWORD_T volatile nidle;
1496 struct THREAD_PARAM *threads = NULL;
1497 int nthreads;
1498 int npkts;
1499 struct PACKET_CRYPT64 *pkts, *pkt_hit;
1500 uint64_t pkts_vacant;
1501 int tn;
1502 int cr;
1503
1504 /* ŒŽ•śŽš—ń */
1505 uint8_t key[8 + 8];
1506
1507 int xhash_loaded;
1508
1509 #define UPDATE_INTERVAL 8 /* ‘Ź“x•\ŽŚ‚ĚŠÔŠu •b */
1510 struct status {
1511 uint64_t startTime; /* ŠJŽnŽž ƒ~ƒŠ•b */
1512 uint64_t lastTime; /* ĹŒă‚É•\ŽŚ‚ľ‚˝Žž ƒ~ƒŠ•b */
1513 uint64_t loop; /* ‘ŒŸőŒÂ” */
1514 uint64_t lastloop; /* ĹŒă‚É•\ŽŚ‚ľ‚˝Žž‚Ě loop */
1515 } status;
1516 uint64_t curTime;
1517 uint32_t upd_int = 0;
1518
1519 /* MAKAI start */
1520 /* ŽŔŰ‚̏ˆ—‚Ć‚ ‚Á‚Ä‚˘‚Č‚˘ƒRƒƒ“ƒg‚đíœ */
1521
1522 #if defined(WIN32)
1523 SetPriorityClass( GetCurrentProcess(), IDLE_PRIORITY_CLASS );
1524 #endif
1525
1526 {
1527 int optChar;
1528 extern char *optarg;
1529 extern int optind;
1530 char *chPtr;
1531
1532 nThread = 0;
1533 pmask = 0;
1534 seed = 0;
1535 verbose = 0;
1536 while ( (optChar = getopt(argc, argv, "t:m:s:vh")) != EOF ) {
1537 switch ( optChar ) {
1538 case 't':
1539 pmask = 0;
1540 nThread = atoi( optarg );
1541 if ( nThread < MIN_THREAD || nThread > MAX_THREAD ) {
1542 usage( argv[0] );
1543 exit( 1 );
1544 }
1545 break;
1546 case 'm':
1547 nThread = 0;
1548 if ( strlen( optarg ) > MAX_THREAD ) {
1549 usage( argv[0] );
1550 exit( 1 );
1551 }
1552 for ( chPtr = optarg; *chPtr != '\0'; chPtr++ ) {
1553 pmask <<= 1;
1554 switch ( *chPtr ) {
1555 case '0':
1556 /* ‚Č‚É‚ŕ‚ľ‚Č‚˘ */
1557 break;
1558 case '1':
1559 pmask |= 1;
1560 break;
1561 default:
1562 usage( argv[0] );
1563 exit( 1 );
1564 break;
1565 }
1566 }
1567 if ( pmask < MIN_THREAD ) {
1568 usage( argv[0] );
1569 exit( 1 );
1570 }
1571 break;
1572 case 's':
1573 if ( optarg[0] == '-' ) {
1574 usage( argv[0] );
1575 exit( 1 );
1576 }
1577 seed = (unsigned int)atoi( optarg );
1578 if ( seed < 1 || seed > UINT_MAX ) {
1579 usage( argv[0] );
1580 exit( 1 );
1581 }
1582 break;
1583 case 'v':
1584 verbose = 1;
1585 break;
1586 case 'h':
1587 usage( argv[0] );
1588 exit( 0 );
1589 break;
1590 }
1591 }
1592
1593 switch ( argc - optind ) {
1594 case 0:
1595 umeStr[0] = '\0';
1596 umeLen = KEY_SHUFFLE_POS;
1597 break;
1598 case 1:
1599 strcpy( umeStr, argv[optind] );
1600 umeLen = strlen( umeStr );
1601 if ( umeLen < MIN_UME || umeLen > MAX_UME ) {
1602 usage( argv[0] );
1603 exit( 1 );
1604 }
1605 break;
1606 default:
1607 usage( argv[0] );
1608 exit( 1 );
1609 }
1610 }
1611 /* MAKAI end */
1612
1613 if (!cpuid_issupported())
1614 {
1615 fprintf(stderr, "‚ą‚̊‹Ť‚Ĺ‘–‚炚‚邹‚Ć‚Ş‘z’肳‚ę‚Ä‚˘‚Ü‚š‚ńB\n");
1616 exit(1);
1617 }
1618
1619 assert((1 << N_STRIDE) == N_ALU * ALU_BITS);
1620
1621 /* ƒ^ƒQ“ǂݍž‚Ý */
1622 root_expr = expr_parse("target.txt");
1623
1624 /* MAKAI start */
1625 if ( verbose ) {
1626 printf( "“ÁŽęŒŸőƒIƒvƒVƒ‡ƒ“ : " );
1627 if ( special & ST_DOSU ) {
1628 printf( "“{” " );
1629 } else {
1630 if ( special & ST_ALLN ) {
1631 printf( "‘S” " );
1632 }
1633 }
1634 if ( special & ST_NIKO ) {
1635 printf( "“ń\ " );
1636 }
1637 if ( special & ST_BUOO ) {
1638 printf( "‚Ô‚¨ " );
1639 }
1640 if ( special & ST_HREN ) {
1641 printf( "”ň˜A " );
1642 }
1643 if ( special ) {
1644 printf( "ƒIƒ“I\n" );
1645 } else {
1646 printf( "ƒI[ƒ‹ƒIƒtI\n" );
1647 }
1648 }
1649 /* MAKAI end */
1650
1651 /* ƒR[ƒh‚đśŹE“WŠJ
1652 ‹N“Ž—\’čƒXƒŒƒbƒh”‚ɉž‚ś‚Ä
1653 śŹ‚ˇ‚éƒR[ƒh‚đ•Ď‚Ś‚é */
1654 sfp = scoreboard_open();
1655 fwrite(crypt64_descs[0]->pro, 1, crypt64_descs[0]->cmp_pro - crypt64_descs[0]->pro, sfp); /* prologue & ƒRƒAƒ‹[ƒv */
1656
1657 /* MAKAI start */
1658 if ( nThread == 0 ) {
1659 if ( pmask == 0 ) {
1660 proc_mask = thread_avail();
1661 } else {
1662 /* ‚ž‚Ş‚ľ‚Š‚ľAWin32 ‚ĚƒR[ƒh‚ľ‚Š‚ą‚ą‚ɂ͂Ȃ˘B‚— */
1663 #ifdef WIN32
1664 DWORD_PTR processMask, systemMask;
1665 if ( GetProcessAffinityMask( GetCurrentProcess(), &processMask, &systemMask )
1666 == 0 ) {
1667 printf( "CPU ‚ĚŠ„‚č“–‚ĂɎ¸”s ‚ť‚Ě 1\n" );
1668 exit( 1 );
1669 }
1670 if ( (processMask & pmask) != pmask ) {
1671 printf( "‚ť‚ń‚Č CPU ‚͂˂ĽI\n" );
1672 exit( 1 );
1673 }
1674 #endif /* WIN32 */
1675 proc_mask = pmask;
1676 printf( "CPU : " );
1677 for ( i = 0; i < MAX_THREAD; i++ ) {
1678 if ( pmask & 1 ) {
1679 printf( "%d ", i );
1680 }
1681 pmask >>= 1;
1682 }
1683 printf( "‚đŽg—p‚ľ‚Ü‚ˇB\n" );
1684 #ifdef WIN32
1685 if ( SetProcessAffinityMask( GetCurrentProcess(), proc_mask ) == 0 ) {
1686 printf( "CPU ‚ĚŠ„‚č“–‚ĂɎ¸”s ‚ť‚Ě 2\n" );
1687 exit( 1 );
1688 }
1689 #endif /* WIN32 */
1690 }
1691 } else {
1692 int i;
1693 proc_mask = 0U;
1694 for ( i = 0; i < nThread; i++ ) {
1695 proc_mask <<= 1;
1696 proc_mask |= 1U;
1697 }
1698 printf( "%d ŒÂ‚ĚŒŸőƒXƒŒƒbƒh‚𐜐Ź\n", nThread );
1699 }
1700 /* MAKAI end */
1701
1702 if (popcnt64(proc_mask) == 1) /* MAKAI */
1703 {
1704 /* single */
1705 npkts = 1;
1706 pkts_vacant = 1;
1707 code_cmp = 0;
1708 }
1709 else
1710 {
1711 /* multi */
1712 fwrite(crypt64_descs[0]->ep, 1, crypt64_descs[0]->ep_end - crypt64_descs[0]->ep, sfp); /* epilogue */
1713
1714 /* ”äŠrŠí‚݂̂𐜐Ź(‘O”ź) */
1715 code_cmp = ftell(sfp);
1716 fseek(sfp, (-code_cmp) & 63, SEEK_CUR);
1717 code_cmp = ftell(sfp);
1718 fwrite(crypt64_descs[0]->pro, 1, crypt64_descs[0]->crypt - crypt64_descs[0]->pro, sfp); /* prologue */
1719 npkts = 64;
1720 pkts_vacant = (uint64_t)-1; /* (1 << 64) - 1 ‚đŒvŽZ‚ľ‚˝‚­‚Č‚˘ */
1721 }
1722
1723 /* ”äŠr•”‚đśŹ */
1724 fwrite(crypt64_descs[0]->cmp_pro, 1, crypt64_descs[0]->cmp_ep - crypt64_descs[0]->cmp_pro, sfp); /* ”äŠrŠí€”ő */
1725 tn = synth_synthesize(sfp, root_expr);
1726 fwrite(crypt64_descs[0]->cmp_ep, 1, crypt64_descs[0]->ep_end - crypt64_descs[0]->cmp_ep, sfp); /* epilogue */
1727
1728 /* ƒR[ƒh‚đƒƒ‚ƒŠ‚É“\‚č•t‚Ż‚é */
1729 code = scoreboard_map(sfp);
1730
1731 /* ƒL[‚̏‰Šú‰ť */
1732 /* MAKAI start */
1733 if ( seed == 0 ) {
1734 seed = (unsigned int)time( NULL );
1735 }
1736 if ( verbose ) {
1737 printf( "—”‚ĚŽí = %u\n", seed );
1738 }
1739 srand( seed );
1740 /* MAKAI end */
1741 key_init(key);
1742 set_salt(code, crypt64_descs[0], key);
1743
1744 /* ‰‰ŽZƒpƒPƒbƒg‚đěŹ */
1745 pkts = packet_create(npkts, tn, key);
1746 pkt_hit = &pkts[npkts - 1];
1747
1748 /* “­‚­‚¨‚ś‚ł‚ń‚đ—ĘŽY */
1749 thread_create_event(event_ks_activated, 1);
1750 ks_activated = 1;
1751 nthreads = 0;
1752 if (code_cmp)
1753 {
1754 THREAD_TH_T h;
1755 int ots = -1;
1756 threads = calloc(2 * popcnt64(proc_mask), sizeof(*threads));
1757 for (i = 0; proc_mask; i++, proc_mask >>= 1)
1758 if (proc_mask & 1)
1759 {
1760 if (ots < 0)
1761 {
1762 /* ŽŠ•ŞŽŠg‚ĚƒXƒPƒWƒ…[ƒŠƒ“ƒO
1763 ‚ą[‚ä[Œn‚ĚƒAƒvƒŠ‚Í’á‚߂ɐݒ股‚é‚Ě‚Ş‹g(‚Š‚ŕ) */
1764 #ifdef WIN32
1765 h = GetCurrentProcess();
1766 SetPriorityClass(h, BELOW_NORMAL_PRIORITY_CLASS);
1767 #endif
1768 #if defined(thread_set_priority)
1769 /* S‚ĚŒ„ŠÔ‚¨–„‚ß‚ľ‚Ü‚ˇ */
1770 threads[nthreads].code = code;
1771 threads[nthreads].p_ev_ks_activated = &event_ks_activated;
1772 threads[nthreads].p_nidle = &nidle;
1773 threads[nthreads].pri = THREAD_PRIORITY_IDLE;
1774 thread_create(h, thread_crypt64, &threads[nthreads]);
1775 threads[nthreads].th = h;
1776 nthreads++;
1777 #endif
1778 if (!code_cmp)
1779 break;
1780
1781 /* ŽŠ•ŞŽŠg‚ĚŽc‚č‚̐ݒč‚đA‚ ‚Ƃłâ‚é */
1782 ots = i;
1783 }
1784 else
1785 {
1786 /* ‘źƒXƒŒƒbƒh‚́A‚â‚â’á‚߂̗Dć“x‚ŁB */
1787 threads[nthreads].code = code;
1788 threads[nthreads].p_ev_ks_activated = &event_ks_activated;
1789 threads[nthreads].p_nidle = &nidle;
1790 #ifdef thread_set_priority
1791 threads[nthreads].pri = THREAD_PRIORITY_BELOW_NORMAL;
1792 #endif
1793 thread_create(h, thread_crypt64, &threads[nthreads]);
1794 #ifdef thread_set_priority
1795 threads[nthreads].th = h;
1796 #endif
1797 #ifdef thread_get_tid
1798 thread_set_affinity(h, i);
1799 #endif
1800 nthreads++;
1801 }
1802 }
1803 #ifdef thread_get_tid
1804 if (ots)
1805 thread_set_affinity(thread_get_tid(), ots);
1806 #endif
1807 }
1808
1809 if ((ofp = fopen("log.txt", "at")) == NULL)
1810 {
1811 perror("log.txt");
1812 return errno;
1813 }
1814
1815 setvbuf(ofp, NULL, _IONBF, BUFSIZ); /* XXX MSVCRT ‚Ĺ‚Í _IOLBF ‚ŞŠú‘Ň’Ę‚č‚É“Žě‚ľ‚Č‚˘ */
1816
1817 /* MAKAI start */
1818 if ( (tfp = fopen("logspe.txt", "at")) == NULL ) {
1819 perror("logspe.txt");
1820 return errno;
1821 }
1822 setvbuf( tfp, NULL, _IONBF, BUFSIZ );
1823 if ( (nfp = fopen("lognum.txt", "at")) == NULL ) {
1824 perror("lognum.txt");
1825 return errno;
1826 }
1827 setvbuf( nfp, NULL, _IONBF, BUFSIZ );
1828 /* MAKAI end */
1829
1830 mincnt = 0x7FFFFFFF;
1831 nblk_hit = nblk_total = 0;
1832 nap_hit = nap_total = 0;
1833 cr = 0;
1834 memset( &status, 0, sizeof( struct status ) );
1835 status.startTime = status.lastTime = usec();
1836 /* ’Tőƒ‹[ƒv‚ž‚ź‚Á‚Ć */
1837 for (;;)
1838 {
1839 struct PACKET_CRYPT64 *pkt_c;
1840 uint64_t cnt;
1841 #if DEBUG>=1 /* MAKAI */
1842 int cnt1, cnt2;
1843 #endif /* MAKAI */
1844 int k, kk;
1845
1846 /* ”äŠrŠíŒó•â(may be NULL)
1847 ć‚ɃLƒ…[‚Š‚çŽć‚čo‚ˇ */
1848 pkt_c = q_cmp[WRAP(rp_cmp, NQ_CMP)];
1849 if (pkt_c != NULL && WRAP(rp_cmp, NQ_CMP) != WRAP(wp_cmp, NQ_CMP))
1850 {
1851 pkt_c = LOCK_CASP(&q_cmp[WRAP(rp_cmp, NQ_CMP)], NULL, pkt_c);
1852 assert(pkt_c != NULL);
1853 LOCK_INC(&rp_cmp);
1854
1855 /* ƒpƒPƒbƒg‚đ vacant ‚ɉń‚ľ‚Ä‚¨‚­ */
1856 pkts_vacant |= 1ULL << (pkt_c - pkts);
1857 }
1858
1859 /* Saltƒ`ƒFƒ“ƒW‘Ň‚ż */
1860 if (!ks_activated)
1861 {
1862 ATOMWORD_T rp;
1863
1864 if (pkt_c == NULL)
1865 {
1866 if ((rp = rp_crypt,
1867 WRAP(rp, NQ_CRYPT) != WRAP(wp_crypt, NQ_CRYPT))
1868 && LOCK_CAS(&rp_crypt, rp + 1, rp) == rp)
1869 {
1870 /* !ks_activate ó‘Ԃł́AŽŠ‚ç‚ŕ—v‹ƒLƒ…[‚đ‚â‚Á‚Â‚Ż‚É‚˘‚­ */
1871 rp = WRAP(rp, NQ_CRYPT);
1872 pkt_c = q_crypt[rp];
1873 assert(pkt_c != NULL);
1874 pkt_c = LOCK_CASP(&q_crypt[rp], NULL, pkt_c);
1875 assert(pkt_c != NULL);
1876 assert(pkt_c != pkt_hit);
1877 CALL_CRYPT64(code,
1878 &pkt_c->key64,
1879 &pkt_c->param64);
1880
1881 /* ƒpƒPƒbƒg‚đ vacant ‚ɉń‚ľ‚Ä‚¨‚­ */
1882 pkts_vacant |= 1ULL << (pkt_c - pkts);
1883 }
1884 else
1885 {
1886 /* ‚â‚͂股‚邹‚Ć‚Ş‚Č‚˘‚̂ł܂Á‚˝‚č‚Ɖ߂˛‚ˇ */
1887 if (nidle != nthreads)
1888 thread_sleep(1);
1889 }
1890 }
1891
1892 if (nidle == nthreads)
1893 {
1894 assert(WRAP(rp_crypt, NQ_CRYPT) == WRAP(wp_crypt, NQ_CRYPT));
1895 /* Salt ƒ`ƒFƒ“ƒW‚މ”\ */
1896 set_salt(code, crypt64_descs[0], key);
1897 if (nthreads)
1898 thread_signal_event(event_ks_activated);
1899 ks_activated = 1;
1900 }
1901 }
1902
1903 /* ŒŽ‚đƒLƒ…[‚É‚˝‚˝‚Ťž‚݂܂­‚é */
1904 if (!ks_activated)
1905 {
1906 /* ŒŽ‚đ“o˜^‚ľ‚Č‚˘ */
1907 ;
1908 }
1909 else for (i = npkts - 1; i >= 0; i--)
1910 if (pkts_vacant & (1ULL << i))
1911 {
1912 int j;
1913
1914 if (i == npkts - 1)
1915 {
1916 /* ‘O’i‚ŁA“­‚­‚¨‚ś‚ł‚ń‚Š‚ç
1917 Œ‹‰Ę‚đ‚ŕ‚ç‚Á‚Ä‚˘‚˝‚çA‰˝‚ŕ‚ľ‚Č‚˘ */
1918 if (pkt_c != NULL)
1919 continue;
1920 }
1921 else
1922 {
1923 /* ‘O’i‚ĹŽć‚čo‚ľ‚˝‚Î‚Š‚č‚Ě
1924 “­‚­‚¨‚ś‚ł‚ń‚́A‘¸d‚ˇ‚é */
1925 if (&pkts[i] == pkt_c)
1926 continue;
1927
1928 /* queue full ‚Ěę‡‚ÍŒŠ‘—‚é */
1929 if (WRAP(wp_crypt, NQ_CRYPT) == WRAP(rp_crypt - 16, NQ_CRYPT) /* XXX 16 ‚͂ĂŤ‚Ć‚¤ */
1930 || q_crypt[WRAP(wp_crypt, NQ_CRYPT)] != NULL)
1931 break;
1932 }
1933
1934 /* ŒŽ‚ĚƒZƒbƒg */
1935 for (j = 0; j < 8; j++)
1936 {
1937 key_set64(&pkts[i].key64, j, key[j], key[j] ^ pkts[i].uk.key[j], 0);
1938 pkts[i].uk.key[j] = key[j];
1939 }
1940
1941 if (i == npkts - 1)
1942 {
1943 /* ŽŸ’i‚Ĺ CRYPT64->CMP */
1944 assert(pkt_c == NULL);
1945 pkt_c = &pkts[i];
1946 assert(pkt_c == pkt_hit);
1947 }
1948 else
1949 {
1950 /* ƒLƒ…[‚É‚˝‚˝‚Ťž‚Ţ */
1951 while (LOCK_CASP(&q_crypt[WRAP(wp_crypt, NQ_CRYPT)], &pkts[i], NULL) != NULL)
1952 {
1953 /* ÝŒvă‚Í‚ą‚ą‚É—ˆ‚Č‚˘ */
1954 #if DEBUG>=1
1955 fprintf(stderr,
1956 "[XXX] q_crypt ‚đ‰˜‚ľ‚Ä‚é‚̂͒N‚ž? (rp=%3d, wp=%3d, v=%08X%08X)\n",
1957 (unsigned)WRAP(rp_crypt, NQ_CRYPT),
1958 (unsigned)WRAP(wp_crypt, NQ_CRYPT),
1959 (unsigned)(pkts_vacant >> 32),
1960 (unsigned)pkts_vacant);
1961 thread_sleep(1000);
1962 #endif
1963 thread_sleep(1);
1964 }
1965 LOCK_INC(&wp_crypt);
1966 pkts_vacant ^= 1ULL << i;
1967 assert(!(pkts_vacant & (1ULL << i))); /* í‚ę */
1968 }
1969
1970 /* ŒŽ‘‰Á‚Í‚ą‚ń‚ȂƂą‚ë‚ɈړŽ! */
1971 assert(ks_activated);
1972 /* MAKAI start */
1973 if (!key_inc(key, 6) && !key_inc(key, umeLen))
1974 /* MAKAI end */
1975 {
1976 /* ŒŽ‚ĚƒVƒƒƒbƒtƒ‹
1977 q_crypt ‚ŞŽJ‚Ż‚é‚܂ŁAset_salt() ‚͂łŤ‚Č‚˘ */
1978 #if DEBUG>=1
1979 fprintf(stderr, "********************************SHUFFLE!\n");
1980 #endif
1981 if (nthreads)
1982 thread_clear_event(event_ks_activated);
1983 key_reset(key, 0);
1984
1985 /* ƒLƒ…[‚ĚŒŽ‚ŞŽJ‚Ż‚é‚Ü‚ĹƒAƒCƒhƒ‹ó‘Ô‚É */
1986 ks_activated = 0;
1987
1988 /* ƒXƒŒƒbƒh‚đƒu[ƒXƒg‚ľ‚ĉń‚é */
1989 #ifdef thread_set_priority
1990 for (j = 0; j < nthreads; j++)
1991 {
1992 assert(threads != NULL);
1993 thread_set_priority(threads[j].th, THREAD_PRIORITY_NORMAL);
1994 }
1995 #endif
1996
1997 /* ƒ‹[ƒv‘ąs‚Í‚ŕ‚Í‚â•s—v */
1998 break;
1999 }
2000 }
2001
2002 /* ‚ˇ‚邹‚Ć‚Ş‚Č‚­‚Č‚Á‚Ä‚˘‚éę‡ */
2003 if (pkt_c == NULL)
2004 {
2005 assert(!ks_activated);
2006 continue;
2007 }
2008
2009 /* ŒÄ‚Ô!
2010 LR ‰Šú‰ť‚́AƒTƒuƒ‚ƒWƒ…[ƒ‹“ŕ‚ōs‚¤‚ׂľ
2011 FASTCALL ‚ɏ€‚ś‚˝ŒÄ‚яo‚ľ‚Ě‚˝‚߁A
2012 ƒzƒ“ƒg‚Í‚˘‚낢‚냌ƒWƒXƒ^‚Ş”j‰ó‚ł‚ę‚éƒnƒYc‚Č‚ń‚ž‚ށB */
2013 if (pkt_c != pkt_hit)
2014 {
2015 assert(code_cmp != 0);
2016 cnt = CALL_CMP64(code + code_cmp,
2017 pkt_hit->param64.hit,
2018 pkt_c->param64.lr);
2019 }
2020 else
2021 {
2022 /* ‚悤‚â‚­ŽŠƒXƒŒƒbƒh‚ʼnń‚š‚é */
2023 cnt = CALL_CRYPT64(code,
2024 &pkt_c->key64,
2025 &pkt_c->param64);
2026 if (code_cmp)
2027 cnt = CALL_CMP64(code + code_cmp,
2028 pkt_c->param64.hit,
2029 pkt_c->param64.lr);
2030 }
2031
2032 #if DEBUG>=1
2033 cnt2 = (int32_t)(cnt >> 32);
2034 cnt1 = (int32_t)cnt;
2035 if (mincnt > cnt1 && cnt1 > 0)
2036 {
2037 mincnt = cnt1;
2038 if (cr)
2039 fprintf(stderr, "\n");
2040 cr = 0;
2041 fprintf(stderr, "cycle=%6d/%6d\n", cnt1, cnt2);
2042 }
2043 #endif
2044
2045 /* ƒqƒbƒg‚ľ‚˝‚Ć‚Ť‚̏ˆ—
2046 key ‚¨‚ć‚Ń lr ‚Í pkt_c ‚É
2047 ‡’v”ť’č‚Í pkt_hit ‚É“ü‚Á‚Ä‚˘‚éƒnƒY */
2048 xhash_loaded = 0;
2049 for (kk = 0; kk < N_ALU; kk++)
2050 {
2051 ALU_T t;
2052
2053 /* MAKAI start */
2054 static uint64_t xhash[64];
2055
2056 if ( special ) {
2057 CALL_TR64( &pkt_c->param64.lr[0][0].q[kk / (N_ALU / N_Q)], xhash );
2058 xhash_loaded = 1;
2059 }
2060 /* MAKAI end */
2061
2062 if (!(kk & (N_ALU / N_Q - 1)))
2063 nblk_total++, xhash_loaded = 0;
2064
2065 /* MAKAI start */
2066 if ( special ) {
2067 char hash[16];
2068 uint8_t buf[32];
2069 FILE *lfp;
2070 unsigned char kind[3];
2071
2072 for ( k = 0; k < ALU_BITS; k++ ) {
2073 for ( i = 1; i < 11; i++ ) {
2074 unsigned c = 0;
2075
2076 c = (xhash[(ALU_BITS * kk + k) & 63] >> (6 * (i - 1))) & 0x3F;
2077 hash[i - 1] = C64[c];
2078 }
2079 hash[10] = 0;
2080 if ( (lfp = checkSpecial( hash, kind )) != NULL ) {
2081 struct timeb tb;
2082 struct tm *plt;
2083
2084 ftime( &tb );
2085 plt = localtime( &tb.time );
2086 buf[0] = '#';
2087 memcpy( buf+1, pkt_c->uk.key, 8 );
2088 buf[9] = buf[10] = 0;
2089 buf[8] = ( buf[8] & - ( 1 << N_STRIDE ) & 0x7F ) + ALU_BITS * kk + k;
2090 if ( cr ) fprintf( stderr, "\n" );
2091 cr = 0;
2092 if ( ! translate( buf+1, 0, 1 ) ) {
2093 strcpy( buf, "Žc”O‚Ĺ‚ľ‚˝" );
2094 }
2095 log_printf( lfp, "Ÿ%s %s"
2096 "\t%04d/%02d/%02d %02d:%02d:%02d.%03d"
2097 "\t(%02X %02X %02X %02X %02X %02X %02X %02X/%02X) %s\n",
2098 hash, buf,
2099 plt->tm_year + 1900, plt->tm_mon + 1, plt->tm_mday,
2100 plt->tm_hour, plt->tm_min, plt->tm_sec, tb.millitm,
2101 buf[0], buf[1], buf[2], buf[3], buf[4],
2102 buf[5], buf[6], buf[7], buf[8], kind );
2103 }
2104 }
2105 }
2106 /* MAKAI end */
2107
2108 t = pkt_hit->param64.hit[HIT_ANY].a[kk];
2109 if (!t)
2110 continue;
2111
2112 nap_total += ALU_BITS;
2113
2114 for (k = 0; k < ALU_BITS; k++)
2115 {
2116
2117 /* MAKAI start */
2118 #if 0
2119 static uint64_t xhash[64];
2120 #endif /* 0 */
2121 /* MAKAI end */
2122
2123 char hash[16];
2124 uint8_t buf[32];
2125 struct timeb tb;
2126 struct tm *plt;
2127
2128 /* MAKAI start */
2129 int hitLen;
2130 /* MAKAI end */
2131
2132 if (!(t & ((ALU_T)1 << k)))
2133 continue;
2134
2135 nap_hit++;
2136
2137 /* “]’u */
2138 if (!xhash_loaded)
2139 {
2140 nblk_hit++;
2141 CALL_TR64(&pkt_c->param64.lr[0][0].q[kk / (N_ALU / N_Q)], xhash);
2142 xhash_loaded = 1;
2143 }
2144
2145 /* ŽŤ‘‚𒲂ׂé */
2146 /* MAKAI hitLen ’ljÁ */
2147 if (!((pkt_hit->param64.hit[HIT_BOOL].a[kk] & ((ALU_T)1 << k))
2148 || (hitLen = wdict_ishit(pkt_hit->param64.hit,
2149 kk, k,
2150 xhash[(ALU_BITS * kk + k) & 0x3F]))))
2151 continue;
2152
2153 /* ƒqƒbƒgŽž; –‚‰ü‘˘‚Ć‚ż‚ĺ‚Á‚Ćˆá‚¤ */
2154 ftime(&tb);
2155 plt = localtime(&tb.time);
2156
2157 for (i = 1; i < 11; i++)
2158 {
2159 unsigned c = 0;
2160 c = (xhash[(ALU_BITS * kk + k) & 63] >> (6 * (i - 1))) & 0x3F; /* XXX */
2161 hash[i - 1] = C64[c];
2162 }
2163 hash[10] = 0;
2164
2165 memcpy(buf, pkt_c->uk.key, 8);
2166 buf[8] = buf[9] = 0;
2167 buf[7] = (buf[7] & -(1 << N_STRIDE) & 0x7F) + ALU_BITS * kk + k;
2168 if (translate(buf, 0, 1))
2169 {
2170 if (cr)
2171 fprintf(stderr, "\n");
2172 cr = 0;
2173 #if DEBUG>=1
2174 fprintf(stderr, "%3d:", pkt_c - pkts);
2175 #endif
2176 log_printf(ofp,
2177 "Ÿ%s #%s"
2178 "\t%04d/%02d/%02d %02d:%02d:%02d.%03d"
2179 /* MAKAI start */
2180 "\t(%02X %02X %02X %02X %02X %02X %02X %02X/%02X) %02d\n",
2181 /* MAKAI end */
2182 hash,
2183 buf,
2184 plt->tm_year + 1900,
2185 plt->tm_mon + 1,
2186 plt->tm_mday,
2187 plt->tm_hour,
2188 plt->tm_min,
2189 plt->tm_sec,
2190 tb.millitm,
2191 buf[0], buf[1], buf[2], buf[3],
2192 buf[4], buf[5], buf[6], buf[7],
2193 /* MAKAI start */
2194 buf[8], hitLen);
2195 /* MAKAI end */
2196 }
2197 else
2198 {
2199 /* MAKAI start */
2200 log_printf( ofp, "Ÿ%s Žc”O‚Ĺ‚ľ‚˝"
2201 "\t%04d/%02d/%02d %02d:%02d:%02d.%03d"
2202 "\t(%02X %02X %02X %02X %02X %02X %02X %02X/%02X) %02d\n",
2203 hash,
2204 plt->tm_year + 1900, plt->tm_mon + 1, plt->tm_mday,
2205 plt->tm_hour, plt->tm_min, plt->tm_sec, tb.millitm,
2206 buf[0], buf[1], buf[2], buf[3],
2207 buf[4], buf[5], buf[6], buf[7], buf[8], hitLen );
2208 /* MAKAI end */
2209
2210 #if DEBUG>=1
2211 if (cr)
2212 fprintf(stderr, "\n");
2213 cr = 0;
2214 fprintf(stderr, "%3d:", pkt_c - pkts);
2215 log_printf(ofp,
2216 "Ÿ%s (%02X %02X %02X %02X %02X %02X %02X %02X )\n",
2217 hash,
2218 buf[0], buf[1], buf[2], buf[3],
2219 buf[4], buf[5], buf[6], buf[7]);
2220 #endif
2221 }
2222 }
2223 }
2224
2225 /* ‘Ź“xŒv‘Ş */
2226 status.loop += N_ALU * ALU_BITS;
2227 if (status.loop>= status.lastloop + upd_int
2228 && (curTime = usec()) != status.lastTime)
2229 {
2230 uint64_t diffTime;
2231 int a, b, c;
2232
2233 /* ’ĘŽZ(’PˆĘ ktrips/sec) */
2234 diffTime = curTime - status.startTime;
2235 a = status.loop / ((1000 / USEC_SEC) * diffTime);
2236
2237 /* ‹ćŠÔ(’PˆĘ trips/sec) */
2238 diffTime = curTime - status.lastTime;
2239 b = USEC_SEC * (status.loop - status.lastloop) / diffTime;
2240
2241 /* —\‘Ş */
2242 c = UPDATE_INTERVAL * b;
2243
2244 /* —§‚żă‚Ş‚č‚ȂǁAŒëˇ‚Ş‚ ‚č upd_int ‚ŞŹ‚ł‚ˇ‚Ź‚˝‚Ć‚Ť‚Í
2245 ‚˘‚Ť‚Č‚č‘S•␳‚š‚¸ 1 •b(==b)‚ŽűĘ‚ł‚š‚éB */
2246 upd_int = (upd_int + b < c
2247 ? upd_int + b
2248 : c);
2249
2250 status.lastTime = curTime;
2251 status.lastloop = status.loop;
2252 #if DEBUG>=1
2253 fprintf(stderr,
2254 "%5d/%5d(%3d%%)",
2255 nblk_hit, nblk_total, 100 * nblk_hit / nblk_total);
2256 nblk_hit = nblk_total = 0;
2257 if (nap_total)
2258 fprintf(stderr,
2259 " %5d/%5d(%3d%%)",
2260 nap_hit, nap_total, 100 * nap_hit / nap_total);
2261 else
2262 fprintf(stderr,
2263 " -----/-----(---%%)");
2264 nap_hit = nap_total = 0;
2265 #endif
2266 fprintf( stderr,
2267 "%6dktrips/s [%6d.%03dktrips/s]\r",
2268 a, b / 1000, b % 1000 );
2269 cr++;
2270 }
2271 }
2272
2273 return 0;
2274 }
2275
2276 /*
2277 * Local Variables:
2278 * tab-width: 4
2279 * End:
2280 *
2281 * EOF */

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Rev URL

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