@@ -220,6 +220,72 @@ block EVAL(AES_KEY *key, unsigned char* k, int x){
220
220
return res ;
221
221
}
222
222
223
+ block * EVALFULL (AES_KEY * key , unsigned char * k ){
224
+ int n = k [0 ];
225
+ int maxlayer = n - 7 ;
226
+ int maxlayeritem = 1 << (n - 7 );
227
+
228
+ block s [2 ][maxlayeritem ];
229
+ int t [2 ][maxlayeritem ];
230
+
231
+ int curlayer = 1 ;
232
+
233
+ block sCW [maxlayer ];
234
+ int tCW [maxlayer ][2 ];
235
+ block finalblock ;
236
+
237
+ memcpy (& s [0 ][0 ], & k [1 ], 16 );
238
+ t [0 ][0 ] = k [17 ];
239
+
240
+ int i , j ;
241
+ for (i = 1 ; i <= maxlayer ; i ++ ){
242
+ memcpy (& sCW [i - 1 ], & k [18 * i ], 16 );
243
+ tCW [i - 1 ][0 ] = k [18 * i + 16 ];
244
+ tCW [i - 1 ][1 ] = k [18 * i + 17 ];
245
+ }
246
+
247
+ memcpy (& finalblock , & k [18 * (maxlayer + 1 )], 16 );
248
+
249
+ block sL , sR ;
250
+ int tL , tR ;
251
+ for (i = 1 ; i <= maxlayer ; i ++ ){
252
+ int itemnumber = 1 << (i - 1 );
253
+ for (j = 0 ; j < itemnumber ; j ++ ){
254
+ PRG (key , s [1 - curlayer ][j ], & sL , & sR , & tL , & tR );
255
+
256
+ if (t [1 - curlayer ][j ] == 1 ){
257
+ sL = dpf_xor (sL , sCW [i - 1 ]);
258
+ sR = dpf_xor (sR , sCW [i - 1 ]);
259
+ tL = tL ^ tCW [i - 1 ][0 ];
260
+ tR = tR ^ tCW [i - 1 ][1 ];
261
+ }
262
+
263
+ s [curlayer ][2 * j ] = sL ;
264
+ t [curlayer ][2 * j ] = tL ;
265
+ s [curlayer ][2 * j + 1 ] = sR ;
266
+ t [curlayer ][2 * j + 1 ] = tR ;
267
+ }
268
+ curlayer = 1 - curlayer ;
269
+ }
270
+
271
+ int itemnumber = 1 << maxlayer ;
272
+ block * res = (block * ) malloc (sizeof (block ) * itemnumber );
273
+
274
+ for (j = 0 ; j < itemnumber ; j ++ ){
275
+ res [j ] = s [1 - curlayer ][j ];
276
+
277
+ if (t [1 - curlayer ][j ] == 1 ){
278
+ res [j ] = dpf_reverse_lsb (res [j ]);
279
+ }
280
+
281
+ if (t [1 - curlayer ][j ] == 1 ){
282
+ res [j ] = dpf_xor (res [j ], finalblock );
283
+ }
284
+ }
285
+
286
+ return res ;
287
+ }
288
+
223
289
int main (){
224
290
long long userkey1 = 597349 ; long long userkey2 = 121379 ;
225
291
block userkey = dpf_make_block (userkey1 , userkey2 );
@@ -232,7 +298,7 @@ int main(){
232
298
unsigned char * k0 ;
233
299
unsigned char * k1 ;
234
300
235
- GEN (& key , 0 , 16 , & k0 , & k1 );
301
+ GEN (& key , 26943 , 16 , & k0 , & k1 );
236
302
237
303
block res1 ;
238
304
block res2 ;
@@ -248,5 +314,19 @@ int main(){
248
314
dpf_cb (res1 );
249
315
dpf_cb (res2 );
250
316
dpf_cb (dpf_xor (res1 , res2 ));
317
+
318
+ block * resf0 , * resf1 ;
319
+ resf0 = EVALFULL (& key , k0 );
320
+ resf1 = EVALFULL (& key , k1 );
321
+
322
+ int j ;
323
+ for (j = 0 ; j < 512 ; j ++ ){
324
+ printf ("Group %d\n" , j );
325
+
326
+ dpf_cb (resf0 [j ]);
327
+ dpf_cb (resf1 [j ]);
328
+ dpf_cb (dpf_xor (resf0 [j ], resf1 [j ]));
329
+ }
330
+
251
331
return 0 ;
252
332
}
0 commit comments