Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
des.py849 linesDownload Raw Back to crypto
1"""passlib.crypto.des -- DES block encryption routines2 3History4=======5These routines (which have since been drastically modified for python)6are based on a Java implementation of the des-crypt algorithm,7found at `<http://www.dynamic.net.au/christos/crypt/UnixCrypt2.txt>`_.8 9The copyright & license for that source is as follows::10 11    UnixCrypt.java 0.9 96/11/2512    Copyright (c) 1996 Aki Yoshida. All rights reserved.13    Permission to use, copy, modify and distribute this software14    for non-commercial or commercial purposes and without fee is15    hereby granted provided that this copyright notice appears in16    all copies.17 18    ---19 20    Unix crypt(3C) utility21    @version 0.9, 11/25/9622    @author  Aki Yoshida23 24    ---25 26    modified April 200127    by Iris Van den Broeke, Daniel Deville28 29    ---30    Unix Crypt.31    Implements the one way cryptography used by Unix systems for32    simple password protection.33    @version $Id: UnixCrypt2.txt,v 1.1.1.1 2005/09/13 22:20:13 christos Exp $34    @author Greg Wilkins (gregw)35 36The netbsd des-crypt implementation has some nice notes on how this all works -37    http://fxr.googlebit.com/source/lib/libcrypt/crypt.c?v=NETBSD-CURRENT38"""39 40# TODO: could use an accelerated C version of this module to speed up lmhash,41#       des-crypt, and ext-des-crypt42 43#=============================================================================44# imports45#=============================================================================46# core47import struct48# pkg49from passlib import exc50from passlib.utils.compat import join_byte_values, byte_elem_value, \51                                 irange, irange, int_types52# local53__all__ = [54    "expand_des_key",55    "des_encrypt_block",56]57 58#=============================================================================59# constants60#=============================================================================61 62# masks/upper limits for various integer sizes63INT_24_MASK = 0xffffff64INT_56_MASK = 0xffffffffffffff65INT_64_MASK = 0xffffffffffffffff66 67# mask to clear parity bits from 64-bit key68_KDATA_MASK = 0xfefefefefefefefe69_KPARITY_MASK = 0x010101010101010170 71# mask used to setup key schedule72_KS_MASK = 0xfcfcfcfcffffffff73 74#=============================================================================75# static DES tables76#=============================================================================77 78# placeholders filled in by _load_tables()79PCXROT = IE3264 = SPE = CF6464 = None80 81def _load_tables():82    """delay loading tables until they are actually needed"""83    global PCXROT, IE3264, SPE, CF646484 85    #---------------------------------------------------------------86    # Initial key schedule permutation87    # PC1ROT - bit reverse, then PC1, then Rotate, then PC288    #---------------------------------------------------------------89    # NOTE: this was reordered from original table to make perm3264 logic simpler90    PC1ROT=(91    ( 0x0000000000000000, 0x0000000000000000, 0x0000000000002000, 0x0000000000002000,92      0x0000000000000020, 0x0000000000000020, 0x0000000000002020, 0x0000000000002020,93      0x0000000000000400, 0x0000000000000400, 0x0000000000002400, 0x0000000000002400,94      0x0000000000000420, 0x0000000000000420, 0x0000000000002420, 0x0000000000002420, ),95    ( 0x0000000000000000, 0x2000000000000000, 0x0000000400000000, 0x2000000400000000,96      0x0000800000000000, 0x2000800000000000, 0x0000800400000000, 0x2000800400000000,97      0x0008000000000000, 0x2008000000000000, 0x0008000400000000, 0x2008000400000000,98      0x0008800000000000, 0x2008800000000000, 0x0008800400000000, 0x2008800400000000, ),99    ( 0x0000000000000000, 0x0000000000000000, 0x0000000000000040, 0x0000000000000040,100      0x0000000020000000, 0x0000000020000000, 0x0000000020000040, 0x0000000020000040,101      0x0000000000200000, 0x0000000000200000, 0x0000000000200040, 0x0000000000200040,102      0x0000000020200000, 0x0000000020200000, 0x0000000020200040, 0x0000000020200040, ),103    ( 0x0000000000000000, 0x0002000000000000, 0x0800000000000000, 0x0802000000000000,104      0x0100000000000000, 0x0102000000000000, 0x0900000000000000, 0x0902000000000000,105      0x4000000000000000, 0x4002000000000000, 0x4800000000000000, 0x4802000000000000,106      0x4100000000000000, 0x4102000000000000, 0x4900000000000000, 0x4902000000000000, ),107    ( 0x0000000000000000, 0x0000000000000000, 0x0000000000040000, 0x0000000000040000,108      0x0000020000000000, 0x0000020000000000, 0x0000020000040000, 0x0000020000040000,109      0x0000000000000004, 0x0000000000000004, 0x0000000000040004, 0x0000000000040004,110      0x0000020000000004, 0x0000020000000004, 0x0000020000040004, 0x0000020000040004, ),111    ( 0x0000000000000000, 0x0000400000000000, 0x0200000000000000, 0x0200400000000000,112      0x0080000000000000, 0x0080400000000000, 0x0280000000000000, 0x0280400000000000,113      0x0000008000000000, 0x0000408000000000, 0x0200008000000000, 0x0200408000000000,114      0x0080008000000000, 0x0080408000000000, 0x0280008000000000, 0x0280408000000000, ),115    ( 0x0000000000000000, 0x0000000000000000, 0x0000000010000000, 0x0000000010000000,116      0x0000000000001000, 0x0000000000001000, 0x0000000010001000, 0x0000000010001000,117      0x0000000040000000, 0x0000000040000000, 0x0000000050000000, 0x0000000050000000,118      0x0000000040001000, 0x0000000040001000, 0x0000000050001000, 0x0000000050001000, ),119    ( 0x0000000000000000, 0x0000001000000000, 0x0000080000000000, 0x0000081000000000,120      0x1000000000000000, 0x1000001000000000, 0x1000080000000000, 0x1000081000000000,121      0x0004000000000000, 0x0004001000000000, 0x0004080000000000, 0x0004081000000000,122      0x1004000000000000, 0x1004001000000000, 0x1004080000000000, 0x1004081000000000, ),123    ( 0x0000000000000000, 0x0000000000000000, 0x0000000000000080, 0x0000000000000080,124      0x0000000000080000, 0x0000000000080000, 0x0000000000080080, 0x0000000000080080,125      0x0000000000800000, 0x0000000000800000, 0x0000000000800080, 0x0000000000800080,126      0x0000000000880000, 0x0000000000880000, 0x0000000000880080, 0x0000000000880080, ),127    ( 0x0000000000000000, 0x0000000008000000, 0x0000002000000000, 0x0000002008000000,128      0x0000100000000000, 0x0000100008000000, 0x0000102000000000, 0x0000102008000000,129      0x0000200000000000, 0x0000200008000000, 0x0000202000000000, 0x0000202008000000,130      0x0000300000000000, 0x0000300008000000, 0x0000302000000000, 0x0000302008000000, ),131    ( 0x0000000000000000, 0x0000000000000000, 0x0000000000400000, 0x0000000000400000,132      0x0000000004000000, 0x0000000004000000, 0x0000000004400000, 0x0000000004400000,133      0x0000000000000800, 0x0000000000000800, 0x0000000000400800, 0x0000000000400800,134      0x0000000004000800, 0x0000000004000800, 0x0000000004400800, 0x0000000004400800, ),135    ( 0x0000000000000000, 0x0000000000008000, 0x0040000000000000, 0x0040000000008000,136      0x0000004000000000, 0x0000004000008000, 0x0040004000000000, 0x0040004000008000,137      0x8000000000000000, 0x8000000000008000, 0x8040000000000000, 0x8040000000008000,138      0x8000004000000000, 0x8000004000008000, 0x8040004000000000, 0x8040004000008000, ),139    ( 0x0000000000000000, 0x0000000000000000, 0x0000000000004000, 0x0000000000004000,140      0x0000000000000008, 0x0000000000000008, 0x0000000000004008, 0x0000000000004008,141      0x0000000000000010, 0x0000000000000010, 0x0000000000004010, 0x0000000000004010,142      0x0000000000000018, 0x0000000000000018, 0x0000000000004018, 0x0000000000004018, ),143    ( 0x0000000000000000, 0x0000000200000000, 0x0001000000000000, 0x0001000200000000,144      0x0400000000000000, 0x0400000200000000, 0x0401000000000000, 0x0401000200000000,145      0x0020000000000000, 0x0020000200000000, 0x0021000000000000, 0x0021000200000000,146      0x0420000000000000, 0x0420000200000000, 0x0421000000000000, 0x0421000200000000, ),147    ( 0x0000000000000000, 0x0000000000000000, 0x0000010000000000, 0x0000010000000000,148      0x0000000100000000, 0x0000000100000000, 0x0000010100000000, 0x0000010100000000,149      0x0000000000100000, 0x0000000000100000, 0x0000010000100000, 0x0000010000100000,150      0x0000000100100000, 0x0000000100100000, 0x0000010100100000, 0x0000010100100000, ),151    ( 0x0000000000000000, 0x0000000080000000, 0x0000040000000000, 0x0000040080000000,152      0x0010000000000000, 0x0010000080000000, 0x0010040000000000, 0x0010040080000000,153      0x0000000800000000, 0x0000000880000000, 0x0000040800000000, 0x0000040880000000,154      0x0010000800000000, 0x0010000880000000, 0x0010040800000000, 0x0010040880000000, ),155        )156    #---------------------------------------------------------------157    # Subsequent key schedule rotation permutations158    # PC2ROT - PC2 inverse, then Rotate, then PC2159    #---------------------------------------------------------------160    # NOTE: this was reordered from original table to make perm3264 logic simpler161    PC2ROTA=(162    ( 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,163      0x0000000000200000, 0x0000000000200000, 0x0000000000200000, 0x0000000000200000,164      0x0000000004000000, 0x0000000004000000, 0x0000000004000000, 0x0000000004000000,165      0x0000000004200000, 0x0000000004200000, 0x0000000004200000, 0x0000000004200000, ),166    ( 0x0000000000000000, 0x0000000000000800, 0x0000010000000000, 0x0000010000000800,167      0x0000000000002000, 0x0000000000002800, 0x0000010000002000, 0x0000010000002800,168      0x0000000010000000, 0x0000000010000800, 0x0000010010000000, 0x0000010010000800,169      0x0000000010002000, 0x0000000010002800, 0x0000010010002000, 0x0000010010002800, ),170    ( 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,171      0x0000000100000000, 0x0000000100000000, 0x0000000100000000, 0x0000000100000000,172      0x0000000000800000, 0x0000000000800000, 0x0000000000800000, 0x0000000000800000,173      0x0000000100800000, 0x0000000100800000, 0x0000000100800000, 0x0000000100800000, ),174    ( 0x0000000000000000, 0x0000020000000000, 0x0000000080000000, 0x0000020080000000,175      0x0000000000400000, 0x0000020000400000, 0x0000000080400000, 0x0000020080400000,176      0x0000000008000000, 0x0000020008000000, 0x0000000088000000, 0x0000020088000000,177      0x0000000008400000, 0x0000020008400000, 0x0000000088400000, 0x0000020088400000, ),178    ( 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,179      0x0000000000000040, 0x0000000000000040, 0x0000000000000040, 0x0000000000000040,180      0x0000000000001000, 0x0000000000001000, 0x0000000000001000, 0x0000000000001000,181      0x0000000000001040, 0x0000000000001040, 0x0000000000001040, 0x0000000000001040, ),182    ( 0x0000000000000000, 0x0000000000000010, 0x0000000000000400, 0x0000000000000410,183      0x0000000000000080, 0x0000000000000090, 0x0000000000000480, 0x0000000000000490,184      0x0000000040000000, 0x0000000040000010, 0x0000000040000400, 0x0000000040000410,185      0x0000000040000080, 0x0000000040000090, 0x0000000040000480, 0x0000000040000490, ),186    ( 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,187      0x0000000000080000, 0x0000000000080000, 0x0000000000080000, 0x0000000000080000,188      0x0000000000100000, 0x0000000000100000, 0x0000000000100000, 0x0000000000100000,189      0x0000000000180000, 0x0000000000180000, 0x0000000000180000, 0x0000000000180000, ),190    ( 0x0000000000000000, 0x0000000000040000, 0x0000000000000020, 0x0000000000040020,191      0x0000000000000004, 0x0000000000040004, 0x0000000000000024, 0x0000000000040024,192      0x0000000200000000, 0x0000000200040000, 0x0000000200000020, 0x0000000200040020,193      0x0000000200000004, 0x0000000200040004, 0x0000000200000024, 0x0000000200040024, ),194    ( 0x0000000000000000, 0x0000000000000008, 0x0000000000008000, 0x0000000000008008,195      0x0010000000000000, 0x0010000000000008, 0x0010000000008000, 0x0010000000008008,196      0x0020000000000000, 0x0020000000000008, 0x0020000000008000, 0x0020000000008008,197      0x0030000000000000, 0x0030000000000008, 0x0030000000008000, 0x0030000000008008, ),198    ( 0x0000000000000000, 0x0000400000000000, 0x0000080000000000, 0x0000480000000000,199      0x0000100000000000, 0x0000500000000000, 0x0000180000000000, 0x0000580000000000,200      0x4000000000000000, 0x4000400000000000, 0x4000080000000000, 0x4000480000000000,201      0x4000100000000000, 0x4000500000000000, 0x4000180000000000, 0x4000580000000000, ),202    ( 0x0000000000000000, 0x0000000000004000, 0x0000000020000000, 0x0000000020004000,203      0x0001000000000000, 0x0001000000004000, 0x0001000020000000, 0x0001000020004000,204      0x0200000000000000, 0x0200000000004000, 0x0200000020000000, 0x0200000020004000,205      0x0201000000000000, 0x0201000000004000, 0x0201000020000000, 0x0201000020004000, ),206    ( 0x0000000000000000, 0x1000000000000000, 0x0004000000000000, 0x1004000000000000,207      0x0002000000000000, 0x1002000000000000, 0x0006000000000000, 0x1006000000000000,208      0x0000000800000000, 0x1000000800000000, 0x0004000800000000, 0x1004000800000000,209      0x0002000800000000, 0x1002000800000000, 0x0006000800000000, 0x1006000800000000, ),210    ( 0x0000000000000000, 0x0040000000000000, 0x2000000000000000, 0x2040000000000000,211      0x0000008000000000, 0x0040008000000000, 0x2000008000000000, 0x2040008000000000,212      0x0000001000000000, 0x0040001000000000, 0x2000001000000000, 0x2040001000000000,213      0x0000009000000000, 0x0040009000000000, 0x2000009000000000, 0x2040009000000000, ),214    ( 0x0000000000000000, 0x0400000000000000, 0x8000000000000000, 0x8400000000000000,215      0x0000002000000000, 0x0400002000000000, 0x8000002000000000, 0x8400002000000000,216      0x0100000000000000, 0x0500000000000000, 0x8100000000000000, 0x8500000000000000,217      0x0100002000000000, 0x0500002000000000, 0x8100002000000000, 0x8500002000000000, ),218    ( 0x0000000000000000, 0x0000800000000000, 0x0800000000000000, 0x0800800000000000,219      0x0000004000000000, 0x0000804000000000, 0x0800004000000000, 0x0800804000000000,220      0x0000000400000000, 0x0000800400000000, 0x0800000400000000, 0x0800800400000000,221      0x0000004400000000, 0x0000804400000000, 0x0800004400000000, 0x0800804400000000, ),222    ( 0x0000000000000000, 0x0080000000000000, 0x0000040000000000, 0x0080040000000000,223      0x0008000000000000, 0x0088000000000000, 0x0008040000000000, 0x0088040000000000,224      0x0000200000000000, 0x0080200000000000, 0x0000240000000000, 0x0080240000000000,225      0x0008200000000000, 0x0088200000000000, 0x0008240000000000, 0x0088240000000000, ),226        )227 228    # NOTE: this was reordered from original table to make perm3264 logic simpler229    PC2ROTB=(230    ( 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,231      0x0000000000000400, 0x0000000000000400, 0x0000000000000400, 0x0000000000000400,232      0x0000000000080000, 0x0000000000080000, 0x0000000000080000, 0x0000000000080000,233      0x0000000000080400, 0x0000000000080400, 0x0000000000080400, 0x0000000000080400, ),234    ( 0x0000000000000000, 0x0000000000800000, 0x0000000000004000, 0x0000000000804000,235      0x0000000080000000, 0x0000000080800000, 0x0000000080004000, 0x0000000080804000,236      0x0000000000040000, 0x0000000000840000, 0x0000000000044000, 0x0000000000844000,237      0x0000000080040000, 0x0000000080840000, 0x0000000080044000, 0x0000000080844000, ),238    ( 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,239      0x0000000000000008, 0x0000000000000008, 0x0000000000000008, 0x0000000000000008,240      0x0000000040000000, 0x0000000040000000, 0x0000000040000000, 0x0000000040000000,241      0x0000000040000008, 0x0000000040000008, 0x0000000040000008, 0x0000000040000008, ),242    ( 0x0000000000000000, 0x0000000020000000, 0x0000000200000000, 0x0000000220000000,243      0x0000000000000080, 0x0000000020000080, 0x0000000200000080, 0x0000000220000080,244      0x0000000000100000, 0x0000000020100000, 0x0000000200100000, 0x0000000220100000,245      0x0000000000100080, 0x0000000020100080, 0x0000000200100080, 0x0000000220100080, ),246    ( 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,247      0x0000000000002000, 0x0000000000002000, 0x0000000000002000, 0x0000000000002000,248      0x0000020000000000, 0x0000020000000000, 0x0000020000000000, 0x0000020000000000,249      0x0000020000002000, 0x0000020000002000, 0x0000020000002000, 0x0000020000002000, ),250    ( 0x0000000000000000, 0x0000000000000800, 0x0000000100000000, 0x0000000100000800,251      0x0000000010000000, 0x0000000010000800, 0x0000000110000000, 0x0000000110000800,252      0x0000000000000004, 0x0000000000000804, 0x0000000100000004, 0x0000000100000804,253      0x0000000010000004, 0x0000000010000804, 0x0000000110000004, 0x0000000110000804, ),254    ( 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000,255      0x0000000000001000, 0x0000000000001000, 0x0000000000001000, 0x0000000000001000,256      0x0000000000000010, 0x0000000000000010, 0x0000000000000010, 0x0000000000000010,257      0x0000000000001010, 0x0000000000001010, 0x0000000000001010, 0x0000000000001010, ),258    ( 0x0000000000000000, 0x0000000000000040, 0x0000010000000000, 0x0000010000000040,259      0x0000000000200000, 0x0000000000200040, 0x0000010000200000, 0x0000010000200040,260      0x0000000000008000, 0x0000000000008040, 0x0000010000008000, 0x0000010000008040,261      0x0000000000208000, 0x0000000000208040, 0x0000010000208000, 0x0000010000208040, ),262    ( 0x0000000000000000, 0x0000000004000000, 0x0000000008000000, 0x000000000c000000,263      0x0400000000000000, 0x0400000004000000, 0x0400000008000000, 0x040000000c000000,264      0x8000000000000000, 0x8000000004000000, 0x8000000008000000, 0x800000000c000000,265      0x8400000000000000, 0x8400000004000000, 0x8400000008000000, 0x840000000c000000, ),266    ( 0x0000000000000000, 0x0002000000000000, 0x0200000000000000, 0x0202000000000000,267      0x1000000000000000, 0x1002000000000000, 0x1200000000000000, 0x1202000000000000,268      0x0008000000000000, 0x000a000000000000, 0x0208000000000000, 0x020a000000000000,269      0x1008000000000000, 0x100a000000000000, 0x1208000000000000, 0x120a000000000000, ),270    ( 0x0000000000000000, 0x0000000000400000, 0x0000000000000020, 0x0000000000400020,271      0x0040000000000000, 0x0040000000400000, 0x0040000000000020, 0x0040000000400020,272      0x0800000000000000, 0x0800000000400000, 0x0800000000000020, 0x0800000000400020,273      0x0840000000000000, 0x0840000000400000, 0x0840000000000020, 0x0840000000400020, ),274    ( 0x0000000000000000, 0x0080000000000000, 0x0000008000000000, 0x0080008000000000,275      0x2000000000000000, 0x2080000000000000, 0x2000008000000000, 0x2080008000000000,276      0x0020000000000000, 0x00a0000000000000, 0x0020008000000000, 0x00a0008000000000,277      0x2020000000000000, 0x20a0000000000000, 0x2020008000000000, 0x20a0008000000000, ),278    ( 0x0000000000000000, 0x0000002000000000, 0x0000040000000000, 0x0000042000000000,279      0x4000000000000000, 0x4000002000000000, 0x4000040000000000, 0x4000042000000000,280      0x0000400000000000, 0x0000402000000000, 0x0000440000000000, 0x0000442000000000,281      0x4000400000000000, 0x4000402000000000, 0x4000440000000000, 0x4000442000000000, ),282    ( 0x0000000000000000, 0x0000004000000000, 0x0000200000000000, 0x0000204000000000,283      0x0000080000000000, 0x0000084000000000, 0x0000280000000000, 0x0000284000000000,284      0x0000800000000000, 0x0000804000000000, 0x0000a00000000000, 0x0000a04000000000,285      0x0000880000000000, 0x0000884000000000, 0x0000a80000000000, 0x0000a84000000000, ),286    ( 0x0000000000000000, 0x0000000800000000, 0x0000000400000000, 0x0000000c00000000,287      0x0000100000000000, 0x0000100800000000, 0x0000100400000000, 0x0000100c00000000,288      0x0010000000000000, 0x0010000800000000, 0x0010000400000000, 0x0010000c00000000,289      0x0010100000000000, 0x0010100800000000, 0x0010100400000000, 0x0010100c00000000, ),290    ( 0x0000000000000000, 0x0100000000000000, 0x0001000000000000, 0x0101000000000000,291      0x0000001000000000, 0x0100001000000000, 0x0001001000000000, 0x0101001000000000,292      0x0004000000000000, 0x0104000000000000, 0x0005000000000000, 0x0105000000000000,293      0x0004001000000000, 0x0104001000000000, 0x0005001000000000, 0x0105001000000000, ),294        )295    #---------------------------------------------------------------296    # PCXROT - PC1ROT, PC2ROTA, PC2ROTB listed in order297    # of the PC1 rotation schedule, as used by des_setkey298    #---------------------------------------------------------------299    ##ROTATES = (1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1)300    ##PCXROT = (301    ##        PC1ROT,  PC2ROTA, PC2ROTB, PC2ROTB,302    ##        PC2ROTB, PC2ROTB, PC2ROTB, PC2ROTB,303    ##        PC2ROTA, PC2ROTB, PC2ROTB, PC2ROTB,304    ##        PC2ROTB, PC2ROTB, PC2ROTB, PC2ROTA,305    ##        )306 307    # NOTE: modified PCXROT to contain entrys broken into pairs,308    #       to help generate them in format best used by encoder.309    PCXROT = (310            (PC1ROT,  PC2ROTA), (PC2ROTB, PC2ROTB),311            (PC2ROTB, PC2ROTB), (PC2ROTB, PC2ROTB),312            (PC2ROTA, PC2ROTB), (PC2ROTB, PC2ROTB),313            (PC2ROTB, PC2ROTB), (PC2ROTB, PC2ROTA),314            )315 316    #---------------------------------------------------------------317    # Bit reverse, intial permupation, expantion318    # Initial permutation/expansion table319    #---------------------------------------------------------------320    # NOTE: this was reordered from original table to make perm3264 logic simpler321    IE3264=(322    ( 0x0000000000000000, 0x0000000000800800, 0x0000000000008008, 0x0000000000808808,323      0x0000008008000000, 0x0000008008800800, 0x0000008008008008, 0x0000008008808808,324      0x0000000080080000, 0x0000000080880800, 0x0000000080088008, 0x0000000080888808,325      0x0000008088080000, 0x0000008088880800, 0x0000008088088008, 0x0000008088888808, ),326    ( 0x0000000000000000, 0x0080080000000000, 0x0000800800000000, 0x0080880800000000,327      0x0800000000000080, 0x0880080000000080, 0x0800800800000080, 0x0880880800000080,328      0x8008000000000000, 0x8088080000000000, 0x8008800800000000, 0x8088880800000000,329      0x8808000000000080, 0x8888080000000080, 0x8808800800000080, 0x8888880800000080, ),330    ( 0x0000000000000000, 0x0000000000001000, 0x0000000000000010, 0x0000000000001010,331      0x0000000010000000, 0x0000000010001000, 0x0000000010000010, 0x0000000010001010,332      0x0000000000100000, 0x0000000000101000, 0x0000000000100010, 0x0000000000101010,333      0x0000000010100000, 0x0000000010101000, 0x0000000010100010, 0x0000000010101010, ),334    ( 0x0000000000000000, 0x0000100000000000, 0x0000001000000000, 0x0000101000000000,335      0x1000000000000000, 0x1000100000000000, 0x1000001000000000, 0x1000101000000000,336      0x0010000000000000, 0x0010100000000000, 0x0010001000000000, 0x0010101000000000,337      0x1010000000000000, 0x1010100000000000, 0x1010001000000000, 0x1010101000000000, ),338    ( 0x0000000000000000, 0x0000000000002000, 0x0000000000000020, 0x0000000000002020,339      0x0000000020000000, 0x0000000020002000, 0x0000000020000020, 0x0000000020002020,340      0x0000000000200000, 0x0000000000202000, 0x0000000000200020, 0x0000000000202020,341      0x0000000020200000, 0x0000000020202000, 0x0000000020200020, 0x0000000020202020, ),342    ( 0x0000000000000000, 0x0000200000000000, 0x0000002000000000, 0x0000202000000000,343      0x2000000000000000, 0x2000200000000000, 0x2000002000000000, 0x2000202000000000,344      0x0020000000000000, 0x0020200000000000, 0x0020002000000000, 0x0020202000000000,345      0x2020000000000000, 0x2020200000000000, 0x2020002000000000, 0x2020202000000000, ),346    ( 0x0000000000000000, 0x0000000000004004, 0x0400000000000040, 0x0400000000004044,347      0x0000000040040000, 0x0000000040044004, 0x0400000040040040, 0x0400000040044044,348      0x0000000000400400, 0x0000000000404404, 0x0400000000400440, 0x0400000000404444,349      0x0000000040440400, 0x0000000040444404, 0x0400000040440440, 0x0400000040444444, ),350    ( 0x0000000000000000, 0x0000400400000000, 0x0000004004000000, 0x0000404404000000,351      0x4004000000000000, 0x4004400400000000, 0x4004004004000000, 0x4004404404000000,352      0x0040040000000000, 0x0040440400000000, 0x0040044004000000, 0x0040444404000000,353      0x4044040000000000, 0x4044440400000000, 0x4044044004000000, 0x4044444404000000, ),354        )355 356    #---------------------------------------------------------------357    # Table that combines the S, P, and E operations.358    #---------------------------------------------------------------359    SPE=(360    ( 0x0080088008200000, 0x0000008008000000, 0x0000000000200020, 0x0080088008200020,361      0x0000000000200000, 0x0080088008000020, 0x0000008008000020, 0x0000000000200020,362      0x0080088008000020, 0x0080088008200000, 0x0000008008200000, 0x0080080000000020,363      0x0080080000200020, 0x0000000000200000, 0x0000000000000000, 0x0000008008000020,364      0x0000008008000000, 0x0000000000000020, 0x0080080000200000, 0x0080088008000000,365      0x0080088008200020, 0x0000008008200000, 0x0080080000000020, 0x0080080000200000,366      0x0000000000000020, 0x0080080000000000, 0x0080088008000000, 0x0000008008200020,367      0x0080080000000000, 0x0080080000200020, 0x0000008008200020, 0x0000000000000000,368      0x0000000000000000, 0x0080088008200020, 0x0080080000200000, 0x0000008008000020,369      0x0080088008200000, 0x0000008008000000, 0x0080080000000020, 0x0080080000200000,370      0x0000008008200020, 0x0080080000000000, 0x0080088008000000, 0x0000000000200020,371      0x0080088008000020, 0x0000000000000020, 0x0000000000200020, 0x0000008008200000,372      0x0080088008200020, 0x0080088008000000, 0x0000008008200000, 0x0080080000200020,373      0x0000000000200000, 0x0080080000000020, 0x0000008008000020, 0x0000000000000000,374      0x0000008008000000, 0x0000000000200000, 0x0080080000200020, 0x0080088008200000,375      0x0000000000000020, 0x0000008008200020, 0x0080080000000000, 0x0080088008000020, ),376    ( 0x1000800810004004, 0x0000000000000000, 0x0000800810000000, 0x0000000010004004,377      0x1000000000004004, 0x1000800800000000, 0x0000800800004004, 0x0000800810000000,378      0x0000800800000000, 0x1000000010004004, 0x1000000000000000, 0x0000800800004004,379      0x1000000010000000, 0x0000800810004004, 0x0000000010004004, 0x1000000000000000,380      0x0000000010000000, 0x1000800800004004, 0x1000000010004004, 0x0000800800000000,381      0x1000800810000000, 0x0000000000004004, 0x0000000000000000, 0x1000000010000000,382      0x1000800800004004, 0x1000800810000000, 0x0000800810004004, 0x1000000000004004,383      0x0000000000004004, 0x0000000010000000, 0x1000800800000000, 0x1000800810004004,384      0x1000000010000000, 0x0000800810004004, 0x0000800800004004, 0x1000800810000000,385      0x1000800810004004, 0x1000000010000000, 0x1000000000004004, 0x0000000000000000,386      0x0000000000004004, 0x1000800800000000, 0x0000000010000000, 0x1000000010004004,387      0x0000800800000000, 0x0000000000004004, 0x1000800810000000, 0x1000800800004004,388      0x0000800810004004, 0x0000800800000000, 0x0000000000000000, 0x1000000000004004,389      0x1000000000000000, 0x1000800810004004, 0x0000800810000000, 0x0000000010004004,390      0x1000000010004004, 0x0000000010000000, 0x1000800800000000, 0x0000800800004004,391      0x1000800800004004, 0x1000000000000000, 0x0000000010004004, 0x0000800810000000, ),392    ( 0x0000000000400410, 0x0010004004400400, 0x0010000000000000, 0x0010000000400410,393      0x0000004004000010, 0x0000000000400400, 0x0010000000400410, 0x0010004004000000,394      0x0010000000400400, 0x0000004004000000, 0x0000004004400400, 0x0000000000000010,395      0x0010004004400410, 0x0010000000000010, 0x0000000000000010, 0x0000004004400410,396      0x0000000000000000, 0x0000004004000010, 0x0010004004400400, 0x0010000000000000,397      0x0010000000000010, 0x0010004004400410, 0x0000004004000000, 0x0000000000400410,398      0x0000004004400410, 0x0010000000400400, 0x0010004004000010, 0x0000004004400400,399      0x0010004004000000, 0x0000000000000000, 0x0000000000400400, 0x0010004004000010,400      0x0010004004400400, 0x0010000000000000, 0x0000000000000010, 0x0000004004000000,401      0x0010000000000010, 0x0000004004000010, 0x0000004004400400, 0x0010000000400410,402      0x0000000000000000, 0x0010004004400400, 0x0010004004000000, 0x0000004004400410,403      0x0000004004000010, 0x0000000000400400, 0x0010004004400410, 0x0000000000000010,404      0x0010004004000010, 0x0000000000400410, 0x0000000000400400, 0x0010004004400410,405      0x0000004004000000, 0x0010000000400400, 0x0010000000400410, 0x0010004004000000,406      0x0010000000400400, 0x0000000000000000, 0x0000004004400410, 0x0010000000000010,407      0x0000000000400410, 0x0010004004000010, 0x0010000000000000, 0x0000004004400400, ),408    ( 0x0800100040040080, 0x0000100000001000, 0x0800000000000080, 0x0800100040041080,409      0x0000000000000000, 0x0000000040041000, 0x0800100000001080, 0x0800000040040080,410      0x0000100040041000, 0x0800000000001080, 0x0000000000001000, 0x0800100000000080,411      0x0800000000001080, 0x0800100040040080, 0x0000000040040000, 0x0000000000001000,412      0x0800000040041080, 0x0000100040040000, 0x0000100000000000, 0x0800000000000080,413      0x0000100040040000, 0x0800100000001080, 0x0000000040041000, 0x0000100000000000,414      0x0800100000000080, 0x0000000000000000, 0x0800000040040080, 0x0000100040041000,415      0x0000100000001000, 0x0800000040041080, 0x0800100040041080, 0x0000000040040000,416      0x0800000040041080, 0x0800100000000080, 0x0000000040040000, 0x0800000000001080,417      0x0000100040040000, 0x0000100000001000, 0x0800000000000080, 0x0000000040041000,418      0x0800100000001080, 0x0000000000000000, 0x0000100000000000, 0x0800000040040080,419      0x0000000000000000, 0x0800000040041080, 0x0000100040041000, 0x0000100000000000,420      0x0000000000001000, 0x0800100040041080, 0x0800100040040080, 0x0000000040040000,421      0x0800100040041080, 0x0800000000000080, 0x0000100000001000, 0x0800100040040080,422      0x0800000040040080, 0x0000100040040000, 0x0000000040041000, 0x0800100000001080,423      0x0800100000000080, 0x0000000000001000, 0x0800000000001080, 0x0000100040041000, ),424    ( 0x0000000000800800, 0x0000001000000000, 0x0040040000000000, 0x2040041000800800,425      0x2000001000800800, 0x0040040000800800, 0x2040041000000000, 0x0000001000800800,426      0x0000001000000000, 0x2000000000000000, 0x2000000000800800, 0x0040041000000000,427      0x2040040000800800, 0x2000001000800800, 0x0040041000800800, 0x0000000000000000,428      0x0040041000000000, 0x0000000000800800, 0x2000001000000000, 0x2040040000000000,429      0x0040040000800800, 0x2040041000000000, 0x0000000000000000, 0x2000000000800800,430      0x2000000000000000, 0x2040040000800800, 0x2040041000800800, 0x2000001000000000,431      0x0000001000800800, 0x0040040000000000, 0x2040040000000000, 0x0040041000800800,432      0x0040041000800800, 0x2040040000800800, 0x2000001000000000, 0x0000001000800800,433      0x0000001000000000, 0x2000000000000000, 0x2000000000800800, 0x0040040000800800,434      0x0000000000800800, 0x0040041000000000, 0x2040041000800800, 0x0000000000000000,435      0x2040041000000000, 0x0000000000800800, 0x0040040000000000, 0x2000001000000000,436      0x2040040000800800, 0x0040040000000000, 0x0000000000000000, 0x2040041000800800,437      0x2000001000800800, 0x0040041000800800, 0x2040040000000000, 0x0000001000000000,438      0x0040041000000000, 0x2000001000800800, 0x0040040000800800, 0x2040040000000000,439      0x2000000000000000, 0x2040041000000000, 0x0000001000800800, 0x2000000000800800, ),440    ( 0x4004000000008008, 0x4004000020000000, 0x0000000000000000, 0x0000200020008008,441      0x4004000020000000, 0x0000200000000000, 0x4004200000008008, 0x0000000020000000,442      0x4004200000000000, 0x4004200020008008, 0x0000200020000000, 0x0000000000008008,443      0x0000200000008008, 0x4004000000008008, 0x0000000020008008, 0x4004200020000000,444      0x0000000020000000, 0x4004200000008008, 0x4004000020008008, 0x0000000000000000,445      0x0000200000000000, 0x4004000000000000, 0x0000200020008008, 0x4004000020008008,446      0x4004200020008008, 0x0000000020008008, 0x0000000000008008, 0x4004200000000000,447      0x4004000000000000, 0x0000200020000000, 0x4004200020000000, 0x0000200000008008,448      0x4004200000000000, 0x0000000000008008, 0x0000200000008008, 0x4004200020000000,449      0x0000200020008008, 0x4004000020000000, 0x0000000000000000, 0x0000200000008008,450      0x0000000000008008, 0x0000200000000000, 0x4004000020008008, 0x0000000020000000,451      0x4004000020000000, 0x4004200020008008, 0x0000200020000000, 0x4004000000000000,452      0x4004200020008008, 0x0000200020000000, 0x0000000020000000, 0x4004200000008008,453      0x4004000000008008, 0x0000000020008008, 0x4004200020000000, 0x0000000000000000,454      0x0000200000000000, 0x4004000000008008, 0x4004200000008008, 0x0000200020008008,455      0x0000000020008008, 0x4004200000000000, 0x4004000000000000, 0x4004000020008008, ),456    ( 0x0000400400000000, 0x0020000000000000, 0x0020000000100000, 0x0400000000100040,457      0x0420400400100040, 0x0400400400000040, 0x0020400400000000, 0x0000000000000000,458      0x0000000000100000, 0x0420000000100040, 0x0420000000000040, 0x0000400400100000,459      0x0400000000000040, 0x0020400400100000, 0x0000400400100000, 0x0420000000000040,460      0x0420000000100040, 0x0000400400000000, 0x0400400400000040, 0x0420400400100040,461      0x0000000000000000, 0x0020000000100000, 0x0400000000100040, 0x0020400400000000,462      0x0400400400100040, 0x0420400400000040, 0x0020400400100000, 0x0400000000000040,463      0x0420400400000040, 0x0400400400100040, 0x0020000000000000, 0x0000000000100000,464      0x0420400400000040, 0x0000400400100000, 0x0400400400100040, 0x0420000000000040,465      0x0000400400000000, 0x0020000000000000, 0x0000000000100000, 0x0400400400100040,466      0x0420000000100040, 0x0420400400000040, 0x0020400400000000, 0x0000000000000000,467      0x0020000000000000, 0x0400000000100040, 0x0400000000000040, 0x0020000000100000,468      0x0000000000000000, 0x0420000000100040, 0x0020000000100000, 0x0020400400000000,469      0x0420000000000040, 0x0000400400000000, 0x0420400400100040, 0x0000000000100000,470      0x0020400400100000, 0x0400000000000040, 0x0400400400000040, 0x0420400400100040,471      0x0400000000100040, 0x0020400400100000, 0x0000400400100000, 0x0400400400000040, ),472    ( 0x8008000080082000, 0x0000002080082000, 0x8008002000000000, 0x0000000000000000,473      0x0000002000002000, 0x8008000080080000, 0x0000000080082000, 0x8008002080082000,474      0x8008000000000000, 0x0000000000002000, 0x0000002080080000, 0x8008002000000000,475      0x8008002080080000, 0x8008002000002000, 0x8008000000002000, 0x0000000080082000,476      0x0000002000000000, 0x8008002080080000, 0x8008000080080000, 0x0000002000002000,477      0x8008002080082000, 0x8008000000002000, 0x0000000000000000, 0x0000002080080000,478      0x0000000000002000, 0x0000000080080000, 0x8008002000002000, 0x8008000080082000,479      0x0000000080080000, 0x0000002000000000, 0x0000002080082000, 0x8008000000000000,480      0x0000000080080000, 0x0000002000000000, 0x8008000000002000, 0x8008002080082000,481      0x8008002000000000, 0x0000000000002000, 0x0000000000000000, 0x0000002080080000,482      0x8008000080082000, 0x8008002000002000, 0x0000002000002000, 0x8008000080080000,483      0x0000002080082000, 0x8008000000000000, 0x8008000080080000, 0x0000002000002000,484      0x8008002080082000, 0x0000000080080000, 0x0000000080082000, 0x8008000000002000,485      0x0000002080080000, 0x8008002000000000, 0x8008002000002000, 0x0000000080082000,486      0x8008000000000000, 0x0000002080082000, 0x8008002080080000, 0x0000000000000000,487      0x0000000000002000, 0x8008000080082000, 0x0000002000000000, 0x8008002080080000, ),488        )489 490    #---------------------------------------------------------------491    # compressed/interleaved => final permutation table492    # Compression, final permutation, bit reverse493    #---------------------------------------------------------------494    # NOTE: this was reordered from original table to make perm6464 logic simpler495    CF6464=(496    ( 0x0000000000000000, 0x0000002000000000, 0x0000200000000000, 0x0000202000000000,497      0x0020000000000000, 0x0020002000000000, 0x0020200000000000, 0x0020202000000000,498      0x2000000000000000, 0x2000002000000000, 0x2000200000000000, 0x2000202000000000,499      0x2020000000000000, 0x2020002000000000, 0x2020200000000000, 0x2020202000000000, ),500    ( 0x0000000000000000, 0x0000000200000000, 0x0000020000000000, 0x0000020200000000,501      0x0002000000000000, 0x0002000200000000, 0x0002020000000000, 0x0002020200000000,502      0x0200000000000000, 0x0200000200000000, 0x0200020000000000, 0x0200020200000000,503      0x0202000000000000, 0x0202000200000000, 0x0202020000000000, 0x0202020200000000, ),504    ( 0x0000000000000000, 0x0000000000000020, 0x0000000000002000, 0x0000000000002020,505      0x0000000000200000, 0x0000000000200020, 0x0000000000202000, 0x0000000000202020,506      0x0000000020000000, 0x0000000020000020, 0x0000000020002000, 0x0000000020002020,507      0x0000000020200000, 0x0000000020200020, 0x0000000020202000, 0x0000000020202020, ),508    ( 0x0000000000000000, 0x0000000000000002, 0x0000000000000200, 0x0000000000000202,509      0x0000000000020000, 0x0000000000020002, 0x0000000000020200, 0x0000000000020202,510      0x0000000002000000, 0x0000000002000002, 0x0000000002000200, 0x0000000002000202,511      0x0000000002020000, 0x0000000002020002, 0x0000000002020200, 0x0000000002020202, ),512    ( 0x0000000000000000, 0x0000008000000000, 0x0000800000000000, 0x0000808000000000,513      0x0080000000000000, 0x0080008000000000, 0x0080800000000000, 0x0080808000000000,514      0x8000000000000000, 0x8000008000000000, 0x8000800000000000, 0x8000808000000000,515      0x8080000000000000, 0x8080008000000000, 0x8080800000000000, 0x8080808000000000, ),516    ( 0x0000000000000000, 0x0000000800000000, 0x0000080000000000, 0x0000080800000000,517      0x0008000000000000, 0x0008000800000000, 0x0008080000000000, 0x0008080800000000,518      0x0800000000000000, 0x0800000800000000, 0x0800080000000000, 0x0800080800000000,519      0x0808000000000000, 0x0808000800000000, 0x0808080000000000, 0x0808080800000000, ),520    ( 0x0000000000000000, 0x0000000000000080, 0x0000000000008000, 0x0000000000008080,521      0x0000000000800000, 0x0000000000800080, 0x0000000000808000, 0x0000000000808080,522      0x0000000080000000, 0x0000000080000080, 0x0000000080008000, 0x0000000080008080,523      0x0000000080800000, 0x0000000080800080, 0x0000000080808000, 0x0000000080808080, ),524    ( 0x0000000000000000, 0x0000000000000008, 0x0000000000000800, 0x0000000000000808,525      0x0000000000080000, 0x0000000000080008, 0x0000000000080800, 0x0000000000080808,526      0x0000000008000000, 0x0000000008000008, 0x0000000008000800, 0x0000000008000808,527      0x0000000008080000, 0x0000000008080008, 0x0000000008080800, 0x0000000008080808, ),528    ( 0x0000000000000000, 0x0000001000000000, 0x0000100000000000, 0x0000101000000000,529      0x0010000000000000, 0x0010001000000000, 0x0010100000000000, 0x0010101000000000,530      0x1000000000000000, 0x1000001000000000, 0x1000100000000000, 0x1000101000000000,531      0x1010000000000000, 0x1010001000000000, 0x1010100000000000, 0x1010101000000000, ),532    ( 0x0000000000000000, 0x0000000100000000, 0x0000010000000000, 0x0000010100000000,533      0x0001000000000000, 0x0001000100000000, 0x0001010000000000, 0x0001010100000000,534      0x0100000000000000, 0x0100000100000000, 0x0100010000000000, 0x0100010100000000,535      0x0101000000000000, 0x0101000100000000, 0x0101010000000000, 0x0101010100000000, ),536    ( 0x0000000000000000, 0x0000000000000010, 0x0000000000001000, 0x0000000000001010,537      0x0000000000100000, 0x0000000000100010, 0x0000000000101000, 0x0000000000101010,538      0x0000000010000000, 0x0000000010000010, 0x0000000010001000, 0x0000000010001010,539      0x0000000010100000, 0x0000000010100010, 0x0000000010101000, 0x0000000010101010, ),540    ( 0x0000000000000000, 0x0000000000000001, 0x0000000000000100, 0x0000000000000101,541      0x0000000000010000, 0x0000000000010001, 0x0000000000010100, 0x0000000000010101,542      0x0000000001000000, 0x0000000001000001, 0x0000000001000100, 0x0000000001000101,543      0x0000000001010000, 0x0000000001010001, 0x0000000001010100, 0x0000000001010101, ),544    ( 0x0000000000000000, 0x0000004000000000, 0x0000400000000000, 0x0000404000000000,545      0x0040000000000000, 0x0040004000000000, 0x0040400000000000, 0x0040404000000000,546      0x4000000000000000, 0x4000004000000000, 0x4000400000000000, 0x4000404000000000,547      0x4040000000000000, 0x4040004000000000, 0x4040400000000000, 0x4040404000000000, ),548    ( 0x0000000000000000, 0x0000000400000000, 0x0000040000000000, 0x0000040400000000,549      0x0004000000000000, 0x0004000400000000, 0x0004040000000000, 0x0004040400000000,550      0x0400000000000000, 0x0400000400000000, 0x0400040000000000, 0x0400040400000000,551      0x0404000000000000, 0x0404000400000000, 0x0404040000000000, 0x0404040400000000, ),552    ( 0x0000000000000000, 0x0000000000000040, 0x0000000000004000, 0x0000000000004040,553      0x0000000000400000, 0x0000000000400040, 0x0000000000404000, 0x0000000000404040,554      0x0000000040000000, 0x0000000040000040, 0x0000000040004000, 0x0000000040004040,555      0x0000000040400000, 0x0000000040400040, 0x0000000040404000, 0x0000000040404040, ),556    ( 0x0000000000000000, 0x0000000000000004, 0x0000000000000400, 0x0000000000000404,557      0x0000000000040000, 0x0000000000040004, 0x0000000000040400, 0x0000000000040404,558      0x0000000004000000, 0x0000000004000004, 0x0000000004000400, 0x0000000004000404,559      0x0000000004040000, 0x0000000004040004, 0x0000000004040400, 0x0000000004040404, ),560    )561    #===================================================================562    # eof _load_tables()563    #===================================================================564 565#=============================================================================566# support567#=============================================================================568 569def _permute(c, p):570    """Returns the permutation of the given 32-bit or 64-bit code with571    the specified permutation table."""572    # NOTE: only difference between 32 & 64 bit permutations573    #       is that len(p)==8 for 32 bit, and len(p)==16 for 64 bit.574    out = 0575    for r in p:576        out |= r[c&0xf]577        c >>= 4578    return out579 580#=============================================================================581# packing & unpacking582#=============================================================================583# FIXME: more properly named _uint8_struct...584_uint64_struct = struct.Struct(">Q")585 586def _pack64(value):587    return _uint64_struct.pack(value)588 589def _unpack64(value):590    return _uint64_struct.unpack(value)[0]591 592def _pack56(value):593    return _uint64_struct.pack(value)[1:]594 595def _unpack56(value):596    return _uint64_struct.unpack(b'\x00' + value)[0]597 598#=============================================================================599# 56->64 key manipulation600#=============================================================================601 602##def expand_7bit(value):603##    "expand 7-bit integer => 7-bits + 1 odd-parity bit"604##    # parity calc adapted from 32-bit even parity alg found at605##    # http://graphics.stanford.edu/~seander/bithacks.html#ParityParallel606##    assert 0 <= value < 0x80, "value out of range"607##    return (value<<1) | (0x9669 >> ((value ^ (value >> 4)) & 0xf)) & 1608 609_EXPAND_ITER = irange(49,-7,-7)610 611def expand_des_key(key):612    """convert DES from 7 bytes to 8 bytes (by inserting empty parity bits)"""613    if isinstance(key, bytes):614        if len(key) != 7:615            raise ValueError("key must be 7 bytes in size")616    elif isinstance(key, int_types):617        if key < 0 or key > INT_56_MASK:618            raise ValueError("key must be 56-bit non-negative integer")619        return _unpack64(expand_des_key(_pack56(key)))620    else:621        raise exc.ExpectedTypeError(key, "bytes or int", "key")622    key = _unpack56(key)623    # NOTE: the following would insert correctly-valued parity bits in each key,624    # but the parity bit would just be ignored in des_encrypt_block(),625    # so not bothering to use it.626    # XXX: could make parity-restoring optionally available via flag627    ##return join_byte_values(expand_7bit((key >> shift) & 0x7f)628    ##                        for shift in _EXPAND_ITER)629    return join_byte_values(((key>>shift) & 0x7f)<<1 for shift in _EXPAND_ITER)630 631def shrink_des_key(key):632    """convert DES key from 8 bytes to 7 bytes (by discarding the parity bits)"""633    if isinstance(key, bytes):634        if len(key) != 8:635            raise ValueError("key must be 8 bytes in size")636        return _pack56(shrink_des_key(_unpack64(key)))637    elif isinstance(key, int_types):638        if key < 0 or key > INT_64_MASK:639            raise ValueError("key must be 64-bit non-negative integer")640    else:641        raise exc.ExpectedTypeError(key, "bytes or int", "key")642    key >>= 1643    result = 0644    offset = 0645    while offset < 56:646        result |= (key & 0x7f)<<offset647        key >>= 8648        offset += 7649    assert not (result & ~INT_64_MASK)650    return result651 652#=============================================================================653# des encryption654#=============================================================================655def des_encrypt_block(key, input, salt=0, rounds=1):656    """encrypt single block of data using DES, operates on 8-byte strings.657 658    :arg key:659        DES key as 7 byte string, or 8 byte string with parity bits660        (parity bit values are ignored).661 662    :arg input:663        plaintext block to encrypt, as 8 byte string.664 665    :arg salt:666        Optional 24-bit integer used to mutate the base DES algorithm in a667        manner specific to :class:`~passlib.hash.des_crypt` and its variants.668        The default value ``0`` provides the normal (unsalted) DES behavior.669        The salt functions as follows:670        if the ``i``'th bit of ``salt`` is set,671        bits ``i`` and ``i+24`` are swapped in the DES E-box output.672 673    :arg rounds:674        Optional number of rounds of to apply the DES key schedule.675        the default (``rounds=1``) provides the normal DES behavior,676        but :class:`~passlib.hash.des_crypt` and its variants use677        alternate rounds values.678 679    :raises TypeError: if any of the provided args are of the wrong type.680    :raises ValueError:681        if any of the input blocks are the wrong size,682        or the salt/rounds values are out of range.683 684    :returns:685        resulting 8-byte ciphertext block.686    """687    # validate & unpack key688    if isinstance(key, bytes):689        if len(key) == 7:690            key = expand_des_key(key)691        elif len(key) != 8:692            raise ValueError("key must be 7 or 8 bytes")693        key = _unpack64(key)694    else:695        raise exc.ExpectedTypeError(key, "bytes", "key")696 697    # validate & unpack input698    if isinstance(input, bytes):699        if len(input) != 8:700            raise ValueError("input block must be 8 bytes")701        input = _unpack64(input)702    else:703        raise exc.ExpectedTypeError(input, "bytes", "input")704 705    # hand things off to other func706    result = des_encrypt_int_block(key, input, salt, rounds)707 708    # repack result709    return _pack64(result)710 711def des_encrypt_int_block(key, input, salt=0, rounds=1):712    """encrypt single block of data using DES, operates on 64-bit integers.713 714    this function is essentially the same as :func:`des_encrypt_block`,715    except that it operates on integers, and will NOT automatically716    expand 56-bit keys if provided (since there's no way to detect them).717 718    :arg key:719        DES key as 64-bit integer (the parity bits are ignored).720 721    :arg input:722        input block as 64-bit integer723 724    :arg salt:725        optional 24-bit integer used to mutate the base DES algorithm.726        defaults to ``0`` (no mutation applied).727 728    :arg rounds:729        optional number of rounds of to apply the DES key schedule.730        defaults to ``1``.731 732    :raises TypeError: if any of the provided args are of the wrong type.733    :raises ValueError:734        if any of the input blocks are the wrong size,735        or the salt/rounds values are out of range.736 737    :returns:738        resulting ciphertext as 64-bit integer.739    """740    #---------------------------------------------------------------741    # input validation742    #---------------------------------------------------------------743 744    # validate salt, rounds745    if rounds < 1:746        raise ValueError("rounds must be positive integer")747    if salt < 0 or salt > INT_24_MASK:748        raise ValueError("salt must be 24-bit non-negative integer")749 750    # validate & unpack key751    if not isinstance(key, int_types):752        raise exc.ExpectedTypeError(key, "int", "key")753    elif key < 0 or key > INT_64_MASK:754        raise ValueError("key must be 64-bit non-negative integer")755 756    # validate & unpack input757    if not isinstance(input, int_types):758        raise exc.ExpectedTypeError(input, "int", "input")759    elif input < 0 or input > INT_64_MASK:760        raise ValueError("input must be 64-bit non-negative integer")761 762    #---------------------------------------------------------------763    # DES setup764    #---------------------------------------------------------------765    # load tables if not already done766    global SPE, PCXROT, IE3264, CF6464767    if PCXROT is None:768        _load_tables()769 770    # load SPE into local vars to speed things up and remove an array access call771    SPE0, SPE1, SPE2, SPE3, SPE4, SPE5, SPE6, SPE7 = SPE772 773    # NOTE: parity bits are ignored completely774    # (UTs do fuzz testing to ensure this)775 776    # generate key schedule777    # NOTE: generation was modified to output two elements at a time,778    # so that per-round loop could do two passes at once.779    def _iter_key_schedule(ks_odd):780        """given 64-bit key, iterates over the 8 (even,odd) key schedule pairs"""781        for p_even, p_odd in PCXROT:782            ks_even = _permute(ks_odd, p_even)783            ks_odd = _permute(ks_even, p_odd)784            yield ks_even & _KS_MASK, ks_odd & _KS_MASK785    ks_list = list(_iter_key_schedule(key))786 787    # expand 24 bit salt -> 32 bit per des_crypt & bsdi_crypt788    salt = (789        ((salt & 0x00003f) << 26) |790        ((salt & 0x000fc0) << 12) |791        ((salt & 0x03f000) >> 2) |792        ((salt & 0xfc0000) >> 16)793        )794 795    # init L & R796    if input == 0:797        L = R = 0798    else:799        L = ((input >> 31) & 0xaaaaaaaa) | (input & 0x55555555)800        L = _permute(L, IE3264)801 802        R = ((input >> 32) & 0xaaaaaaaa) | ((input >> 1) & 0x55555555)803        R = _permute(R, IE3264)804 805    #---------------------------------------------------------------806    # main DES loop - run for specified number of rounds807    #---------------------------------------------------------------808    while rounds:809        rounds -= 1810 811        # run over each part of the schedule, 2 parts at a time812        for ks_even, ks_odd in ks_list:813            k = ((R>>32) ^ R) & salt # use the salt to flip specific bits814            B = (k<<32) ^ k ^ R ^ ks_even815 816            L ^= (SPE0[(B>>58)&0x3f] ^ SPE1[(B>>50)&0x3f] ^817                  SPE2[(B>>42)&0x3f] ^ SPE3[(B>>34)&0x3f] ^818                  SPE4[(B>>26)&0x3f] ^ SPE5[(B>>18)&0x3f] ^819                  SPE6[(B>>10)&0x3f] ^ SPE7[(B>>2)&0x3f])820 821            k = ((L>>32) ^ L) & salt # use the salt to flip specific bits822            B = (k<<32) ^ k ^ L ^ ks_odd823 824            R ^= (SPE0[(B>>58)&0x3f] ^ SPE1[(B>>50)&0x3f] ^825                  SPE2[(B>>42)&0x3f] ^ SPE3[(B>>34)&0x3f] ^826                  SPE4[(B>>26)&0x3f] ^ SPE5[(B>>18)&0x3f] ^827                  SPE6[(B>>10)&0x3f] ^ SPE7[(B>>2)&0x3f])828 829        # swap L and R830        L, R = R, L831 832    #---------------------------------------------------------------833    # return final result834    #---------------------------------------------------------------835    C = (836            ((L>>3) &  0x0f0f0f0f00000000)837            |838            ((L<<33) & 0xf0f0f0f000000000)839            |840            ((R>>35) & 0x000000000f0f0f0f)841            |842            ((R<<1) &  0x00000000f0f0f0f0)843        )844    return _permute(C, CF6464)845 846#=============================================================================847# eof848#=============================================================================849 
codekingpro/portable-devtools · Team Ai