Skip to content

Commit 5efe465

Browse files
committed
added support for NTRU HRSS 1373
1 parent 3d66c26 commit 5efe465

File tree

10 files changed

+110
-23
lines changed

10 files changed

+110
-23
lines changed

Diff for: core/src/main/java/org/bouncycastle/pqc/crypto/ntru/NTRUParameters.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ public class NTRUParameters
4242
/**
4343
* NTRU-HRSS parameter set with n = 1373.
4444
*/
45-
// TODO
46-
// public static final NTRUParameters ntruhrss1373 = new NTRUParameters("ntruhrss1373", new NTRUHRSS1373());
45+
public static final NTRUParameters ntruhrss1373 = new NTRUParameters("ntruhrss1373", new NTRUHRSS1373());
4746

4847
private final String name;
4948
/**

Diff for: core/src/main/java/org/bouncycastle/pqc/crypto/util/Utils.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -205,14 +205,14 @@ class Utils
205205
ntruOids.put(NTRUParameters.ntruhps4096821, BCObjectIdentifiers.ntruhps4096821);
206206
ntruOids.put(NTRUParameters.ntruhps40961229, BCObjectIdentifiers.ntruhps40961229);
207207
ntruOids.put(NTRUParameters.ntruhrss701, BCObjectIdentifiers.ntruhrss701);
208-
// ntruOids.put(NTRUParameters.ntruhrss1373, BCObjectIdentifiers.ntruhrss1373);
208+
ntruOids.put(NTRUParameters.ntruhrss1373, BCObjectIdentifiers.ntruhrss1373);
209209

210210
ntruParams.put(BCObjectIdentifiers.ntruhps2048509, NTRUParameters.ntruhps2048509);
211211
ntruParams.put(BCObjectIdentifiers.ntruhps2048677, NTRUParameters.ntruhps2048677);
212212
ntruParams.put(BCObjectIdentifiers.ntruhps4096821, NTRUParameters.ntruhps4096821);
213213
ntruParams.put(BCObjectIdentifiers.ntruhps40961229, NTRUParameters.ntruhps40961229);
214214
ntruParams.put(BCObjectIdentifiers.ntruhrss701, NTRUParameters.ntruhrss701);
215-
// ntruParams.put(BCObjectIdentifiers.ntruhrss1373, NTRUParameters.ntruhrss1373);
215+
ntruParams.put(BCObjectIdentifiers.ntruhrss1373, NTRUParameters.ntruhrss1373);
216216

217217
falconOids.put(FalconParameters.falcon_512, BCObjectIdentifiers.falcon_512);
218218
falconOids.put(FalconParameters.falcon_1024, BCObjectIdentifiers.falcon_1024);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package org.bouncycastle.pqc.math.ntru;
2+
3+
import org.bouncycastle.pqc.math.ntru.parameters.NTRUHRSSParameterSet;
4+
5+
public class HRSS1373Polynomial
6+
extends HRSSPolynomial
7+
{
8+
private static final int L = ((1373 + 31) / 32) * 32;
9+
private static final int M = L / 4;
10+
private static final int K = L / 16;
11+
12+
public HRSS1373Polynomial(NTRUHRSSParameterSet params)
13+
{
14+
super(params);
15+
}
16+
17+
@Override
18+
public byte[] sqToBytes(int len)
19+
{
20+
byte[] r = new byte[len];
21+
int i, j;
22+
short[] t = new short[4];
23+
24+
for (i = 0; i < params.packDegree() / 4; i++)
25+
{
26+
for (j = 0; j < 4; j++)
27+
{
28+
t[j] = (short)modQ(this.coeffs[4 * i + j] & 0xffff, params.q());
29+
}
30+
31+
// t0 t1 t2 t3
32+
// r0 8
33+
// r1 6 | 2
34+
// r2 8
35+
// r3 4 | 4
36+
// r4 8
37+
// r5 2 | 6
38+
// r6 8
39+
40+
r[7 * i + 0] = (byte)(t[0] & 0xff);
41+
r[7 * i + 1] = (byte)((t[0] >>> 8) | ((t[1] & 0x03) << 6));
42+
r[7 * i + 2] = (byte)((t[1] >>> 2) & 0xff);
43+
r[7 * i + 3] = (byte)((t[1] >>> 10) | ((t[2] & 0x0f) << 4));
44+
r[7 * i + 4] = (byte)((t[2] >>> 4) & 0xff);
45+
r[7 * i + 5] = (byte)((t[2] >>> 12) | ((t[3] & 0x3f) << 2));
46+
r[7 * i + 6] = (byte)(t[3] >>> 6);
47+
}
48+
49+
// i=NTRU_PACK_DEG/4;
50+
if (params.packDegree() % 4 == 2)
51+
{
52+
t[0] = (short)modQ(this.coeffs[params.packDegree() - 2] & 0xffff, params.q());
53+
t[1] = (short)modQ(this.coeffs[params.packDegree() - 1] & 0xffff, params.q());
54+
r[7 * i + 0] = (byte)(t[0] & 0xff);
55+
r[7 * i + 1] = (byte)((t[0] >>> 8) | ((t[1] & 0x03) << 6));
56+
r[7 * i + 2] = (byte)((t[1] >>> 2) & 0xff);
57+
r[7 * i + 3] = (byte)(t[1] >>> 10);
58+
}
59+
60+
return r;
61+
}
62+
63+
@Override
64+
public void sqFromBytes(byte[] a)
65+
{
66+
int i;
67+
for (i = 0; i < params.packDegree() / 4; i++)
68+
{
69+
this.coeffs[4 * i + 0] = (short)((a[7 * i + 0] & 0xff) | (((short)(a[7 * i + 1] & 0xff) & 0x3f) << 8));
70+
this.coeffs[4 * i + 1] = (short)(((a[7 * i + 1] & 0xff) >>> 6) | (((short)(a[7 * i + 2] & 0xff)) << 2) | ((short)(a[7 * i + 3] & 0x0f) << 10));
71+
this.coeffs[4 * i + 2] = (short)(((a[7 * i + 3] & 0xff) >>> 4) | (((short)(a[7 * i + 4] & 0xff) & 0xff) << 4) | ((short)(a[7 * i + 5] & 0x03) << 12));
72+
this.coeffs[4 * i + 3] = (short)(((a[7 * i + 5] & 0xff) >>> 2) | (((short)(a[7 * i + 6] & 0xff)) << 6));
73+
}
74+
75+
// i=NTRU_PACK_DEG/4;
76+
if (params.packDegree() % 4 == 2)
77+
{
78+
this.coeffs[4 * i + 0] = (short)(a[7 * i + 0] | ((a[7 * i + 1] & 0x3f) << 8));
79+
this.coeffs[4 * i + 1] = (short)((a[7 * i + 1] >>> 6) | (((short)a[7 * i + 2]) << 2) | (((short)a[7 * i + 3] & 0x0f) << 10));
80+
}
81+
82+
this.coeffs[params.n() - 1] = 0;
83+
}
84+
}

Diff for: core/src/main/java/org/bouncycastle/pqc/math/ntru/HRSSPolynomial.java

+13-13
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public void lift(Polynomial a)
117117
/* NOTE: Assumes input is in {0,1,2}^N */
118118
/* Produces output in [0,Q-1]^N */
119119
int i;
120-
HRSSPolynomial b = new HRSSPolynomial((NTRUHRSSParameterSet)this.params);
120+
Polynomial b = this.params.createPolynomial();
121121
short t, zj;
122122

123123
/* Define z by <z*x^i, x-1> = delta_{i,0} mod 3: */
@@ -166,30 +166,30 @@ public void lift(Polynomial a)
166166
@Override
167167
public void r2Inv(Polynomial a)
168168
{
169-
HRSSPolynomial f = new HRSSPolynomial((NTRUHRSSParameterSet)this.params);
170-
HRSSPolynomial g = new HRSSPolynomial((NTRUHRSSParameterSet)this.params);
171-
HRSSPolynomial v = new HRSSPolynomial((NTRUHRSSParameterSet)this.params);
172-
HRSSPolynomial w = new HRSSPolynomial((NTRUHRSSParameterSet)this.params);
169+
Polynomial f = this.params.createPolynomial();
170+
Polynomial g = this.params.createPolynomial();
171+
Polynomial v = this.params.createPolynomial();
172+
Polynomial w = this.params.createPolynomial();
173173
this.r2Inv(a, f, g, v, w);
174174
}
175175

176176
@Override
177177
public void rqInv(Polynomial a)
178178
{
179-
HRSSPolynomial ai2 = new HRSSPolynomial((NTRUHRSSParameterSet)this.params);
180-
HRSSPolynomial b = new HRSSPolynomial((NTRUHRSSParameterSet)this.params);
181-
HRSSPolynomial c = new HRSSPolynomial((NTRUHRSSParameterSet)this.params);
182-
HRSSPolynomial s = new HRSSPolynomial((NTRUHRSSParameterSet)this.params);
179+
Polynomial ai2 = this.params.createPolynomial();
180+
Polynomial b = this.params.createPolynomial();
181+
Polynomial c = this.params.createPolynomial();
182+
Polynomial s = this.params.createPolynomial();
183183
this.rqInv(a, ai2, b, c, s);
184184
}
185185

186186
@Override
187187
public void s3Inv(Polynomial a)
188188
{
189-
HRSSPolynomial f = new HRSSPolynomial((NTRUHRSSParameterSet)this.params);
190-
HRSSPolynomial g = new HRSSPolynomial((NTRUHRSSParameterSet)this.params);
191-
HRSSPolynomial v = new HRSSPolynomial((NTRUHRSSParameterSet)this.params);
192-
HRSSPolynomial w = new HRSSPolynomial((NTRUHRSSParameterSet)this.params);
189+
Polynomial f = this.params.createPolynomial();
190+
Polynomial g = this.params.createPolynomial();
191+
Polynomial v = this.params.createPolynomial();
192+
Polynomial w = this.params.createPolynomial();
193193
this.s3Inv(a, f, g, v, w);
194194
}
195195
}

Diff for: core/src/main/java/org/bouncycastle/pqc/math/ntru/parameters/NTRUHRSSParameterSet.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.bouncycastle.pqc.math.ntru.parameters;
22

3+
import org.bouncycastle.pqc.math.ntru.HRSS1373Polynomial;
34
import org.bouncycastle.pqc.math.ntru.HRSSPolynomial;
45
import org.bouncycastle.pqc.math.ntru.Polynomial;
56

@@ -22,7 +23,7 @@ public abstract class NTRUHRSSParameterSet
2223
@Override
2324
public Polynomial createPolynomial()
2425
{
25-
return new HRSSPolynomial(this);
26+
return this.n() == 1373 ? new HRSS1373Polynomial(this) : new HRSSPolynomial(this);
2627
}
2728

2829
@Override

Diff for: core/src/test/java/org/bouncycastle/pqc/crypto/test/NTRUTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public class NTRUTest
3838
NTRUParameters.ntruhps4096821,
3939
NTRUParameters.ntruhps40961229,
4040
NTRUParameters.ntruhrss701,
41-
// NTRUParameters.ntruhrss1373
41+
NTRUParameters.ntruhrss1373
4242
};
4343

4444
private final String[] katBase = {
@@ -47,7 +47,7 @@ public class NTRUTest
4747
"ntruhps4096821",
4848
"ntruhps40961229",
4949
"ntruhrss701",
50-
// "ntruhrss1373"
50+
"ntruhrss1373"
5151
};
5252

5353
private final String[] katFiles = {

Diff for: docs/releasenotes.html

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ <h3>2.1.2 Defects Fixed</h3>
2828
<h3>2.1.3 Additional Features and Functionality</h3>
2929
<ul>
3030
<li>An implementation of MLS (RFC 9420 - The Messaging Layer Security Protocol) has been added as a new module.</li>
31+
<li>NTRU now supports NTRU-HPS4096-1229 and NTRU-HRSS-1373.</li>
3132
</ul>
3233
<h3>2.1.4 Notes.</h3>
3334
<ul>

Diff for: prov/src/main/java/org/bouncycastle/pqc/jcajce/provider/ntru/NTRUKeyPairGeneratorSpi.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public class NTRUKeyPairGeneratorSpi
3030
parameters.put(NTRUParameterSpec.ntruhps4096821.getName(), NTRUParameters.ntruhps4096821);
3131
parameters.put(NTRUParameterSpec.ntruhps40961229.getName(), NTRUParameters.ntruhps40961229);
3232
parameters.put(NTRUParameterSpec.ntruhrss701.getName(), NTRUParameters.ntruhrss701);
33-
// parameters.put(NTRUParameterSpec.ntruhrss1373.getName(), NTRUParameters.ntruhrss1373);
33+
parameters.put(NTRUParameterSpec.ntruhrss1373.getName(), NTRUParameters.ntruhrss1373);
3434
}
3535

3636
NTRUKeyGenerationParameters param;

Diff for: prov/src/main/java/org/bouncycastle/pqc/jcajce/spec/NTRUParameterSpec.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class NTRUParameterSpec
1515
public static final NTRUParameterSpec ntruhps4096821 = new NTRUParameterSpec(NTRUParameters.ntruhps4096821);
1616
public static final NTRUParameterSpec ntruhps40961229 = new NTRUParameterSpec(NTRUParameters.ntruhps40961229);
1717
public static final NTRUParameterSpec ntruhrss701 = new NTRUParameterSpec(NTRUParameters.ntruhrss701);
18-
// public static final NTRUParameterSpec ntruhrss1373 = new NTRUParameterSpec(NTRUParameters.ntruhrss1373);
18+
public static final NTRUParameterSpec ntruhrss1373 = new NTRUParameterSpec(NTRUParameters.ntruhrss1373);
1919

2020
private static Map parameters = new HashMap();
2121

@@ -24,7 +24,9 @@ public class NTRUParameterSpec
2424
parameters.put("ntruhps2048509", ntruhps2048509);
2525
parameters.put("ntruhps2048677", ntruhps2048677);
2626
parameters.put("ntruhps4096821", ntruhps4096821);
27+
parameters.put("ntruhps40961229", ntruhps40961229);
2728
parameters.put("ntruhrss701", ntruhrss701);
29+
parameters.put("ntruhrss1373", ntruhrss1373);
2830
}
2931

3032
private final String name;

Diff for: prov/src/test/java/org/bouncycastle/pqc/jcajce/provider/test/NTRUKeyPairGeneratorTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public void testKeyPairEncoding()
4242
NTRUParameterSpec.ntruhps4096821,
4343
NTRUParameterSpec.ntruhps40961229,
4444
NTRUParameterSpec.ntruhrss701,
45-
// NTRUParameterSpec.ntruhrss1373
45+
NTRUParameterSpec.ntruhrss1373
4646
};
4747
kf = KeyFactory.getInstance("NTRU", "BC");
4848

0 commit comments

Comments
 (0)