Skip to content

Commit 9e1a4bd

Browse files
author
gefeili
committed
Code refactoring for GeMSS: combine mul with xor operation into a new function
1 parent 8e5caf1 commit 9e1a4bd

File tree

4 files changed

+376
-137
lines changed

4 files changed

+376
-137
lines changed

core/src/main/java/org/bouncycastle/pqc/crypto/gemss/GeMSSEngine.java

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ public GeMSSEngine(int K, int HFEn, int HFEv, int HFEDELTA, int NB_ITE, int HFED
9393
this.HFEDeg = HFEDeg;
9494
this.HFEDegI = HFEDegI;
9595
this.HFEDegJ = HFEDegJ;
96+
NB_BYTES_GFqn = (HFEn >>> 3) + (((HFEn & 7) != 0) ? 1 : 0);
9697
SIZE_ROW = HFEDegI + 1;
9798
HFEnv = HFEn + HFEv;
9899
HFEnq = HFEn >>> 6;
@@ -104,18 +105,23 @@ public GeMSSEngine(int K, int HFEn, int HFEv, int HFEDELTA, int NB_ITE, int HFED
104105
switch (NB_WORD_MUL)
105106
{
106107
case 6:
108+
//gemss128, bluegemss128, redgemss128, whitegemss128, cyangemss128, magentagemss128
107109
mul = new Mul_GF2x.Mul6();
108110
break;
109111
case 9:
112+
//gemss192, bluegemss192, redgemss192, whitegemss192, cyangemss192, magentagemss192, fgemss128, dualmodems128
110113
mul = new Mul_GF2x.Mul9();
111114
break;
112115
case 12:
116+
//gemss256, bluegemss256, redgemss256, whitegemss256, cyangemss256, magentagemss256
113117
mul = new Mul_GF2x.Mul12();
114118
break;
115119
case 13:
120+
//fgemss192, dualmodems192
116121
mul = new Mul_GF2x.Mul13();
117122
break;
118123
case 17:
124+
//fgemss256, dualmodems256
119125
mul = new Mul_GF2x.Mul17();
120126
break;
121127
}
@@ -131,12 +137,11 @@ public GeMSSEngine(int K, int HFEn, int HFEv, int HFEDELTA, int NB_ITE, int HFED
131137
HFEmr8 = HFEm & 7;
132138
NB_BYTES_GFqm = HFEmq8 + (HFEmr8 != 0 ? 1 : 0);
133139
NB_WORD_UNCOMP_EQ = ((((HFEnvq * (HFEnvq + 1)) >>> 1) * NB_BITS_UINT) + (HFEnvq + 1) * HFEnvr);
134-
HFEnvr8 = (HFEnv & 7);
135-
NB_BYTES_GFqnv = ((HFEnv >>> 3) + ((HFEnvr8 != 0) ? 1 : 0));
140+
HFEnvr8 = HFEnv & 7;
141+
NB_BYTES_GFqnv = (HFEnv >>> 3) + ((HFEnvr8 != 0) ? 1 : 0);
136142
VAL_BITS_M = Math.min(HFEDELTA + HFEv, 8 - HFEmr8);
137143
MASK_GF2m = GeMSSUtils.maskUINT(HFEmr);
138144
MASK_GF2n = GeMSSUtils.maskUINT(HFEnr);
139-
NB_BYTES_GFqn = (HFEn >>> 3) + (((HFEn & 7) != 0) ? 1 : 0);
140145
if (K <= 128)
141146
{
142147
ShakeBitStrength = 128;
@@ -698,8 +703,7 @@ void mul_rem_move(Pointer res, Pointer A, Pointer B)
698703

699704
void mul_xorrange_move(Pointer res, Pointer A, Pointer B)
700705
{
701-
mul.mul_gf2x(Buffer_NB_WORD_MUL, A, B);
702-
res.setXorRange(Buffer_NB_WORD_MUL, NB_WORD_MMUL);
706+
mul.mul_gf2x_xor(res, A, B);
703707
A.move(NB_WORD_GFqn);
704708
B.move(NB_WORD_GFqn);
705709
}
@@ -713,8 +717,7 @@ void mul_move(Pointer res, Pointer A, Pointer B)
713717

714718
public void mul_xorrange(Pointer res, Pointer A, Pointer B)
715719
{
716-
mul.mul_gf2x(Buffer_NB_WORD_MUL, A, B);
717-
res.setXorRange(Buffer_NB_WORD_MUL, NB_WORD_MMUL);
720+
mul.mul_gf2x_xor(res, A, B);
718721
}
719722

720723
public void mul_rem_xorrange(Pointer res, Pointer A, Pointer B)
@@ -859,7 +862,7 @@ void invMatrixLU_gf2(Pointer S, Pointer L_orig, Pointer U_orig, FunctionParams i
859862
else if (ifCondition == 1)
860863
{
861864
/* ir = 0 */
862-
Sinv_cpi.set(iq, 1);
865+
Sinv_cpi.set(iq, 1L);
863866
Sinv_cpi.move(nextrow);
864867
}
865868
/* Here, Sinv_cpi is at the end of S_inv */
@@ -1055,7 +1058,6 @@ private int setPk2Value(Pointer pk2, PointerUnion pk64, int nb_bits, int iq, int
10551058
if ((nb_bits & 63) != 0)
10561059
{
10571060
setPk2_loop(pk2, pk64, nb_bits, iq);
1058-
//pk2.set(k, pk64.get(k) >>> (nb_bits & 63));
10591061
pk2.set(iq, pk64.get(iq) >>> (nb_bits & 63));
10601062
if (((nb_bits & 63) + ir) > 64)
10611063
{
@@ -1068,6 +1070,7 @@ private int setPk2Value(Pointer pk2, PointerUnion pk64, int nb_bits, int iq, int
10681070
}
10691071
else
10701072
{
1073+
//TODO Pointer.for_set
10711074
for (k = 0; k <= iq; ++k)
10721075
{
10731076
pk2.set(k, pk64.get(k));
@@ -1092,6 +1095,7 @@ private void setPk2_endValue(Pointer pk2, Pointer pk64, int nb_bits, int iq)
10921095
}
10931096
else
10941097
{
1098+
////TODO Pointer.for_set
10951099
for (k = 0; k <= iq; ++k)
10961100
{
10971101
pk2.set(k, pk64.get(k));
@@ -1101,6 +1105,7 @@ private void setPk2_endValue(Pointer pk2, Pointer pk64, int nb_bits, int iq)
11011105

11021106
private void setPk2_loop(Pointer pk2, Pointer pk64, int nb_bits, int iq)
11031107
{
1108+
//TODO:
11041109
for (int k = 0; k < iq; ++k)
11051110
{
11061111
pk2.set(k, (pk64.get(k) >>> (nb_bits & 63)) ^ (pk64.get(k + 1) << (64 - (nb_bits & 63))));
@@ -1156,6 +1161,7 @@ private long convMQ_last_uncompressL_gf2(Pointer pk2, PointerUnion pk)
11561161
if ((((NB_MONOMIAL_PK - LOST_BITS + 7) >>> 3) & 7) != 0)//Except cyangemss192, magentagemss192
11571162
{
11581163
final int NB_WHOLE_BLOCKS = ((HFEnv - ((64 - ((NB_MONOMIAL_PK - LOST_BITS - HFEnvr) & 63)) & 63)) >>> 6);
1164+
//TODO:
11591165
for (k = 0; k < NB_WHOLE_BLOCKS; ++k)
11601166
{
11611167
pk2.set(k, (pk64.get(k) >>> (nb_bits & 63)) ^ (pk64.getWithCheck(k + 1) << (64 - (nb_bits & 63))));
@@ -1189,6 +1195,7 @@ private long convMQ_last_uncompressL_gf2(Pointer pk2, PointerUnion pk)
11891195
{
11901196
if ((((NB_MONOMIAL_PK - LOST_BITS + 7) >>> 3) & 7) != 0)
11911197
{
1198+
//TODO Pointer.for_set
11921199
for (k = 0; k < iq; ++k)
11931200
{
11941201
pk2.set(k, pk64.get(k));
@@ -1197,6 +1204,7 @@ private long convMQ_last_uncompressL_gf2(Pointer pk2, PointerUnion pk)
11971204
}
11981205
else
11991206
{
1207+
//TODO Pointer.for_set
12001208
for (k = 0; k <= iq; ++k)
12011209
{
12021210
pk2.set(k, pk64.get(k));
@@ -1222,6 +1230,7 @@ else if (LAST_ROW_Q != 0)
12221230
}
12231231
else
12241232
{
1233+
//TODO Pointer.for_set
12251234
for (k = 0; k < iq; ++k)
12261235
{
12271236
pk2.set(k, pk64.get(k));
@@ -1896,7 +1905,7 @@ private void LOOPIR(Pointer S, Pointer L_cp, Pointer U, int NB_IT, int nq, int n
18961905
private void LOOPJR(Pointer S, Pointer L, Pointer U, int NB_IT, int iq, int jq)
18971906
{
18981907
int mini = Math.min(iq, jq);
1899-
S.set(0, 0);
1908+
S.set(0L);
19001909
long tmp;
19011910
for (int jr = 0; jr < NB_IT; ++jr)
19021911
{
@@ -2162,7 +2171,7 @@ private int frobeniusMap_HFE_gf2nx(Pointer Xqn, SecretKeyHFE.complete_sparse_mon
21622171
/* Step 1: compute X^(2^(HFEDegI+1)) */
21632172
d = 2 << HFEDegI;
21642173
/* Xqn is initialized to 0 with calloc, so the multiprecision word is initialized to 1 just by setting the first word */
2165-
Xqn.set(d * NB_WORD_GFqn, 1);
2174+
Xqn.set(d * NB_WORD_GFqn, 1L);
21662175
/* Step 2: reduction of X^(2^(HFEDegI+1)) modulo (F-U) */
21672176
divsqr_r_HFE_cstdeg_gf2nx(Xqn, d, F, cst);
21682177
for (i = HFEDegI + 1; i < HFEn; ++i)
@@ -2173,7 +2182,7 @@ private int frobeniusMap_HFE_gf2nx(Pointer Xqn, SecretKeyHFE.complete_sparse_mon
21732182
divsqr_r_HFE_cstdeg_gf2nx(Xqn, (HFEDeg - 1) << 1, F, cst);
21742183
}
21752184
/* (X^(2^n) mod (F-U)) - X */
2176-
Xqn.setXor(NB_WORD_GFqn, 1);
2185+
Xqn.setXor(NB_WORD_GFqn, 1L);
21772186
return getD_for_not0_or_plus(Xqn);
21782187
}
21792188

@@ -2450,7 +2459,7 @@ private void convHFEpolynomialSparseToDense_gf2nx(Pointer F_dense, SecretKeyHFE.
24502459
}
24512460
F_dense.changeIndex(F_dense_orig);
24522461
/* Leading term: 1 */
2453-
F_dense.set(HFEDeg * NB_WORD_GFqn, 1);
2462+
F_dense.set(HFEDeg * NB_WORD_GFqn, 1L);
24542463
}
24552464

24562465
int div_r_gf2nx(Pointer A, int da, Pointer B, int db)
@@ -3589,7 +3598,6 @@ int interpolateHFE_FS_ref(Pointer MQS, Pointer F, Pointer S)
35893598
void evalHFEv_gf2nx(Pointer Fxv, Pointer F, Pointer xv)
35903599
{
35913600
Pointer cur_acc = new Pointer(NB_WORD_MUL);
3592-
//Pointer prod = new Pointer(NB_WORD_MUL);
35933601
Pointer acc = new Pointer(NB_WORD_MUL);
35943602
Pointer tab_Xqj = new Pointer((HFEDegI + 1) * NB_WORD_GFqn);
35953603
Pointer tab_Xqj_cp2 = new Pointer();
@@ -3608,6 +3616,7 @@ void evalHFEv_gf2nx(Pointer Fxv, Pointer F, Pointer xv)
36083616
}
36093617
/* Evaluation of the constant, quadratic in the vinegars */
36103618
int endloop = (NB_WORD_GFqn + NB_WORD_GFqv) == NB_WORD_GF2nv ? NB_WORD_GFqv : NB_WORD_GFqv - 1;
3619+
//TODO setRangeRotate
36113620
for (j = 0; j < endloop; ++j)
36123621
{
36133622
V.set(j, (xv.get(NB_WORD_GFqn - 1 + j) >>> HFEnr) ^ (xv.get(NB_WORD_GFqn + j) << (64 - HFEnr)));
@@ -3702,7 +3711,7 @@ int sign_openHFE_uncomp_pk(byte[] m, int len, byte[] sm8, PointerUnion pk)
37023711
/* Copy of pointer */
37033712
Pointer Si = new Pointer(Si_tab);
37043713
/* Vector of D_1, ..., D_(NB_ITE) */
3705-
Pointer D = new Pointer(SIZE_DIGEST_UINT);//NB_ITE * SIZE_DIGEST_UINT
3714+
Pointer D = new Pointer(SIZE_DIGEST_UINT);
37063715
/* Take the (n+v) first bits */
37073716
sm.fill(0, sm8, 0, NB_BYTES_GFqnv);
37083717
byte[] hashbuffer = new byte[64];

0 commit comments

Comments
 (0)