@@ -331,4 +331,106 @@ private void gf16mScale(byte[] a, byte k, byte[] result)
331331 }
332332 }
333333 }
334+
335+ public void genF (MapGroup2 map2 , MapGroup1 map1 , byte [][][] T12 ) {
336+ int m = params .getM ();
337+ int v = params .getV ();
338+ int o = params .getO ();
339+ int l = params .getL ();
340+ int lsq = l * l ;
341+
342+ // Copy initial matrices
343+ copy4DMatrix (map1 .p11 , map2 .f11 , m , v , v , lsq );
344+ copy4DMatrix (map1 .p12 , map2 .f12 , m , v , o , lsq );
345+ copy4DMatrix (map1 .p21 , map2 .f21 , m , o , v , lsq );
346+
347+ byte [] temp = new byte [lsq ];
348+
349+ // First matrix operation sequence
350+ for (int i = 0 ; i < m ; i ++) {
351+ for (int j = 0 ; j < v ; j ++) {
352+ for (int k = 0 ; k < o ; k ++) {
353+ for (int index = 0 ; index < v ; index ++) {
354+ GF16Utils .gf16mMul (temp , map1 .p11 [i ][j ][index ], T12 [index ][k ], l );
355+ GF16Utils .gf16mAdd (map2 .f12 [i ][j ][k ], map2 .f12 [i ][j ][k ], temp , l );
356+ }
357+ }
358+ }
359+ }
360+
361+ // Second matrix operation sequence
362+ for (int i = 0 ; i < m ; i ++) {
363+ for (int j = 0 ; j < o ; j ++) {
364+ for (int k = 0 ; k < v ; k ++) {
365+ for (int index = 0 ; index < v ; index ++) {
366+ GF16Utils .gf16mMul (temp , T12 [index ][j ], map1 .p11 [i ][index ][k ], l );
367+ GF16Utils .gf16mAdd (map2 .f21 [i ][j ][k ], map2 .f21 [i ][j ][k ], temp , l );
368+ }
369+ }
370+ }
371+ }
372+
373+ // Secure clear temporary buffer
374+ Arrays .fill (temp , (byte ) 0 );
375+ }
376+
377+ private static void copy4DMatrix (byte [][][][] src , byte [][][][] dest ,
378+ int dim1 , int dim2 , int dim3 , int lsq ) {
379+ for (int i = 0 ; i < dim1 ; i ++) {
380+ for (int j = 0 ; j < dim2 ; j ++) {
381+ for (int k = 0 ; k < dim3 ; k ++) {
382+ System .arraycopy (
383+ src [i ][j ][k ], 0 ,
384+ dest [i ][j ][k ], 0 ,
385+ lsq
386+ );
387+ }
388+ }
389+ }
390+ }
391+
392+ public void genP22 (byte [] outP22 , byte [][][] T12 , byte [][][][] P21 , byte [][][][] F12 , SnovaParameters params ) {
393+ int m = params .getM ();
394+ int o = params .getO ();
395+ int v = params .getV ();
396+ int l = params .getL ();
397+ int lsq = l * l ;
398+
399+ // Initialize P22 with zeros
400+ byte [][][][] P22 = new byte [m ][o ][o ][lsq ];
401+
402+ // Temporary buffers
403+ byte [] temp1 = new byte [lsq ];
404+ byte [] temp2 = new byte [lsq ];
405+
406+ try {
407+ for (int i = 0 ; i < m ; i ++) {
408+ for (int j = 0 ; j < o ; j ++) {
409+ for (int k = 0 ; k < o ; k ++) {
410+ for (int index = 0 ; index < v ; index ++) {
411+ // temp1 = T12[index][j] * F12[i][index][k]
412+ GF16Utils .gf16mMul (temp1 , T12 [index ][j ], F12 [i ][index ][k ], l );
413+
414+ // temp2 = P21[i][j][index] * T12[index][k]
415+ GF16Utils .gf16mMul (temp2 , P21 [i ][j ][index ], T12 [index ][k ], l );
416+
417+ // temp1 += temp2
418+ GF16Utils .gf16mAdd (temp1 , temp1 , temp2 , l );
419+
420+ // P22[i][j][k] += temp1
421+ GF16Utils .gf16mAdd (P22 [i ][j ][k ], P22 [i ][j ][k ], temp1 , l );
422+ }
423+ }
424+ }
425+ }
426+
427+ // Convert GF16 elements to packed bytes
428+ //TODO
429+ //GF16Utils.decode(P22, outP22, m * o * o *lsq);
430+ } finally {
431+ // Secure clear temporary buffers
432+ Arrays .fill (temp1 , (byte ) 0 );
433+ Arrays .fill (temp2 , (byte ) 0 );
434+ }
435+ }
334436}
0 commit comments