Skip to content

Commit d6b6a0d

Browse files
committed
Refactoring in pqc.crypto.hqc
1 parent 39358e6 commit d6b6a0d

2 files changed

Lines changed: 56 additions & 42 deletions

File tree

core/src/main/java/org/bouncycastle/pqc/crypto/hqc/GF.java

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,31 @@ static int inv(int a)
1818
return _INV[a];
1919
}
2020

21-
static int mod(int a)
21+
private static int mod1(int a)
2222
{
23-
int t = a - HQCParameters.GF_MUL_ORDER;
24-
// return t + ((t >> 31) & HQCParameters.GF_MUL_ORDER);
25-
return t + (t >>> 24);
23+
return a + (a >>> 24);
24+
}
25+
26+
private static int mod2(int a)
27+
{
28+
return mod1(a - HQCParameters.GF_MUL_ORDER);
29+
}
30+
31+
private static int mod(int a)
32+
{
33+
return mod2((a & 0xFF) + (a >>> 8));
2634
}
2735

2836
static int mul(int a, int b)
2937
{
30-
int ma = -a >> 31; // a != 0
31-
int mb = -b >> 31; // b != 0
32-
return ma & mb & _EXP[mod(_LOG[a] + _LOG[b])];
38+
int m = (-a & -b) >> 31; // { a, b } != 0
39+
return m & _EXP[mod2(_LOG[a] + _LOG[b])];
40+
}
41+
42+
static int mul3(int a, int b, int c)
43+
{
44+
int m = (-a & -b & -c) >> 31; // { a, b, c } != 0
45+
return m & _EXP[mod(_LOG[a] + _LOG[b] + _LOG[c])];
3346
}
3447

3548
static int sqr(int a)

core/src/main/java/org/bouncycastle/pqc/crypto/hqc/ReedSolomon.java

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,12 @@ private static void computeSyndromes(int[] syndromes, byte[] codeWord, int delta
9696
{
9797
for (int i = 0; i < 2 * delta; i++)
9898
{
99+
int syndromes_i = syndromes[i] ^ Utils.toUnsigned8bits(codeWord[0]);
99100
for (int j = 1; j < n1; j++)
100101
{
101-
syndromes[i] ^= GF.mul(Utils.toUnsigned8bits(codeWord[j]), alpha[i][j - 1]);
102+
syndromes_i ^= GF.mul(Utils.toUnsigned8bits(codeWord[j]), alpha[i][j - 1]);
102103
}
103-
syndromes[i] ^= Utils.toUnsigned8bits(codeWord[0]);
104+
syndromes[i] = syndromes_i;
104105
}
105106
}
106107

@@ -131,10 +132,7 @@ private static int computeELP(int[] sigma, int[] syndromes, int delta)
131132
int degX = Utils.toUnsigned16Bits(i - pp);
132133
int degXSigmaP = Utils.toUnsigned16Bits(degX + degSigmaP);
133134

134-
int firstMask = d != 0 ? 0xffff : 0;
135-
int secondMask = degXSigmaP > degSigma ? 0xffff : 0;
136-
137-
int mask = firstMask & secondMask;
135+
int mask = ((d | -d) & (degSigma - degXSigmaP)) >> 31;
138136
degSigma ^= mask & (degXSigmaP ^ degSigma);
139137

140138
if (i == (2 * delta - 1))
@@ -164,78 +162,81 @@ private static int computeELP(int[] sigma, int[] syndromes, int delta)
164162
private static void computeZx(int[] output, int[] sigma, int deg, int[] syndromes, int delta)
165163
{
166164
output[0] = 1;
167-
168-
for (int i = 1; i < delta + 1; i++)
165+
output[1] = syndromes[0];
169166
{
170-
int mask = i - deg < 1 ? 0xffff : 0;
171-
output[i] = mask & sigma[i];
167+
int mask = ~(deg - 1) >> 31;
168+
output[1] ^= mask & sigma[1];
172169
}
173-
174-
output[1] ^= syndromes[0];
175-
176170
for (int i = 2; i <= delta; i++)
177171
{
178-
int mask = i - deg < 1 ? 0xffff : 0;
179-
output[i] ^= (mask) & syndromes[i - 1];
172+
int out_i = sigma[i] ^ syndromes[i - 1];
180173
for (int j = 1; j < i; j++)
181174
{
182-
output[i] ^= (mask) & GF.mul(sigma[j], syndromes[i - j - 1]);
175+
out_i ^= GF.mul(sigma[j], syndromes[i - j - 1]);
183176
}
177+
178+
int mask = ~(deg - i) >> 31;
179+
output[i] = mask & out_i;
184180
}
185181
}
186182

187183
private static void computeErrors(int[] res, int[] zx, byte[] errorCompactSet, int delta, int n1)
188184
{
189185
int[] betaSet = new int[delta];
190-
int[] eSet = new int[delta];
191186

192187
int deltaCount1 = 0;
193188
for (int i = 0; i < n1; i++)
194189
{
190+
int ecs_i = errorCompactSet[i] & 0xFF;
191+
int mask = (ecs_i | -ecs_i) >> 31;
192+
195193
int mark = 0;
196-
int mask = errorCompactSet[i] != 0 ? 0xffff : 0;
197194
for (int j = 0; j < delta; j++)
198195
{
199-
int iMask = j == deltaCount1 ? 0xffff : 0;
200-
betaSet[j] += iMask & mask & expArrays[i];
201-
mark += iMask & mask & 1;
196+
int iMask = (((j ^ deltaCount1) - 1) >> 31) & mask;
197+
betaSet[j] += iMask & expArrays[i];
198+
mark -= iMask; // conditional +1
202199
}
203200
deltaCount1 += mark;
204201
}
205202

203+
int[] eSet = new int[delta];
206204
for (int i = 0; i < delta; i++)
207205
{
208-
int temp1 = 1;
209-
int temp2 = 1;
210206
int inv = GF.inv(betaSet[i]);
211-
int invPow = 1;
212207

213-
for (int j = 1; j <= delta; j++)
208+
int temp1 = 0;
209+
for (int j = delta; j > 0; --j)
214210
{
215-
invPow = GF.mul(invPow, inv);
216-
temp1 ^= GF.mul(invPow, zx[j]);
211+
temp1 = GF.mul(temp1 ^ zx[j], inv);
217212
}
213+
temp1 ^= 1;
218214

219-
for (int j = 1; j < delta; j++)
215+
int temp2 = 1;
216+
for (int j = 0; j < delta; ++j)
220217
{
221-
temp2 = GF.mul(temp2, 1 ^ GF.mul(inv, betaSet[(i + j) % delta]));
218+
if (i != j)
219+
{
220+
temp2 ^= GF.mul3(temp2, inv, betaSet[j]);
221+
}
222222
}
223223

224-
int mask1 = i < deltaCount1 ? 0xffff : 0;
224+
int mask1 = (i - deltaCount1) >> 31;
225225
eSet[i] = mask1 & GF.div(temp1, temp2);
226226
}
227227

228228
int deltaCount2 = 0;
229229
for (int i = 0; i < n1; i++)
230230
{
231-
int mark = 0;
232-
int mask = errorCompactSet[i] != 0 ? 0xffff : 0;
231+
int ecs_i = errorCompactSet[i] & 0xFF;
232+
int mask = (ecs_i | -ecs_i) >> 31;
233233

234+
int mark = 0;
234235
for (int j = 0; j < delta; j++)
235236
{
236-
int iMask = j == deltaCount2 ? 0xffff : 0;
237-
res[i] += iMask & mask & eSet[j];
238-
mark += iMask & mask & 1;
237+
int iMask = (((j ^ deltaCount2) - 1) >> 31) & mask;
238+
res[i] += iMask & eSet[j];
239+
mark -= iMask; // conditional +1
239240
}
240241
deltaCount2 += mark;
241242
}

0 commit comments

Comments
 (0)