Skip to content

Commit ac3224a

Browse files
author
gefeili
committed
TODO: genP22
1 parent c8dfa3b commit ac3224a

File tree

2 files changed

+105
-3
lines changed

2 files changed

+105
-3
lines changed

core/src/main/java/org/bouncycastle/pqc/crypto/snova/SnovaEngine.java

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

core/src/main/java/org/bouncycastle/pqc/crypto/snova/SnovaKeyPairGenerator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,9 @@ private void generateKeysCore(SnovaKeyElements keyElements, byte[] pkSeed, byte[
166166

167167
// Generate map components
168168
genABQP(keyElements.map1, pkSeed);
169-
//
170-
// // Generate F matrices
171-
// genF(keyElements.map2, keyElements.map1, keyElements.T12);
169+
170+
// Generate F matrices
171+
engine.genF(keyElements.map2, keyElements.map1, keyElements.T12);
172172

173173
// Generate P22 matrix
174174
// genP22(keyElements.pk.P22, keyElements.T12, keyElements.map1.P21, keyElements.map2.F12);

0 commit comments

Comments
 (0)