ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Crypt-Twofish2/table.h
Revision: 1.2
Committed: Wed Dec 1 02:12:30 2010 UTC (13 years, 5 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-1_02, rel-1_03, HEAD
Changes since 1.1: +1 -1 lines
Log Message:
1.02

File Contents

# Content
1 /***************************************************************************
2 TABLE.H -- Tables, macros, constants for Twofish S-boxes and MDS matrix
3
4 Submitters:
5 Bruce Schneier, Counterpane Systems
6 Doug Whiting, Hi/fn
7 John Kelsey, Counterpane Systems
8 Chris Hall, Counterpane Systems
9 David Wagner, UC Berkeley
10
11 Code Author: Doug Whiting, Hi/fn
12
13 Version 1.00 April 1998
14
15 Copyright 1998, Hi/fn and Counterpane Systems. All rights reserved.
16
17 Notes:
18 * Tab size is set to 4 characters in this file
19 * These definitions should be used in optimized and unoptimized
20 versions to insure consistency.
21
22 ***************************************************************************/
23
24 /* for computing subkeys */
25 #define SK_STEP 0x02020202u
26 #define SK_BUMP 0x01010101u
27 #define SK_ROTL 9
28
29 /* Reed-Solomon code parameters: (12,8) reversible code
30 g(x) = x**4 + (a + 1/a) x**3 + a x**2 + (a + 1/a) x + 1
31 where a = primitive root of field generator 0x14D */
32 #define RS_GF_FDBK 0x14D /* field generator */
33 #define RS_rem(x) \
34 { BYTE b = (BYTE) (x >> 24); \
35 DWORD g2 = ((b << 1) ^ ((b & 0x80) ? RS_GF_FDBK : 0 )) & 0xFF; \
36 DWORD g3 = ((b >> 1) & 0x7F) ^ ((b & 1) ? RS_GF_FDBK >> 1 : 0 ) ^ g2 ; \
37 x = (x << 8) ^ (g3 << 24) ^ (g2 << 16) ^ (g3 << 8) ^ b; \
38 }
39
40 /* Macros for the MDS matrix
41 * The MDS matrix is (using primitive polynomial 169):
42 * 01 EF 5B 5B
43 * 5B EF EF 01
44 * EF 5B 01 EF
45 * EF 01 EF 5B
46 *----------------------------------------------------------------
47 * More statistical properties of this matrix (from MDS.EXE output):
48 *
49 * Min Hamming weight (one byte difference) = 8. Max=26. Total = 1020.
50 * Prob[8]: 7 23 42 20 52 95 88 94 121 128 91
51 * 102 76 41 24 8 4 1 3 0 0 0
52 * Runs[8]: 2 4 5 6 7 8 9 11
53 * MSBs[8]: 1 4 15 8 18 38 40 43
54 * HW= 8: 05040705 0A080E0A 14101C14 28203828 50407050 01499101 A080E0A0
55 * HW= 9: 04050707 080A0E0E 10141C1C 20283838 40507070 80A0E0E0 C6432020 07070504
56 * 0E0E0A08 1C1C1410 38382820 70705040 E0E0A080 202043C6 05070407 0A0E080E
57 * 141C101C 28382038 50704070 A0E080E0 4320C620 02924B02 089A4508
58 * Min Hamming weight (two byte difference) = 3. Max=28. Total = 390150.
59 * Prob[3]: 7 18 55 149 270 914 2185 5761 11363 20719 32079
60 * 43492 51612 53851 52098 42015 31117 20854 11538 6223 2492 1033
61 * MDS OK, ROR: 6+ 7+ 8+ 9+ 10+ 11+ 12+ 13+ 14+ 15+ 16+
62 * 17+ 18+ 19+ 20+ 21+ 22+ 23+ 24+ 25+ 26+
63 */
64 #define MDS_GF_FDBK 0x169 /* primitive polynomial for GF(256) */
65 #define LFSR1(x) ( ((x) >> 1) ^ (((x) & 0x01) ? MDS_GF_FDBK/2 : 0))
66 #define LFSR2(x) ( ((x) >> 2) ^ (((x) & 0x02) ? MDS_GF_FDBK/2 : 0) \
67 ^ (((x) & 0x01) ? MDS_GF_FDBK/4 : 0))
68
69 #define Mx_1(x) ((DWORD) (x)) /* force result to dword so << will work */
70 #define Mx_X(x) ((DWORD) ((x) ^ LFSR2(x))) /* 5B */
71 #define Mx_Y(x) ((DWORD) ((x) ^ LFSR1(x) ^ LFSR2(x))) /* EF */
72
73 #define M00 Mul_1
74 #define M01 Mul_Y
75 #define M02 Mul_X
76 #define M03 Mul_X
77
78 #define M10 Mul_X
79 #define M11 Mul_Y
80 #define M12 Mul_Y
81 #define M13 Mul_1
82
83 #define M20 Mul_Y
84 #define M21 Mul_X
85 #define M22 Mul_1
86 #define M23 Mul_Y
87
88 #define M30 Mul_Y
89 #define M31 Mul_1
90 #define M32 Mul_Y
91 #define M33 Mul_X
92
93 #define Mul_1 Mx_1
94 #define Mul_X Mx_X
95 #define Mul_Y Mx_Y
96
97 /* Define the fixed p0/p1 permutations used in keyed S-box lookup.
98 By changing the following constant definitions for P_ij, the S-boxes will
99 automatically get changed in all the Twofish source code. Note that P_i0 is
100 the "outermost" 8x8 permutation applied. See the f32() function to see
101 how these constants are to be used.
102 */
103 #define P_00 1 /* "outermost" permutation */
104 #define P_01 0
105 #define P_02 0
106 #define P_03 (P_01^1) /* "extend" to larger key sizes */
107 #define P_04 1
108
109 #define P_10 0
110 #define P_11 0
111 #define P_12 1
112 #define P_13 (P_11^1)
113 #define P_14 0
114
115 #define P_20 1
116 #define P_21 1
117 #define P_22 0
118 #define P_23 (P_21^1)
119 #define P_24 0
120
121 #define P_30 0
122 #define P_31 1
123 #define P_32 1
124 #define P_33 (P_31^1)
125 #define P_34 1
126
127 #define p8(N) P8x8[P_##N] /* some syntax shorthand */
128
129 /* fixed 8x8 permutation S-boxes */
130
131 /***********************************************************************
132 * 07:07:14 05/30/98 [4x4] TestCnt=256. keySize=128. CRC=4BD14D9E.
133 * maxKeyed: dpMax = 18. lpMax =100. fixPt = 8. skXor = 0. skDup = 6.
134 * log2(dpMax[ 6..18])= --- 15.42 1.33 0.89 4.05 7.98 12.05
135 * log2(lpMax[ 7..12])= 9.32 1.01 1.16 4.23 8.02 12.45
136 * log2(fixPt[ 0.. 8])= 1.44 1.44 2.44 4.06 6.01 8.21 11.07 14.09 17.00
137 * log2(skXor[ 0.. 0])
138 * log2(skDup[ 0.. 6])= --- 2.37 0.44 3.94 8.36 13.04 17.99
139 ***********************************************************************/
140 static CONST BYTE P8x8[2][256] =
141 {
142 /* p0: */
143 /* dpMax = 10. lpMax = 64. cycleCnt= 1 1 1 0. */
144 /* 817D6F320B59ECA4.ECB81235F4A6709D.BA5E6D90C8F32471.D7F4126E9B3085CA. */
145 /* Karnaugh maps:
146 * 0111 0001 0011 1010. 0001 1001 1100 1111. 1001 1110 0011 1110. 1101 0101 1111 1001.
147 * 0101 1111 1100 0100. 1011 0101 0010 0000. 0101 1000 1100 0101. 1000 0111 0011 0010.
148 * 0000 1001 1110 1101. 1011 1000 1010 0011. 0011 1001 0101 0000. 0100 0010 0101 1011.
149 * 0111 0100 0001 0110. 1000 1011 1110 1001. 0011 0011 1001 1101. 1101 0101 0000 1100.
150 */
151 {
152 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76,
153 0x9A, 0x92, 0x80, 0x78, 0xE4, 0xDD, 0xD1, 0x38,
154 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C,
155 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48,
156 0xF2, 0xD0, 0x8B, 0x30, 0x84, 0x54, 0xDF, 0x23,
157 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82,
158 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C,
159 0xA6, 0xEB, 0xA5, 0xBE, 0x16, 0x0C, 0xE3, 0x61,
160 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B,
161 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1,
162 0xE1, 0xE6, 0xBD, 0x45, 0xE2, 0xF4, 0xB6, 0x66,
163 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7,
164 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA,
165 0xEA, 0x77, 0x39, 0xAF, 0x33, 0xC9, 0x62, 0x71,
166 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8,
167 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7,
168 0xA1, 0x1D, 0xAA, 0xED, 0x06, 0x70, 0xB2, 0xD2,
169 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90,
170 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB,
171 0x9E, 0x9C, 0x52, 0x1B, 0x5F, 0x93, 0x0A, 0xEF,
172 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B,
173 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64,
174 0x2A, 0xCE, 0xCB, 0x2F, 0xFC, 0x97, 0x05, 0x7A,
175 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A,
176 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02,
177 0xB8, 0xDA, 0xB0, 0x17, 0x55, 0x1F, 0x8A, 0x7D,
178 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72,
179 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34,
180 0x6E, 0x50, 0xDE, 0x68, 0x65, 0xBC, 0xDB, 0xF8,
181 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4,
182 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00,
183 0x6F, 0x9D, 0x36, 0x42, 0x4A, 0x5E, 0xC1, 0xE0
184 },
185 /* p1: */
186 /* dpMax = 10. lpMax = 64. cycleCnt= 2 0 0 1. */
187 /* 28BDF76E31940AC5.1E2B4C376DA5F908.4C75169A0ED82B3F.B951C3DE647F208A. */
188 /* Karnaugh maps:
189 * 0011 1001 0010 0111. 1010 0111 0100 0110. 0011 0001 1111 0100. 1111 1000 0001 1100.
190 * 1100 1111 1111 1010. 0011 0011 1110 0100. 1001 0110 0100 0011. 0101 0110 1011 1011.
191 * 0010 0100 0011 0101. 1100 1000 1000 1110. 0111 1111 0010 0110. 0000 1010 0000 0011.
192 * 1101 1000 0010 0001. 0110 1001 1110 0101. 0001 0100 0101 0111. 0011 1011 1111 0010.
193 */
194 {
195 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8,
196 0x4A, 0xD3, 0xE6, 0x6B, 0x45, 0x7D, 0xE8, 0x4B,
197 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1,
198 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F,
199 0x5E, 0xBA, 0xAE, 0x5B, 0x8A, 0x00, 0xBC, 0x9D,
200 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5,
201 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3,
202 0xB2, 0x73, 0x4C, 0x54, 0x92, 0x74, 0x36, 0x51,
203 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96,
204 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C,
205 0x13, 0x95, 0x9C, 0xC7, 0x24, 0x46, 0x3B, 0x70,
206 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8,
207 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC,
208 0x03, 0x6F, 0x08, 0xBF, 0x40, 0xE7, 0x2B, 0xE2,
209 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9,
210 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17,
211 0x66, 0x94, 0xA1, 0x1D, 0x3D, 0xF0, 0xDE, 0xB3,
212 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E,
213 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49,
214 0x81, 0x88, 0xEE, 0x21, 0xC4, 0x1A, 0xEB, 0xD9,
215 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01,
216 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48,
217 0x4F, 0xF2, 0x65, 0x8E, 0x78, 0x5C, 0x58, 0x19,
218 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64,
219 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5,
220 0xCE, 0xE9, 0x68, 0x44, 0xE0, 0x4D, 0x43, 0x69,
221 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E,
222 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC,
223 0x22, 0xC9, 0xC0, 0x9B, 0x89, 0xD4, 0xED, 0xAB,
224 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9,
225 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2,
226 0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xBE, 0x91
227 }
228 };