Statistics
| Branch: | Tag: | Revision:

root / vncauthproxy / d3des.py @ 1c241b27

History | View | Annotate | Download (13.7 kB)

1 66d17b40 Apollon Oikonomopoulos
#!/usr/bin/env python
2 66d17b40 Apollon Oikonomopoulos
##
3 66d17b40 Apollon Oikonomopoulos
##  d3des.py - DES implementation
4 66d17b40 Apollon Oikonomopoulos
##
5 66d17b40 Apollon Oikonomopoulos
##  Copyright (c) 2009 by Yusuke Shinyama
6 66d17b40 Apollon Oikonomopoulos
##
7 66d17b40 Apollon Oikonomopoulos
8 66d17b40 Apollon Oikonomopoulos
# This is a Python rewrite of d3des.c by Richard Outerbridge.
9 66d17b40 Apollon Oikonomopoulos
#
10 66d17b40 Apollon Oikonomopoulos
# I referred to the original VNC viewer code for the changes that
11 66d17b40 Apollon Oikonomopoulos
# is necessary to maintain the exact behavior of the VNC protocol.
12 66d17b40 Apollon Oikonomopoulos
# Two constants and two functions were added to the original d3des
13 66d17b40 Apollon Oikonomopoulos
# code.  These added parts were written in Python and marked
14 66d17b40 Apollon Oikonomopoulos
# below.  I believe that the added parts do not make this program
15 66d17b40 Apollon Oikonomopoulos
# a "derivative work" of the VNC viewer (which is GPL'ed and
16 66d17b40 Apollon Oikonomopoulos
# written in C), but if there's any problem, let me know.
17 66d17b40 Apollon Oikonomopoulos
#
18 66d17b40 Apollon Oikonomopoulos
# Yusuke Shinyama (yusuke at cs dot nyu dot edu)
19 66d17b40 Apollon Oikonomopoulos
20 66d17b40 Apollon Oikonomopoulos
21 66d17b40 Apollon Oikonomopoulos
#  D3DES (V5.09) -
22 66d17b40 Apollon Oikonomopoulos
#
23 66d17b40 Apollon Oikonomopoulos
#  A portable, public domain, version of the Data Encryption Standard.
24 66d17b40 Apollon Oikonomopoulos
#
25 66d17b40 Apollon Oikonomopoulos
#  Written with Symantec's THINK (Lightspeed) C by Richard Outerbridge.
26 66d17b40 Apollon Oikonomopoulos
#  Thanks to: Dan Hoey for his excellent Initial and Inverse permutation
27 66d17b40 Apollon Oikonomopoulos
#  code;  Jim Gillogly & Phil Karn for the DES key schedule code; Dennis
28 66d17b40 Apollon Oikonomopoulos
#  Ferguson, Eric Young and Dana How for comparing notes; and Ray Lau,
29 66d17b40 Apollon Oikonomopoulos
#  for humouring me on.
30 66d17b40 Apollon Oikonomopoulos
#
31 66d17b40 Apollon Oikonomopoulos
#  Copyright (c) 1988,1989,1990,1991,1992 by Richard Outerbridge.
32 66d17b40 Apollon Oikonomopoulos
#  (GEnie : OUTER; CIS : [71755,204]) Graven Imagery, 1992.
33 66d17b40 Apollon Oikonomopoulos
#
34 66d17b40 Apollon Oikonomopoulos
35 66d17b40 Apollon Oikonomopoulos
from struct import pack, unpack
36 66d17b40 Apollon Oikonomopoulos
37 66d17b40 Apollon Oikonomopoulos
38 66d17b40 Apollon Oikonomopoulos
###################################################
39 66d17b40 Apollon Oikonomopoulos
###
40 66d17b40 Apollon Oikonomopoulos
###  start: changes made for VNC.
41 66d17b40 Apollon Oikonomopoulos
###
42 66d17b40 Apollon Oikonomopoulos
43 66d17b40 Apollon Oikonomopoulos
# This constant was taken from vncviewer/rfb/vncauth.c:
44 66d17b40 Apollon Oikonomopoulos
vnckey = [ 23,82,107,6,35,78,88,7 ]
45 66d17b40 Apollon Oikonomopoulos
46 66d17b40 Apollon Oikonomopoulos
# This is a departure from the original code.
47 66d17b40 Apollon Oikonomopoulos
#bytebit = [ 0200, 0100, 040, 020, 010, 04, 02, 01 ] # original
48 66d17b40 Apollon Oikonomopoulos
bytebit = [ 01, 02, 04, 010, 020, 040, 0100, 0200 ] # VNC version
49 66d17b40 Apollon Oikonomopoulos
50 66d17b40 Apollon Oikonomopoulos
# two password functions for VNC protocol.
51 66d17b40 Apollon Oikonomopoulos
def decrypt_passwd(data):
52 66d17b40 Apollon Oikonomopoulos
    dk = deskey(pack('8B', *vnckey), True)
53 66d17b40 Apollon Oikonomopoulos
    return desfunc(data, dk)
54 66d17b40 Apollon Oikonomopoulos
55 66d17b40 Apollon Oikonomopoulos
def generate_response(passwd, challange):
56 66d17b40 Apollon Oikonomopoulos
    ek = deskey((passwd+'\x00'*8)[:8], False)
57 66d17b40 Apollon Oikonomopoulos
    return desfunc(challange[:8], ek) + desfunc(challange[8:], ek)
58 66d17b40 Apollon Oikonomopoulos
59 66d17b40 Apollon Oikonomopoulos
###
60 66d17b40 Apollon Oikonomopoulos
###  end: changes made for VNC.
61 66d17b40 Apollon Oikonomopoulos
###
62 66d17b40 Apollon Oikonomopoulos
###################################################
63 66d17b40 Apollon Oikonomopoulos
64 66d17b40 Apollon Oikonomopoulos
65 66d17b40 Apollon Oikonomopoulos
bigbyte = [
66 66d17b40 Apollon Oikonomopoulos
  0x800000L,    0x400000L,      0x200000L,      0x100000L,
67 66d17b40 Apollon Oikonomopoulos
  0x80000L,     0x40000L,       0x20000L,       0x10000L,
68 66d17b40 Apollon Oikonomopoulos
  0x8000L,      0x4000L,        0x2000L,        0x1000L,
69 66d17b40 Apollon Oikonomopoulos
  0x800L,       0x400L,         0x200L,         0x100L,
70 66d17b40 Apollon Oikonomopoulos
  0x80L,        0x40L,          0x20L,          0x10L,
71 66d17b40 Apollon Oikonomopoulos
  0x8L,         0x4L,           0x2L,           0x1L
72 66d17b40 Apollon Oikonomopoulos
  ]
73 66d17b40 Apollon Oikonomopoulos
74 66d17b40 Apollon Oikonomopoulos
# Use the key schedule specified in the Standard (ANSI X3.92-1981).
75 66d17b40 Apollon Oikonomopoulos
76 66d17b40 Apollon Oikonomopoulos
pc1 = [
77 66d17b40 Apollon Oikonomopoulos
  56, 48, 40, 32, 24, 16,  8,    0, 57, 49, 41, 33, 25, 17,
78 66d17b40 Apollon Oikonomopoulos
   9,  1, 58, 50, 42, 34, 26,   18, 10,  2, 59, 51, 43, 35,
79 66d17b40 Apollon Oikonomopoulos
  62, 54, 46, 38, 30, 22, 14,    6, 61, 53, 45, 37, 29, 21,
80 66d17b40 Apollon Oikonomopoulos
  13,  5, 60, 52, 44, 36, 28,   20, 12,  4, 27, 19, 11,  3
81 66d17b40 Apollon Oikonomopoulos
  ]
82 66d17b40 Apollon Oikonomopoulos
83 66d17b40 Apollon Oikonomopoulos
totrot = [ 1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28 ]
84 66d17b40 Apollon Oikonomopoulos
85 66d17b40 Apollon Oikonomopoulos
pc2 = [
86 66d17b40 Apollon Oikonomopoulos
  13, 16, 10, 23,  0,  4,  2, 27, 14,  5, 20,  9,
87 66d17b40 Apollon Oikonomopoulos
  22, 18, 11,  3, 25,  7, 15,  6, 26, 19, 12,  1,
88 66d17b40 Apollon Oikonomopoulos
  40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,
89 66d17b40 Apollon Oikonomopoulos
  43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31
90 66d17b40 Apollon Oikonomopoulos
  ]
91 66d17b40 Apollon Oikonomopoulos
92 66d17b40 Apollon Oikonomopoulos
def deskey(key, decrypt):      # Thanks to James Gillogly & Phil Karn!
93 66d17b40 Apollon Oikonomopoulos
    key = unpack('8B', key)
94 66d17b40 Apollon Oikonomopoulos
95 66d17b40 Apollon Oikonomopoulos
    pc1m = [0]*56
96 66d17b40 Apollon Oikonomopoulos
    pcr = [0]*56
97 66d17b40 Apollon Oikonomopoulos
    kn = [0L]*32
98 66d17b40 Apollon Oikonomopoulos
99 66d17b40 Apollon Oikonomopoulos
    for j in range(56):
100 66d17b40 Apollon Oikonomopoulos
        l = pc1[j]
101 66d17b40 Apollon Oikonomopoulos
        m = l & 07
102 66d17b40 Apollon Oikonomopoulos
        if key[l >> 3] & bytebit[m]:
103 66d17b40 Apollon Oikonomopoulos
            pc1m[j] = 1
104 66d17b40 Apollon Oikonomopoulos
        else:
105 66d17b40 Apollon Oikonomopoulos
            pc1m[j] = 0
106 66d17b40 Apollon Oikonomopoulos
107 66d17b40 Apollon Oikonomopoulos
    for i in range(16):
108 66d17b40 Apollon Oikonomopoulos
        if decrypt:
109 66d17b40 Apollon Oikonomopoulos
            m = (15 - i) << 1
110 66d17b40 Apollon Oikonomopoulos
        else:
111 66d17b40 Apollon Oikonomopoulos
            m = i << 1
112 66d17b40 Apollon Oikonomopoulos
        n = m + 1
113 66d17b40 Apollon Oikonomopoulos
        kn[m] = kn[n] = 0L
114 66d17b40 Apollon Oikonomopoulos
        for j in range(28):
115 66d17b40 Apollon Oikonomopoulos
            l = j + totrot[i]
116 66d17b40 Apollon Oikonomopoulos
            if l < 28:
117 66d17b40 Apollon Oikonomopoulos
                pcr[j] = pc1m[l]
118 66d17b40 Apollon Oikonomopoulos
            else:
119 66d17b40 Apollon Oikonomopoulos
                pcr[j] = pc1m[l - 28]
120 66d17b40 Apollon Oikonomopoulos
        for j in range(28, 56):
121 66d17b40 Apollon Oikonomopoulos
            l = j + totrot[i]
122 66d17b40 Apollon Oikonomopoulos
            if l < 56:
123 66d17b40 Apollon Oikonomopoulos
                pcr[j] = pc1m[l]
124 66d17b40 Apollon Oikonomopoulos
            else:
125 66d17b40 Apollon Oikonomopoulos
                pcr[j] = pc1m[l - 28]
126 66d17b40 Apollon Oikonomopoulos
        for j in range(24):
127 66d17b40 Apollon Oikonomopoulos
            if pcr[pc2[j]]:
128 66d17b40 Apollon Oikonomopoulos
                kn[m] |= bigbyte[j]
129 66d17b40 Apollon Oikonomopoulos
            if pcr[pc2[j+24]]:
130 66d17b40 Apollon Oikonomopoulos
                kn[n] |= bigbyte[j]
131 66d17b40 Apollon Oikonomopoulos
132 66d17b40 Apollon Oikonomopoulos
    return cookey(kn)
133 66d17b40 Apollon Oikonomopoulos
134 66d17b40 Apollon Oikonomopoulos
def cookey(raw):
135 66d17b40 Apollon Oikonomopoulos
    key = []
136 66d17b40 Apollon Oikonomopoulos
    for i in range(0, 32, 2):
137 66d17b40 Apollon Oikonomopoulos
        (raw0, raw1) = (raw[i], raw[i+1])
138 66d17b40 Apollon Oikonomopoulos
        k  = (raw0 & 0x00fc0000L) << 6
139 66d17b40 Apollon Oikonomopoulos
        k |= (raw0 & 0x00000fc0L) << 10
140 66d17b40 Apollon Oikonomopoulos
        k |= (raw1 & 0x00fc0000L) >> 10
141 66d17b40 Apollon Oikonomopoulos
        k |= (raw1 & 0x00000fc0L) >> 6
142 66d17b40 Apollon Oikonomopoulos
        key.append(k)
143 66d17b40 Apollon Oikonomopoulos
        k  = (raw0 & 0x0003f000L) << 12
144 66d17b40 Apollon Oikonomopoulos
        k |= (raw0 & 0x0000003fL) << 16
145 66d17b40 Apollon Oikonomopoulos
        k |= (raw1 & 0x0003f000L) >> 4
146 66d17b40 Apollon Oikonomopoulos
        k |= (raw1 & 0x0000003fL)
147 66d17b40 Apollon Oikonomopoulos
        key.append(k)
148 66d17b40 Apollon Oikonomopoulos
    return key
149 66d17b40 Apollon Oikonomopoulos
150 66d17b40 Apollon Oikonomopoulos
SP1 = [
151 66d17b40 Apollon Oikonomopoulos
  0x01010400L, 0x00000000L, 0x00010000L, 0x01010404L,
152 66d17b40 Apollon Oikonomopoulos
  0x01010004L, 0x00010404L, 0x00000004L, 0x00010000L,
153 66d17b40 Apollon Oikonomopoulos
  0x00000400L, 0x01010400L, 0x01010404L, 0x00000400L,
154 66d17b40 Apollon Oikonomopoulos
  0x01000404L, 0x01010004L, 0x01000000L, 0x00000004L,
155 66d17b40 Apollon Oikonomopoulos
  0x00000404L, 0x01000400L, 0x01000400L, 0x00010400L,
156 66d17b40 Apollon Oikonomopoulos
  0x00010400L, 0x01010000L, 0x01010000L, 0x01000404L,
157 66d17b40 Apollon Oikonomopoulos
  0x00010004L, 0x01000004L, 0x01000004L, 0x00010004L,
158 66d17b40 Apollon Oikonomopoulos
  0x00000000L, 0x00000404L, 0x00010404L, 0x01000000L,
159 66d17b40 Apollon Oikonomopoulos
  0x00010000L, 0x01010404L, 0x00000004L, 0x01010000L,
160 66d17b40 Apollon Oikonomopoulos
  0x01010400L, 0x01000000L, 0x01000000L, 0x00000400L,
161 66d17b40 Apollon Oikonomopoulos
  0x01010004L, 0x00010000L, 0x00010400L, 0x01000004L,
162 66d17b40 Apollon Oikonomopoulos
  0x00000400L, 0x00000004L, 0x01000404L, 0x00010404L,
163 66d17b40 Apollon Oikonomopoulos
  0x01010404L, 0x00010004L, 0x01010000L, 0x01000404L,
164 66d17b40 Apollon Oikonomopoulos
  0x01000004L, 0x00000404L, 0x00010404L, 0x01010400L,
165 66d17b40 Apollon Oikonomopoulos
  0x00000404L, 0x01000400L, 0x01000400L, 0x00000000L,
166 66d17b40 Apollon Oikonomopoulos
  0x00010004L, 0x00010400L, 0x00000000L, 0x01010004L
167 66d17b40 Apollon Oikonomopoulos
  ]
168 66d17b40 Apollon Oikonomopoulos
169 66d17b40 Apollon Oikonomopoulos
SP2 = [
170 66d17b40 Apollon Oikonomopoulos
  0x80108020L, 0x80008000L, 0x00008000L, 0x00108020L,
171 66d17b40 Apollon Oikonomopoulos
  0x00100000L, 0x00000020L, 0x80100020L, 0x80008020L,
172 66d17b40 Apollon Oikonomopoulos
  0x80000020L, 0x80108020L, 0x80108000L, 0x80000000L,
173 66d17b40 Apollon Oikonomopoulos
  0x80008000L, 0x00100000L, 0x00000020L, 0x80100020L,
174 66d17b40 Apollon Oikonomopoulos
  0x00108000L, 0x00100020L, 0x80008020L, 0x00000000L,
175 66d17b40 Apollon Oikonomopoulos
  0x80000000L, 0x00008000L, 0x00108020L, 0x80100000L,
176 66d17b40 Apollon Oikonomopoulos
  0x00100020L, 0x80000020L, 0x00000000L, 0x00108000L,
177 66d17b40 Apollon Oikonomopoulos
  0x00008020L, 0x80108000L, 0x80100000L, 0x00008020L,
178 66d17b40 Apollon Oikonomopoulos
  0x00000000L, 0x00108020L, 0x80100020L, 0x00100000L,
179 66d17b40 Apollon Oikonomopoulos
  0x80008020L, 0x80100000L, 0x80108000L, 0x00008000L,
180 66d17b40 Apollon Oikonomopoulos
  0x80100000L, 0x80008000L, 0x00000020L, 0x80108020L,
181 66d17b40 Apollon Oikonomopoulos
  0x00108020L, 0x00000020L, 0x00008000L, 0x80000000L,
182 66d17b40 Apollon Oikonomopoulos
  0x00008020L, 0x80108000L, 0x00100000L, 0x80000020L,
183 66d17b40 Apollon Oikonomopoulos
  0x00100020L, 0x80008020L, 0x80000020L, 0x00100020L,
184 66d17b40 Apollon Oikonomopoulos
  0x00108000L, 0x00000000L, 0x80008000L, 0x00008020L,
185 66d17b40 Apollon Oikonomopoulos
  0x80000000L, 0x80100020L, 0x80108020L, 0x00108000L
186 66d17b40 Apollon Oikonomopoulos
  ]
187 66d17b40 Apollon Oikonomopoulos
188 66d17b40 Apollon Oikonomopoulos
SP3 = [
189 66d17b40 Apollon Oikonomopoulos
  0x00000208L, 0x08020200L, 0x00000000L, 0x08020008L,
190 66d17b40 Apollon Oikonomopoulos
  0x08000200L, 0x00000000L, 0x00020208L, 0x08000200L,
191 66d17b40 Apollon Oikonomopoulos
  0x00020008L, 0x08000008L, 0x08000008L, 0x00020000L,
192 66d17b40 Apollon Oikonomopoulos
  0x08020208L, 0x00020008L, 0x08020000L, 0x00000208L,
193 66d17b40 Apollon Oikonomopoulos
  0x08000000L, 0x00000008L, 0x08020200L, 0x00000200L,
194 66d17b40 Apollon Oikonomopoulos
  0x00020200L, 0x08020000L, 0x08020008L, 0x00020208L,
195 66d17b40 Apollon Oikonomopoulos
  0x08000208L, 0x00020200L, 0x00020000L, 0x08000208L,
196 66d17b40 Apollon Oikonomopoulos
  0x00000008L, 0x08020208L, 0x00000200L, 0x08000000L,
197 66d17b40 Apollon Oikonomopoulos
  0x08020200L, 0x08000000L, 0x00020008L, 0x00000208L,
198 66d17b40 Apollon Oikonomopoulos
  0x00020000L, 0x08020200L, 0x08000200L, 0x00000000L,
199 66d17b40 Apollon Oikonomopoulos
  0x00000200L, 0x00020008L, 0x08020208L, 0x08000200L,
200 66d17b40 Apollon Oikonomopoulos
  0x08000008L, 0x00000200L, 0x00000000L, 0x08020008L,
201 66d17b40 Apollon Oikonomopoulos
  0x08000208L, 0x00020000L, 0x08000000L, 0x08020208L,
202 66d17b40 Apollon Oikonomopoulos
  0x00000008L, 0x00020208L, 0x00020200L, 0x08000008L,
203 66d17b40 Apollon Oikonomopoulos
  0x08020000L, 0x08000208L, 0x00000208L, 0x08020000L,
204 66d17b40 Apollon Oikonomopoulos
  0x00020208L, 0x00000008L, 0x08020008L, 0x00020200L
205 66d17b40 Apollon Oikonomopoulos
  ]
206 66d17b40 Apollon Oikonomopoulos
207 66d17b40 Apollon Oikonomopoulos
SP4 = [
208 66d17b40 Apollon Oikonomopoulos
  0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
209 66d17b40 Apollon Oikonomopoulos
  0x00802080L, 0x00800081L, 0x00800001L, 0x00002001L,
210 66d17b40 Apollon Oikonomopoulos
  0x00000000L, 0x00802000L, 0x00802000L, 0x00802081L,
211 66d17b40 Apollon Oikonomopoulos
  0x00000081L, 0x00000000L, 0x00800080L, 0x00800001L,
212 66d17b40 Apollon Oikonomopoulos
  0x00000001L, 0x00002000L, 0x00800000L, 0x00802001L,
213 66d17b40 Apollon Oikonomopoulos
  0x00000080L, 0x00800000L, 0x00002001L, 0x00002080L,
214 66d17b40 Apollon Oikonomopoulos
  0x00800081L, 0x00000001L, 0x00002080L, 0x00800080L,
215 66d17b40 Apollon Oikonomopoulos
  0x00002000L, 0x00802080L, 0x00802081L, 0x00000081L,
216 66d17b40 Apollon Oikonomopoulos
  0x00800080L, 0x00800001L, 0x00802000L, 0x00802081L,
217 66d17b40 Apollon Oikonomopoulos
  0x00000081L, 0x00000000L, 0x00000000L, 0x00802000L,
218 66d17b40 Apollon Oikonomopoulos
  0x00002080L, 0x00800080L, 0x00800081L, 0x00000001L,
219 66d17b40 Apollon Oikonomopoulos
  0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
220 66d17b40 Apollon Oikonomopoulos
  0x00802081L, 0x00000081L, 0x00000001L, 0x00002000L,
221 66d17b40 Apollon Oikonomopoulos
  0x00800001L, 0x00002001L, 0x00802080L, 0x00800081L,
222 66d17b40 Apollon Oikonomopoulos
  0x00002001L, 0x00002080L, 0x00800000L, 0x00802001L,
223 66d17b40 Apollon Oikonomopoulos
  0x00000080L, 0x00800000L, 0x00002000L, 0x00802080L
224 66d17b40 Apollon Oikonomopoulos
  ]
225 66d17b40 Apollon Oikonomopoulos
226 66d17b40 Apollon Oikonomopoulos
SP5 = [
227 66d17b40 Apollon Oikonomopoulos
  0x00000100L, 0x02080100L, 0x02080000L, 0x42000100L,
228 66d17b40 Apollon Oikonomopoulos
  0x00080000L, 0x00000100L, 0x40000000L, 0x02080000L,
229 66d17b40 Apollon Oikonomopoulos
  0x40080100L, 0x00080000L, 0x02000100L, 0x40080100L,
230 66d17b40 Apollon Oikonomopoulos
  0x42000100L, 0x42080000L, 0x00080100L, 0x40000000L,
231 66d17b40 Apollon Oikonomopoulos
  0x02000000L, 0x40080000L, 0x40080000L, 0x00000000L,
232 66d17b40 Apollon Oikonomopoulos
  0x40000100L, 0x42080100L, 0x42080100L, 0x02000100L,
233 66d17b40 Apollon Oikonomopoulos
  0x42080000L, 0x40000100L, 0x00000000L, 0x42000000L,
234 66d17b40 Apollon Oikonomopoulos
  0x02080100L, 0x02000000L, 0x42000000L, 0x00080100L,
235 66d17b40 Apollon Oikonomopoulos
  0x00080000L, 0x42000100L, 0x00000100L, 0x02000000L,
236 66d17b40 Apollon Oikonomopoulos
  0x40000000L, 0x02080000L, 0x42000100L, 0x40080100L,
237 66d17b40 Apollon Oikonomopoulos
  0x02000100L, 0x40000000L, 0x42080000L, 0x02080100L,
238 66d17b40 Apollon Oikonomopoulos
  0x40080100L, 0x00000100L, 0x02000000L, 0x42080000L,
239 66d17b40 Apollon Oikonomopoulos
  0x42080100L, 0x00080100L, 0x42000000L, 0x42080100L,
240 66d17b40 Apollon Oikonomopoulos
  0x02080000L, 0x00000000L, 0x40080000L, 0x42000000L,
241 66d17b40 Apollon Oikonomopoulos
  0x00080100L, 0x02000100L, 0x40000100L, 0x00080000L,
242 66d17b40 Apollon Oikonomopoulos
  0x00000000L, 0x40080000L, 0x02080100L, 0x40000100L
243 66d17b40 Apollon Oikonomopoulos
  ]
244 66d17b40 Apollon Oikonomopoulos
245 66d17b40 Apollon Oikonomopoulos
SP6 = [
246 66d17b40 Apollon Oikonomopoulos
  0x20000010L, 0x20400000L, 0x00004000L, 0x20404010L,
247 66d17b40 Apollon Oikonomopoulos
  0x20400000L, 0x00000010L, 0x20404010L, 0x00400000L,
248 66d17b40 Apollon Oikonomopoulos
  0x20004000L, 0x00404010L, 0x00400000L, 0x20000010L,
249 66d17b40 Apollon Oikonomopoulos
  0x00400010L, 0x20004000L, 0x20000000L, 0x00004010L,
250 66d17b40 Apollon Oikonomopoulos
  0x00000000L, 0x00400010L, 0x20004010L, 0x00004000L,
251 66d17b40 Apollon Oikonomopoulos
  0x00404000L, 0x20004010L, 0x00000010L, 0x20400010L,
252 66d17b40 Apollon Oikonomopoulos
  0x20400010L, 0x00000000L, 0x00404010L, 0x20404000L,
253 66d17b40 Apollon Oikonomopoulos
  0x00004010L, 0x00404000L, 0x20404000L, 0x20000000L,
254 66d17b40 Apollon Oikonomopoulos
  0x20004000L, 0x00000010L, 0x20400010L, 0x00404000L,
255 66d17b40 Apollon Oikonomopoulos
  0x20404010L, 0x00400000L, 0x00004010L, 0x20000010L,
256 66d17b40 Apollon Oikonomopoulos
  0x00400000L, 0x20004000L, 0x20000000L, 0x00004010L,
257 66d17b40 Apollon Oikonomopoulos
  0x20000010L, 0x20404010L, 0x00404000L, 0x20400000L,
258 66d17b40 Apollon Oikonomopoulos
  0x00404010L, 0x20404000L, 0x00000000L, 0x20400010L,
259 66d17b40 Apollon Oikonomopoulos
  0x00000010L, 0x00004000L, 0x20400000L, 0x00404010L,
260 66d17b40 Apollon Oikonomopoulos
  0x00004000L, 0x00400010L, 0x20004010L, 0x00000000L,
261 66d17b40 Apollon Oikonomopoulos
  0x20404000L, 0x20000000L, 0x00400010L, 0x20004010L
262 66d17b40 Apollon Oikonomopoulos
  ]
263 66d17b40 Apollon Oikonomopoulos
264 66d17b40 Apollon Oikonomopoulos
SP7 = [
265 66d17b40 Apollon Oikonomopoulos
  0x00200000L, 0x04200002L, 0x04000802L, 0x00000000L,
266 66d17b40 Apollon Oikonomopoulos
  0x00000800L, 0x04000802L, 0x00200802L, 0x04200800L,
267 66d17b40 Apollon Oikonomopoulos
  0x04200802L, 0x00200000L, 0x00000000L, 0x04000002L,
268 66d17b40 Apollon Oikonomopoulos
  0x00000002L, 0x04000000L, 0x04200002L, 0x00000802L,
269 66d17b40 Apollon Oikonomopoulos
  0x04000800L, 0x00200802L, 0x00200002L, 0x04000800L,
270 66d17b40 Apollon Oikonomopoulos
  0x04000002L, 0x04200000L, 0x04200800L, 0x00200002L,
271 66d17b40 Apollon Oikonomopoulos
  0x04200000L, 0x00000800L, 0x00000802L, 0x04200802L,
272 66d17b40 Apollon Oikonomopoulos
  0x00200800L, 0x00000002L, 0x04000000L, 0x00200800L,
273 66d17b40 Apollon Oikonomopoulos
  0x04000000L, 0x00200800L, 0x00200000L, 0x04000802L,
274 66d17b40 Apollon Oikonomopoulos
  0x04000802L, 0x04200002L, 0x04200002L, 0x00000002L,
275 66d17b40 Apollon Oikonomopoulos
  0x00200002L, 0x04000000L, 0x04000800L, 0x00200000L,
276 66d17b40 Apollon Oikonomopoulos
  0x04200800L, 0x00000802L, 0x00200802L, 0x04200800L,
277 66d17b40 Apollon Oikonomopoulos
  0x00000802L, 0x04000002L, 0x04200802L, 0x04200000L,
278 66d17b40 Apollon Oikonomopoulos
  0x00200800L, 0x00000000L, 0x00000002L, 0x04200802L,
279 66d17b40 Apollon Oikonomopoulos
  0x00000000L, 0x00200802L, 0x04200000L, 0x00000800L,
280 66d17b40 Apollon Oikonomopoulos
  0x04000002L, 0x04000800L, 0x00000800L, 0x00200002L
281 66d17b40 Apollon Oikonomopoulos
  ]
282 66d17b40 Apollon Oikonomopoulos
283 66d17b40 Apollon Oikonomopoulos
SP8 = [
284 66d17b40 Apollon Oikonomopoulos
  0x10001040L, 0x00001000L, 0x00040000L, 0x10041040L,
285 66d17b40 Apollon Oikonomopoulos
  0x10000000L, 0x10001040L, 0x00000040L, 0x10000000L,
286 66d17b40 Apollon Oikonomopoulos
  0x00040040L, 0x10040000L, 0x10041040L, 0x00041000L,
287 66d17b40 Apollon Oikonomopoulos
  0x10041000L, 0x00041040L, 0x00001000L, 0x00000040L,
288 66d17b40 Apollon Oikonomopoulos
  0x10040000L, 0x10000040L, 0x10001000L, 0x00001040L,
289 66d17b40 Apollon Oikonomopoulos
  0x00041000L, 0x00040040L, 0x10040040L, 0x10041000L,
290 66d17b40 Apollon Oikonomopoulos
  0x00001040L, 0x00000000L, 0x00000000L, 0x10040040L,
291 66d17b40 Apollon Oikonomopoulos
  0x10000040L, 0x10001000L, 0x00041040L, 0x00040000L,
292 66d17b40 Apollon Oikonomopoulos
  0x00041040L, 0x00040000L, 0x10041000L, 0x00001000L,
293 66d17b40 Apollon Oikonomopoulos
  0x00000040L, 0x10040040L, 0x00001000L, 0x00041040L,
294 66d17b40 Apollon Oikonomopoulos
  0x10001000L, 0x00000040L, 0x10000040L, 0x10040000L,
295 66d17b40 Apollon Oikonomopoulos
  0x10040040L, 0x10000000L, 0x00040000L, 0x10001040L,
296 66d17b40 Apollon Oikonomopoulos
  0x00000000L, 0x10041040L, 0x00040040L, 0x10000040L,
297 66d17b40 Apollon Oikonomopoulos
  0x10040000L, 0x10001000L, 0x10001040L, 0x00000000L,
298 66d17b40 Apollon Oikonomopoulos
  0x10041040L, 0x00041000L, 0x00041000L, 0x00001040L,
299 66d17b40 Apollon Oikonomopoulos
  0x00001040L, 0x00040040L, 0x10000000L, 0x10041000L
300 66d17b40 Apollon Oikonomopoulos
  ]
301 66d17b40 Apollon Oikonomopoulos
302 66d17b40 Apollon Oikonomopoulos
def desfunc(block, keys):
303 66d17b40 Apollon Oikonomopoulos
    (leftt, right) = unpack('>II', block)
304 66d17b40 Apollon Oikonomopoulos
305 66d17b40 Apollon Oikonomopoulos
    work = ((leftt >> 4) ^ right) & 0x0f0f0f0fL
306 66d17b40 Apollon Oikonomopoulos
    right ^= work
307 66d17b40 Apollon Oikonomopoulos
    leftt ^= (work << 4)
308 66d17b40 Apollon Oikonomopoulos
    work = ((leftt >> 16) ^ right) & 0x0000ffffL
309 66d17b40 Apollon Oikonomopoulos
    right ^= work
310 66d17b40 Apollon Oikonomopoulos
    leftt ^= (work << 16)
311 66d17b40 Apollon Oikonomopoulos
    work = ((right >> 2) ^ leftt) & 0x33333333L
312 66d17b40 Apollon Oikonomopoulos
    leftt ^= work
313 66d17b40 Apollon Oikonomopoulos
    right ^= (work << 2)
314 66d17b40 Apollon Oikonomopoulos
    work = ((right >> 8) ^ leftt) & 0x00ff00ffL
315 66d17b40 Apollon Oikonomopoulos
    leftt ^= work
316 66d17b40 Apollon Oikonomopoulos
    right ^= (work << 8)
317 66d17b40 Apollon Oikonomopoulos
    right = ((right << 1) | ((right >> 31) & 1L)) & 0xffffffffL
318 66d17b40 Apollon Oikonomopoulos
    work = (leftt ^ right) & 0xaaaaaaaaL
319 66d17b40 Apollon Oikonomopoulos
    leftt ^= work
320 66d17b40 Apollon Oikonomopoulos
    right ^= work
321 66d17b40 Apollon Oikonomopoulos
    leftt = ((leftt << 1) | ((leftt >> 31) & 1L)) & 0xffffffffL
322 66d17b40 Apollon Oikonomopoulos
323 66d17b40 Apollon Oikonomopoulos
    for i in range(0, 32, 4):
324 66d17b40 Apollon Oikonomopoulos
        work  = (right << 28) | (right >> 4)
325 66d17b40 Apollon Oikonomopoulos
        work ^= keys[i]
326 66d17b40 Apollon Oikonomopoulos
        fval  = SP7[ work            & 0x3fL]
327 66d17b40 Apollon Oikonomopoulos
        fval |= SP5[(work >>  8) & 0x3fL]
328 66d17b40 Apollon Oikonomopoulos
        fval |= SP3[(work >> 16) & 0x3fL]
329 66d17b40 Apollon Oikonomopoulos
        fval |= SP1[(work >> 24) & 0x3fL]
330 66d17b40 Apollon Oikonomopoulos
        work  = right ^ keys[i+1]
331 66d17b40 Apollon Oikonomopoulos
        fval |= SP8[ work            & 0x3fL]
332 66d17b40 Apollon Oikonomopoulos
        fval |= SP6[(work >>  8) & 0x3fL]
333 66d17b40 Apollon Oikonomopoulos
        fval |= SP4[(work >> 16) & 0x3fL]
334 66d17b40 Apollon Oikonomopoulos
        fval |= SP2[(work >> 24) & 0x3fL]
335 66d17b40 Apollon Oikonomopoulos
        leftt ^= fval
336 66d17b40 Apollon Oikonomopoulos
        work  = (leftt << 28) | (leftt >> 4)
337 66d17b40 Apollon Oikonomopoulos
        work ^= keys[i+2]
338 66d17b40 Apollon Oikonomopoulos
        fval  = SP7[ work            & 0x3fL]
339 66d17b40 Apollon Oikonomopoulos
        fval |= SP5[(work >>  8) & 0x3fL]
340 66d17b40 Apollon Oikonomopoulos
        fval |= SP3[(work >> 16) & 0x3fL]
341 66d17b40 Apollon Oikonomopoulos
        fval |= SP1[(work >> 24) & 0x3fL]
342 66d17b40 Apollon Oikonomopoulos
        work  = leftt ^ keys[i+3]
343 66d17b40 Apollon Oikonomopoulos
        fval |= SP8[ work            & 0x3fL]
344 66d17b40 Apollon Oikonomopoulos
        fval |= SP6[(work >>  8) & 0x3fL]
345 66d17b40 Apollon Oikonomopoulos
        fval |= SP4[(work >> 16) & 0x3fL]
346 66d17b40 Apollon Oikonomopoulos
        fval |= SP2[(work >> 24) & 0x3fL]
347 66d17b40 Apollon Oikonomopoulos
        right ^= fval
348 66d17b40 Apollon Oikonomopoulos
349 66d17b40 Apollon Oikonomopoulos
    right = (right << 31) | (right >> 1)
350 66d17b40 Apollon Oikonomopoulos
    work = (leftt ^ right) & 0xaaaaaaaaL
351 66d17b40 Apollon Oikonomopoulos
    leftt ^= work
352 66d17b40 Apollon Oikonomopoulos
    right ^= work
353 66d17b40 Apollon Oikonomopoulos
    leftt = (leftt << 31) | (leftt >> 1)
354 66d17b40 Apollon Oikonomopoulos
    work = ((leftt >> 8) ^ right) & 0x00ff00ffL
355 66d17b40 Apollon Oikonomopoulos
    right ^= work
356 66d17b40 Apollon Oikonomopoulos
    leftt ^= (work << 8)
357 66d17b40 Apollon Oikonomopoulos
    work = ((leftt >> 2) ^ right) & 0x33333333L
358 66d17b40 Apollon Oikonomopoulos
    right ^= work
359 66d17b40 Apollon Oikonomopoulos
    leftt ^= (work << 2)
360 66d17b40 Apollon Oikonomopoulos
    work = ((right >> 16) ^ leftt) & 0x0000ffffL
361 66d17b40 Apollon Oikonomopoulos
    leftt ^= work
362 66d17b40 Apollon Oikonomopoulos
    right ^= (work << 16)
363 66d17b40 Apollon Oikonomopoulos
    work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL
364 66d17b40 Apollon Oikonomopoulos
    leftt ^= work
365 66d17b40 Apollon Oikonomopoulos
    right ^= (work << 4)
366 66d17b40 Apollon Oikonomopoulos
367 66d17b40 Apollon Oikonomopoulos
    leftt &= 0xffffffffL
368 66d17b40 Apollon Oikonomopoulos
    right &= 0xffffffffL
369 66d17b40 Apollon Oikonomopoulos
    return pack('>II', right, leftt)
370 66d17b40 Apollon Oikonomopoulos
371 66d17b40 Apollon Oikonomopoulos
372 66d17b40 Apollon Oikonomopoulos
# test
373 66d17b40 Apollon Oikonomopoulos
if __name__ == '__main__':
374 66d17b40 Apollon Oikonomopoulos
    key = '0123456789abcdef'.decode('hex')
375 66d17b40 Apollon Oikonomopoulos
    plain = '0123456789abcdef'.decode('hex')
376 66d17b40 Apollon Oikonomopoulos
    cipher = '6e09a37726dd560c'.decode('hex')
377 66d17b40 Apollon Oikonomopoulos
    ek = deskey(key, False)
378 66d17b40 Apollon Oikonomopoulos
    dk = deskey(key, True)
379 66d17b40 Apollon Oikonomopoulos
    assert desfunc(plain, ek) == cipher
380 66d17b40 Apollon Oikonomopoulos
    assert desfunc(desfunc(plain, ek), dk) == plain
381 66d17b40 Apollon Oikonomopoulos
    assert desfunc(desfunc(plain, dk), ek) == plain
382 66d17b40 Apollon Oikonomopoulos
    print 'test succeeded.'