Skip to content

Commit 7acd73b

Browse files
committed
refactored LMS to use HSS key encodings.
1 parent a051043 commit 7acd73b

File tree

5 files changed

+26
-24
lines changed

5 files changed

+26
-24
lines changed

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

Lines changed: 17 additions & 0 deletions
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);

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
{

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: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
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");
3636

3737
public void setUp()
3838
{
@@ -89,7 +89,6 @@ private void trySigning(KeyPair keyPair)
8989
public void testKeyEncoding()
9090
throws Exception
9191
{
92-
9392
KeyFactory kf = KeyFactory.getInstance("LMS", "BC");
9493

9594
PublicKey oldLmsPub = kf.generatePublic(new X509EncodedKeySpec(nestedPublicKey));
@@ -124,7 +123,7 @@ public void testKeyFactoryLMSKey()
124123

125124
PublicKey pub1 = kFact.generatePublic(x509KeySpec);
126125

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

129128
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(kp.getPrivate().getEncoded());
130129

0 commit comments

Comments
 (0)