@@ -185,6 +185,26 @@ private byte determinant3x3(byte[] m)
185185 );
186186 }
187187
188+ private byte determinant3x3 (byte [] m , int i0 , int i1 , int i2 , int j0 , int j1 , int j2 )
189+ {
190+ return gf16Add (
191+ gf16Add (
192+ gf16Mul (getGF16m (m , j0 , i0 ), gf16Add (
193+ gf16Mul (getGF16m (m , j1 , i1 ), getGF16m (m , j2 , i2 )),
194+ gf16Mul (getGF16m (m , j1 , i2 ), getGF16m (m , j2 , i1 ))
195+ )),
196+ gf16Mul (getGF16m (m , j0 , i1 ), gf16Add (
197+ gf16Mul (getGF16m (m , j1 , i0 ), getGF16m (m , j2 , i2 )),
198+ gf16Mul (getGF16m (m , j1 , i2 ), getGF16m (m , j2 , i0 ))
199+ ))
200+ ),
201+ gf16Mul (getGF16m (m , j0 , i2 ), gf16Add (
202+ gf16Mul (getGF16m (m , j1 , i0 ), getGF16m (m , j2 , i1 )),
203+ gf16Mul (getGF16m (m , j1 , i1 ), getGF16m (m , j2 , i0 ))
204+ ))
205+ );
206+ }
207+
188208 private byte determinant4x4 (byte [] m )
189209 {
190210 byte d0 = gf16Mul (getGF16m (m , 0 , 0 ), gf16Add (
@@ -224,30 +244,48 @@ private byte determinant4x4(byte[] m)
224244
225245 private byte determinant5x5 (byte [] m )
226246 {
227- return 0 ;
228- //TODO:
229- // byte result;
230- //
231- // result = gf16Mul(det3x3(m, 0, 1, 2, 0, 1, 2),
232- // gf16Add(gf16Mul(m[3][3], m[4][4]), gf16Mul(m[3][4], m[4][3])));
233- // ... similar calculations for other components ...
234- //result ^= gf16Mul(det3x3(m, 0, 1, 2, 0, 1, 2),
235- // gf16Add(gf16Mul(m[3][3], m[4][4]), gf16Mul(m[3][4], m[4][3])));
236- //return result;
237- }
238-
239- private byte det3x3 (byte [] m , int row1 , int row2 , int row3 , int col1 , int col2 , int col3 )
240- {
241- //TODO:
242- // byte[][] sub = new byte[3][3];
243- // for (int i = 0; i < 3; i++)
244- // {
245- // sub[0][i] = m[row1][col1 + i];
246- // sub[1][i] = m[row2][col1 + i];
247- // sub[2][i] = m[row3][col1 + i];
248- // }
249- // return determinant3x3(sub);
250- return 0 ;
247+ byte result = gf16Mul (determinant3x3 (m , 0 , 1 , 2 , 0 , 1 , 2 ),
248+ gf16Add (gf16Mul (getGF16m (m , 3 ,3 ), getGF16m (m , 4 ,4 )), gf16Mul (getGF16m (m , 3 ,4 ),getGF16m (m , 4 ,3 ))));
249+ result ^= gf16Mul (determinant3x3 (m , 0 , 1 , 3 , 0 , 1 , 2 ),
250+ gf16Add (gf16Mul (getGF16m (m , 3 ,2 ), getGF16m (m , 4 ,4 )), gf16Mul (getGF16m (m , 3 ,4 ),getGF16m (m , 4 ,2 ))));
251+ result ^= gf16Mul (determinant3x3 (m , 0 , 1 , 4 , 0 , 1 , 2 ),
252+ gf16Add (gf16Mul (getGF16m (m , 3 ,2 ), getGF16m (m , 4 ,3 )), gf16Mul (getGF16m (m , 3 ,3 ),getGF16m (m , 4 ,2 ))));
253+ result ^= gf16Mul (determinant3x3 (m , 0 , 2 , 3 , 0 , 1 , 2 ),
254+ gf16Add (gf16Mul (getGF16m (m , 3 ,1 ), getGF16m (m , 4 ,4 )), gf16Mul (getGF16m (m , 3 ,4 ),getGF16m (m , 4 ,1 ))));
255+ result ^= gf16Mul (determinant3x3 (m , 0 , 2 , 4 , 0 , 1 , 2 ),
256+ gf16Add (gf16Mul (getGF16m (m , 3 ,1 ), getGF16m (m , 4 ,3 )), gf16Mul (getGF16m (m , 3 ,3 ),getGF16m (m , 4 ,1 ))));
257+ result ^= gf16Mul (determinant3x3 (m , 0 , 3 , 4 , 0 , 1 , 2 ),
258+ gf16Add (gf16Mul (getGF16m (m , 3 ,1 ), getGF16m (m , 4 ,2 )), gf16Mul (getGF16m (m , 3 ,2 ),getGF16m (m , 4 ,1 ))));
259+ result ^= gf16Mul (determinant3x3 (m , 1 , 2 , 3 , 0 , 1 , 2 ),
260+ gf16Add (gf16Mul (getGF16m (m , 3 ,0 ), getGF16m (m , 4 ,4 )), gf16Mul (getGF16m (m , 3 ,4 ),getGF16m (m , 4 ,0 ))));
261+ result ^= gf16Mul (determinant3x3 (m , 1 , 2 , 4 , 0 , 1 , 2 ),
262+ gf16Add (gf16Mul (getGF16m (m , 3 ,0 ), getGF16m (m , 4 ,3 )), gf16Mul (getGF16m (m , 3 ,3 ),getGF16m (m , 4 ,0 ))));
263+ result ^= gf16Mul (determinant3x3 (m , 1 , 3 , 4 , 0 , 1 , 2 ),
264+ gf16Add (gf16Mul (getGF16m (m , 3 ,0 ), getGF16m (m , 4 ,2 )), gf16Mul (getGF16m (m , 3 ,2 ),getGF16m (m , 4 ,0 ))));
265+ result ^= gf16Mul (determinant3x3 (m , 2 , 3 , 4 , 0 , 1 , 2 ),
266+ gf16Add (gf16Mul (getGF16m (m , 3 ,0 ), getGF16m (m , 4 ,1 )), gf16Mul (getGF16m (m , 3 ,1 ),getGF16m (m , 4 ,0 ))));
267+ // return result;
268+ byte a012 = determinant3x3 (m , 0 , 1 , 2 , 0 , 1 , 2 );
269+ byte b012 = gf16Add (gf16Mul (getGF16m (m , 3 , 3 ), getGF16m (m , 4 , 4 )), gf16Mul (getGF16m (m , 3 , 4 ), getGF16m (m , 4 , 3 )));
270+ byte a013 = determinant3x3 (m , 0 , 1 , 3 , 0 , 1 , 2 );
271+ byte b013 = gf16Add (gf16Mul (getGF16m (m , 3 , 2 ), getGF16m (m , 4 , 4 )), gf16Mul (getGF16m (m , 3 , 4 ), getGF16m (m , 4 , 2 )));
272+ byte a014 = determinant3x3 (m , 0 , 1 , 4 , 0 , 1 , 2 );
273+ byte b014 = gf16Add (gf16Mul (getGF16m (m , 3 , 2 ), getGF16m (m , 4 , 3 )), gf16Mul (getGF16m (m , 3 , 3 ), getGF16m (m , 4 , 2 )));
274+ byte a023 = determinant3x3 (m , 0 , 2 , 3 , 0 , 1 , 2 );
275+ byte b023 = gf16Add (gf16Mul (getGF16m (m , 3 , 1 ), getGF16m (m , 4 , 4 )), gf16Mul (getGF16m (m , 3 , 4 ), getGF16m (m , 4 , 1 )));
276+ byte a024 = determinant3x3 (m , 0 , 2 , 4 , 0 , 1 , 2 );
277+ byte b024 = gf16Add (gf16Mul (getGF16m (m , 3 , 1 ), getGF16m (m , 4 , 3 )), gf16Mul (getGF16m (m , 3 , 3 ), getGF16m (m , 4 , 1 )));
278+ byte a034 = determinant3x3 (m , 0 , 3 , 4 , 0 , 1 , 2 );
279+ byte b034 = gf16Add (gf16Mul (getGF16m (m , 3 , 1 ), getGF16m (m , 4 , 2 )), gf16Mul (getGF16m (m , 3 , 2 ), getGF16m (m , 4 , 1 )));
280+ byte a123 = determinant3x3 (m , 1 , 2 , 3 , 0 , 1 , 2 );
281+ byte b123 = gf16Add (gf16Mul (getGF16m (m , 3 , 0 ), getGF16m (m , 4 , 4 )), gf16Mul (getGF16m (m , 3 , 4 ), getGF16m (m , 4 , 0 )));
282+ byte a124 = determinant3x3 (m , 1 , 2 , 4 , 0 , 1 , 2 );
283+ byte b124 = gf16Add (gf16Mul (getGF16m (m , 3 , 0 ), getGF16m (m , 4 , 3 )), gf16Mul (getGF16m (m , 3 , 3 ), getGF16m (m , 4 , 0 )));
284+ byte a134 = determinant3x3 (m , 1 , 3 , 4 , 0 , 1 , 2 );
285+ byte b134 = gf16Add (gf16Mul (getGF16m (m , 3 , 0 ), getGF16m (m , 4 , 2 )), gf16Mul (getGF16m (m , 3 , 2 ), getGF16m (m , 4 , 0 )));
286+ byte a234 = determinant3x3 (m , 2 , 3 , 4 , 0 , 1 , 2 );
287+ byte b234 = gf16Add (gf16Mul (getGF16m (m , 3 , 0 ), getGF16m (m , 4 , 1 )), gf16Mul (getGF16m (m , 3 , 1 ), getGF16m (m , 4 , 0 )));
288+ return result ;
251289 }
252290
253291 private void generateASMatrix (byte [] target , byte a )
@@ -269,9 +307,7 @@ private void generateASMatrix(byte[] target, byte a)
269307 // POD -> entry[a][b] * (entry[c][d] * entry[e][f] + entry[g][h] * entry[i][j])
270308 private byte pod (byte [] m , int a , int b , int c , int d , int e , int f , int g , int h , int i , int j )
271309 {
272- return gf16Add (
273- gf16Mul (getGF16m (m , a , b ), gf16Mul (getGF16m (m , c , d ), getGF16m (m , e , f ))),
274- gf16Mul (getGF16m (m , g , h ), getGF16m (m , i , j )));
310+ return gf16Mul (getGF16m (m , a , b ), (byte )(gf16Mul (getGF16m (m , c , d ), getGF16m (m , e , f )) ^ gf16Mul (getGF16m (m , g , h ), getGF16m (m , i , j ))));
275311 }
276312
277313 private void addMatrices (byte [] a , byte [] b , byte [] c )
@@ -312,8 +348,7 @@ public void genAFqS(byte[] c, int cOff, byte[] ptMatrix)
312348 }
313349
314350 // Handle last term with special case
315- byte lastScalar = (c [cOff + l - 1 ] != 0 ) ? c [cOff + l - 1 ] :
316- gf16Add ((byte )16 , gf16Add (c [cOff ], (byte )(c [cOff ] == 0 ? 1 : 0 )));
351+ byte lastScalar = (byte )((c [cOff + l - 1 ] != 0 ) ? c [cOff + l - 1 ] : 16 - (c [cOff ] + (c [cOff ] == 0 ? 1 : 0 )));
317352 gf16mScale (S [l - 1 ], lastScalar , temp );
318353 addMatrices (ptMatrix , temp , ptMatrix );
319354
@@ -437,14 +472,14 @@ public void genP22(byte[] outP22, byte[][][] T12, byte[][][][] P21, byte[][][][]
437472 GF16Utils .gf16mAdd (temp1 , temp2 , temp1 , l );
438473
439474 // P22[i][j][k] += temp1
440- GF16Utils .gf16mAdd (P22 [i ][j ][k ], temp1 , P22 [i ][j ][k ], l );
475+ GF16Utils .gf16mAdd (P22 [i ][j ][k ], temp1 , P22 [i ][j ][k ], l );
441476 }
442477 }
443478 }
444479 }
445480
446481 // Convert GF16 elements to packed bytes
447- MapGroup1 .encodeP (P22 , outP22 , 0 , m * o * o * lsq );
482+ MapGroup1 .encodeP (P22 , outP22 , 0 , outP22 . length );
448483 }
449484 finally
450485 {
0 commit comments