Skip to content

Commit 1797229

Browse files
author
gefeili
committed
Merge branch 'main' into 1913-openpgp-v6-null-pointer
2 parents 77f1900 + 4580acc commit 1797229

File tree

7 files changed

+76
-52
lines changed

7 files changed

+76
-52
lines changed

core/src/main/java/org/bouncycastle/pqc/crypto/lms/HSSPrivateKeyParameters.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,23 @@ public class HSSPrivateKeyParameters
2626

2727
private HSSPublicKeyParameters publicKey;
2828

29+
public HSSPrivateKeyParameters(LMSPrivateKeyParameters key, long index, long indexLimit)
30+
{
31+
super(true);
32+
33+
this.l = 1;
34+
this.keys = Collections.singletonList(key);
35+
this.sig = Collections.emptyList();
36+
this.index = index;
37+
this.indexLimit = indexLimit;
38+
this.isShard = false;
39+
40+
//
41+
// Correct Intermediate LMS values will be constructed during reset to index.
42+
//
43+
resetKeyToIndex();
44+
}
45+
2946
public HSSPrivateKeyParameters(int l, List<LMSPrivateKeyParameters> keys, List<LMSSignature> sig, long index, long indexLimit)
3047
{
3148
super(true);
@@ -104,7 +121,16 @@ else if (src instanceof byte[])
104121
try // 1.5 / 1.6 compatibility
105122
{
106123
in = new DataInputStream(new ByteArrayInputStream((byte[])src));
107-
return getInstance(in);
124+
try
125+
{
126+
return getInstance(in);
127+
}
128+
catch (Exception e)
129+
{
130+
// old style single LMS key.
131+
LMSPrivateKeyParameters lmsKey = LMSPrivateKeyParameters.getInstance(src);
132+
return new HSSPrivateKeyParameters(lmsKey, lmsKey.getIndex(), lmsKey.getIndex() + lmsKey.getUsagesRemaining());
133+
}
108134
}
109135
finally
110136
{

core/src/main/java/org/bouncycastle/pqc/crypto/util/PrivateKeyFactory.java

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import org.bouncycastle.pqc.crypto.hqc.HQCParameters;
4444
import org.bouncycastle.pqc.crypto.hqc.HQCPrivateKeyParameters;
4545
import org.bouncycastle.pqc.crypto.lms.HSSPrivateKeyParameters;
46-
import org.bouncycastle.pqc.crypto.lms.LMSPrivateKeyParameters;
4746
import org.bouncycastle.pqc.crypto.mldsa.MLDSAParameters;
4847
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPrivateKeyParameters;
4948
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPublicKeyParameters;
@@ -158,26 +157,13 @@ else if (algOID.equals(PKCSObjectIdentifiers.id_alg_hss_lms_hashsig))
158157
byte[] keyEnc = lmsKey.getOctets();
159158
ASN1BitString pubKey = keyInfo.getPublicKeyData();
160159

161-
if (Pack.bigEndianToInt(keyEnc, 0) == 1)
160+
if (pubKey != null)
162161
{
163-
if (pubKey != null)
164-
{
165-
byte[] pubEnc = pubKey.getOctets();
166-
167-
return LMSPrivateKeyParameters.getInstance(Arrays.copyOfRange(keyEnc, 4, keyEnc.length), Arrays.copyOfRange(pubEnc, 4, pubEnc.length));
168-
}
169-
return LMSPrivateKeyParameters.getInstance(Arrays.copyOfRange(keyEnc, 4, keyEnc.length));
170-
}
171-
else
172-
{
173-
if (pubKey != null)
174-
{
175-
byte[] pubEnc = pubKey.getOctets();
162+
byte[] pubEnc = pubKey.getOctets();
176163

177-
return HSSPrivateKeyParameters.getInstance(Arrays.copyOfRange(keyEnc, 4, keyEnc.length), pubEnc);
178-
}
179-
return HSSPrivateKeyParameters.getInstance(Arrays.copyOfRange(keyEnc, 4, keyEnc.length));
164+
return HSSPrivateKeyParameters.getInstance(Arrays.copyOfRange(keyEnc, 4, keyEnc.length), pubEnc);
180165
}
166+
return HSSPrivateKeyParameters.getInstance(Arrays.copyOfRange(keyEnc, 4, keyEnc.length));
181167
}
182168
else if (algOID.on(BCObjectIdentifiers.sphincsPlus) || algOID.on(BCObjectIdentifiers.sphincsPlus_interop))
183169
{

core/src/main/java/org/bouncycastle/pqc/crypto/util/PublicKeyFactory.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import org.bouncycastle.pqc.crypto.hqc.HQCPublicKeyParameters;
4141
import org.bouncycastle.pqc.crypto.lms.HSSPublicKeyParameters;
4242
import org.bouncycastle.pqc.crypto.lms.LMSKeyParameters;
43-
import org.bouncycastle.pqc.crypto.lms.LMSPublicKeyParameters;
4443
import org.bouncycastle.pqc.crypto.mldsa.MLDSAParameters;
4544
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPublicKeyParameters;
4645
import org.bouncycastle.pqc.crypto.mlkem.MLKEMParameters;
@@ -452,19 +451,11 @@ AsymmetricKeyParameter getPublicKeyParameters(SubjectPublicKeyInfo keyInfo, Obje
452451
private LMSKeyParameters getLmsKeyParameters(byte[] keyEnc)
453452
throws IOException
454453
{
455-
if (Pack.bigEndianToInt(keyEnc, 0) == 1)
454+
if (keyEnc.length == 64)
456455
{
457-
return LMSPublicKeyParameters.getInstance(Arrays.copyOfRange(keyEnc, 4, keyEnc.length));
458-
}
459-
else
460-
{
461-
// public key with extra tree height
462-
if (keyEnc.length == 64)
463-
{
464-
keyEnc = Arrays.copyOfRange(keyEnc, 4, keyEnc.length);
465-
}
466-
return HSSPublicKeyParameters.getInstance(keyEnc);
456+
keyEnc = Arrays.copyOfRange(keyEnc, 4, keyEnc.length);
467457
}
458+
return HSSPublicKeyParameters.getInstance(keyEnc);
468459
}
469460
}
470461

core/src/main/java/org/bouncycastle/pqc/math/ntru/Polynomial.java

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -147,28 +147,33 @@ public byte[] s3ToBytes(int messageSize)
147147

148148
public void s3ToBytes(byte[] msg, int msgOff)
149149
{
150-
byte c;
150+
int degree = params.packDegree(), limit = degree - 5;
151151

152-
for (int i = 0; i < params.packDegree() / 5; i++)
152+
int i = 0;
153+
while (i <= limit)
153154
{
154-
c = (byte)(this.coeffs[5 * i + 4] & 255);
155-
c = (byte)(3 * c + this.coeffs[5 * i + 3] & 255);
156-
c = (byte)(3 * c + this.coeffs[5 * i + 2] & 255);
157-
c = (byte)(3 * c + this.coeffs[5 * i + 1] & 255);
158-
c = (byte)(3 * c + this.coeffs[5 * i + 0] & 255);
159-
msg[i + msgOff] = c;
155+
int c0 = (coeffs[i + 0] & 0xFF);
156+
int c1 = (coeffs[i + 1] & 0xFF) * 3;
157+
int c2 = (coeffs[i + 2] & 0xFF) * 9;
158+
int c3 = (coeffs[i + 3] & 0xFF) * 27;
159+
int c4 = (coeffs[i + 4] & 0xFF) * 81;
160+
161+
msg[msgOff++] = (byte)(c0 + c1 + c2 + c3 + c4);
162+
i += 5;
160163
}
161164

162-
// if 5 does not divide NTRU_N-1
163-
if (params.packDegree() > (params.packDegree() / 5) * 5)
165+
if (i < degree)
164166
{
165-
int i = params.packDegree() / 5;
166-
c = 0;
167-
for (int j = params.packDegree() - (5 * i) - 1; j >= 0; j--)
167+
int j = degree - 1;
168+
int c = coeffs[j] & 0xFF;
169+
170+
while (--j >= i)
168171
{
169-
c = (byte)(3 * c + this.coeffs[5 * i + j] & 255);
172+
c *= 3;
173+
c += coeffs[j] & 0xFF;
170174
}
171-
msg[i + msgOff] = c;
175+
176+
msg[msgOff++] = (byte)c;
172177
}
173178
}
174179

prov/src/main/java/org/bouncycastle/pqc/jcajce/provider/lms/BCLMSPrivateKey.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class BCLMSPrivateKey
2727
public BCLMSPrivateKey(
2828
LMSKeyParameters keyParams)
2929
{
30-
this.keyParams = keyParams;
30+
this.keyParams = (keyParams instanceof HSSPrivateKeyParameters) ? (HSSPrivateKeyParameters)keyParams : new HSSPrivateKeyParameters((LMSPrivateKeyParameters)keyParams, ((LMSPrivateKeyParameters)keyParams).getIndex(), ((LMSPrivateKeyParameters)keyParams).getIndex() + ((LMSPrivateKeyParameters)keyParams).getUsagesRemaining());
3131
}
3232

3333
public BCLMSPrivateKey(PrivateKeyInfo keyInfo)

prov/src/main/java/org/bouncycastle/pqc/jcajce/provider/lms/BCLMSPublicKey.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class BCLMSPublicKey
2626
public BCLMSPublicKey(
2727
LMSKeyParameters keyParams)
2828
{
29-
this.keyParams = keyParams;
29+
this.keyParams = (keyParams instanceof HSSPublicKeyParameters) ? keyParams : new HSSPublicKeyParameters(1, (LMSPublicKeyParameters)keyParams);
3030
}
3131

3232
public BCLMSPublicKey(SubjectPublicKeyInfo keyInfo)

prov/src/test/java/org/bouncycastle/pqc/jcajce/provider/test/LMSTest.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,11 @@
3131
public class LMSTest
3232
extends TestCase
3333
{
34-
private static final byte[] nestedPublicKey = Base64.decode("MFAwDQYLKoZIhvcNAQkQAxEDPwAEPAAAAAEAAAAFAAAAARmSUd5GHVvFNVl0JBcv+GJX8+FaUrz1mNrCHGZ1z8c4j9kgSBhaEYlu+//bc2yOhQ==");
35-
private static final byte[] nestedPrivateKey = Base64.decode("MIGhAgEBMA0GCyqGSIb3DQEJEAMRBE4ETAAAAAEAAAAAAAAABQAAAAEZklHeRh1bxTVZdCQXL/hiAAAAAAAAACAAAAAgXs4Bdu2gpyoEccTNWwAA81qLeSqn2yW+LWYVAi2hadyBPQAAAAABAAAABQAAAAEZklHeRh1bxTVZdCQXL/hiV/PhWlK89Zjawhxmdc/HOI/ZIEgYWhGJbvv/23NsjoU=");
34+
private static final byte[] nestedPublicKey = Base64.decode("MFAwDQYLKoZIhvcNAQkQAxEDPwAEPAAAAAEAAAAFAAAAAa3sRFhG3xQtT/xfuJJswgV80jvx/sFlYxteNrZ0hheITiUL/bJ8wJpphIpoSB/E9g==");
35+
private static final byte[] nestedPrivateKey = Base64.decode("MIG6AgEBMA0GCyqGSIb3DQEJEAMRBGcEZQAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAUAAAABrexEWEbfFC1P/F+4kmzCBQAAAAAAAAAgAAAAIO01yI+Hj7eX+P2clcPDW0SzllJ4uzQt1JenbcllHpQngT0AAAAAAQAAAAUAAAABrexEWEbfFC1P/F+4kmzCBXzSO/H+wWVjG142tnSGF4hOJQv9snzAmmmEimhIH8T2");
36+
37+
private static byte[] lmsPublicEnc = Base64.decode("MFAwDQYLKoZIhvcNAQkQAxEDPwAEPAAAAAEAAAAFAAAAAXjGRFXZMjGgOKA/sHWwYWNl6eTf5nI+RcEvlnIKQHQXpxNDreZCkeFm6x9CBN4YlA==");
38+
private static byte[] lmsPrivateEnc = Base64.decode("MIGhAgEBMA0GCyqGSIb3DQEJEAMRBE4ETAAAAAEAAAAAAAAABQAAAAF4xkRV2TIxoDigP7B1sGFjAAAAAAAAACAAAAAghIRA7xa5TChn4+0KIh1LvGLp14alEkmcz3m3v7kTiBeBPQAAAAABAAAABQAAAAF4xkRV2TIxoDigP7B1sGFjZenk3+ZyPkXBL5ZyCkB0F6cTQ63mQpHhZusfQgTeGJQ=");
3639

3740
public void setUp()
3841
{
@@ -42,6 +45,20 @@ public void setUp()
4245
}
4346
}
4447

48+
public void testLmsOldKeyEncoding()
49+
throws Exception
50+
{
51+
PKCS8EncodedKeySpec lmsPrivateKeySpec = new PKCS8EncodedKeySpec(lmsPrivateEnc);
52+
X509EncodedKeySpec lmsPublicKeySpec = new X509EncodedKeySpec(lmsPublicEnc);
53+
54+
KeyFactory kFact = KeyFactory.getInstance("LMS", "BC");
55+
56+
PrivateKey lmsPrivateKey = kFact.generatePrivate(lmsPrivateKeySpec);
57+
PublicKey lmsPublicKey = kFact.generatePublic(lmsPublicKeySpec);
58+
59+
trySigning(new KeyPair(lmsPublicKey, lmsPrivateKey));
60+
}
61+
4562
public void testKeyPairGenerators()
4663
throws Exception
4764
{
@@ -89,7 +106,6 @@ private void trySigning(KeyPair keyPair)
89106
public void testKeyEncoding()
90107
throws Exception
91108
{
92-
93109
KeyFactory kf = KeyFactory.getInstance("LMS", "BC");
94110

95111
PublicKey oldLmsPub = kf.generatePublic(new X509EncodedKeySpec(nestedPublicKey));
@@ -124,7 +140,7 @@ public void testKeyFactoryLMSKey()
124140

125141
PublicKey pub1 = kFact.generatePublic(x509KeySpec);
126142

127-
assertEquals(kp.getPublic(), pub1);
143+
assertTrue(Arrays.areEqual(kp.getPublic().getEncoded(), pub1.getEncoded()));
128144

129145
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(kp.getPrivate().getEncoded());
130146

0 commit comments

Comments
 (0)