Generate DES key schedule from ASCII password.
(password)
| 453 | |
| 454 | |
| 455 | def _set_key(password): |
| 456 | """Generate DES key schedule from ASCII password.""" |
| 457 | |
| 458 | c,d = struct.unpack('<ii', password.encode("utf8") if not isinstance(password, bytes) else password) |
| 459 | c = (c & 0x7f7f7f7f) << 1 |
| 460 | d = (d & 0x7f7f7f7f) << 1 |
| 461 | |
| 462 | d,c = _PERM_OP(d,c,4,0x0f0f0f0f) |
| 463 | c = _HPERM_OP(c) |
| 464 | d = _HPERM_OP(d) |
| 465 | d,c = _PERM_OP(d,c,1,0x55555555) |
| 466 | c,d = _PERM_OP(c,d,8,0x00ff00ff) |
| 467 | d,c = _PERM_OP(d,c,1,0x55555555) |
| 468 | |
| 469 | # Any sign-extended bits are masked off. |
| 470 | d = (((d & 0x000000ff) << 16) | (d & 0x0000ff00) | |
| 471 | ((d & 0x00ff0000) >> 16) | ((c >> 4) & 0x0f000000)) |
| 472 | c = c & 0x0fffffff |
| 473 | |
| 474 | # Copy globals into local variables for loop. |
| 475 | shifts2 = _shifts2 |
| 476 | skbc0, skbc1, skbc2, skbc3, skbd0, skbd1, skbd2, skbd3 = _skb |
| 477 | |
| 478 | k = [0] * (_ITERATIONS * 2) |
| 479 | |
| 480 | for i in xrange(_ITERATIONS): |
| 481 | # Only operates on top 28 bits. |
| 482 | if shifts2[i]: |
| 483 | c = (c >> 2) | (c << 26) |
| 484 | d = (d >> 2) | (d << 26) |
| 485 | else: |
| 486 | c = (c >> 1) | (c << 27) |
| 487 | d = (d >> 1) | (d << 27) |
| 488 | c = c & 0x0fffffff |
| 489 | d = d & 0x0fffffff |
| 490 | |
| 491 | s = ( skbc0[ c & 0x3f ] | |
| 492 | skbc1[((c>> 6) & 0x03) | ((c>> 7) & 0x3c)] | |
| 493 | skbc2[((c>>13) & 0x0f) | ((c>>14) & 0x30)] | |
| 494 | skbc3[((c>>20) & 0x01) | |
| 495 | ((c>>21) & 0x06) | ((c>>22) & 0x38)] ) |
| 496 | |
| 497 | t = ( skbd0[ d & 0x3f ] | |
| 498 | skbd1[((d>> 7) & 0x03) | ((d>> 8) & 0x3c)] | |
| 499 | skbd2[((d>>15) & 0x3f) ] | |
| 500 | skbd3[((d>>21) & 0x0f) | ((d>>22) & 0x30)] ) |
| 501 | |
| 502 | k[2*i] = ((t << 16) | (s & 0x0000ffff)) & 0xffffffff |
| 503 | s = (s >> 16) | (t & 0xffff0000) |
| 504 | |
| 505 | # Top bit of s may be 1. |
| 506 | s = (s << 4) | ((s >> 28) & 0x0f) |
| 507 | k[2*i + 1] = s & 0xffffffff |
| 508 | |
| 509 | return k |
| 510 | |
| 511 | |
| 512 | def _body(ks, E0, E1): |