codekingpro/portable-devtools
114k
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 