Skip to content

Commit 13d5a19

Browse files
author
gefeili
committed
Add Mayo to PQC Provider
1 parent bec5d19 commit 13d5a19

28 files changed

+1395
-130
lines changed

core/src/main/java/org/bouncycastle/asn1/bc/BCObjectIdentifiers.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ public interface BCObjectIdentifiers
248248
ASN1ObjectIdentifier falcon = bc_sig.branch("7");
249249

250250
ASN1ObjectIdentifier falcon_512 = new ASN1ObjectIdentifier("1.3.9999.3.6"); // falcon.branch("1");
251-
ASN1ObjectIdentifier falcon_1024 = new ASN1ObjectIdentifier("1.3.9999.3.9"); // falcon.branch("2");
251+
ASN1ObjectIdentifier falcon_1024 = new ASN1ObjectIdentifier("1.3.9999.3.9"); // falcon.branch("2");
252252

253253
/*
254254
* Dilithium
@@ -403,15 +403,15 @@ public interface BCObjectIdentifiers
403403
ASN1ObjectIdentifier ntrulpr953 = pqc_kem_ntrulprime.branch("4");
404404
ASN1ObjectIdentifier ntrulpr1013 = pqc_kem_ntrulprime.branch("5");
405405
ASN1ObjectIdentifier ntrulpr1277 = pqc_kem_ntrulprime.branch("6");
406-
406+
407407
ASN1ObjectIdentifier pqc_kem_sntruprime = pqc_kem_ntruprime.branch("2");
408408
ASN1ObjectIdentifier sntrup653 = pqc_kem_sntruprime.branch("1");
409409
ASN1ObjectIdentifier sntrup761 = pqc_kem_sntruprime.branch("2");
410410
ASN1ObjectIdentifier sntrup857 = pqc_kem_sntruprime.branch("3");
411411
ASN1ObjectIdentifier sntrup953 = pqc_kem_sntruprime.branch("4");
412412
ASN1ObjectIdentifier sntrup1013 = pqc_kem_sntruprime.branch("5");
413413
ASN1ObjectIdentifier sntrup1277 = pqc_kem_sntruprime.branch("6");
414-
414+
415415
/**
416416
* BIKE
417417
**/
@@ -432,7 +432,6 @@ public interface BCObjectIdentifiers
432432

433433
/**
434434
* ML-KEM/ML-DSA seed parameters algorithms - temporary
435-
*
436435
*/
437436
//TODO: delete before release
438437
ASN1ObjectIdentifier id_id_alg_seed = bc.branch("10");
@@ -443,4 +442,13 @@ public interface BCObjectIdentifiers
443442
ASN1ObjectIdentifier id_id_alg_ml_kem_512_seed = id_id_alg_seed.branch("4");
444443
ASN1ObjectIdentifier id_id_alg_ml_kem_768_seed = id_id_alg_seed.branch("5");
445444
ASN1ObjectIdentifier id_id_alg_ml_kem_1024_seed = id_id_alg_seed.branch("6");
445+
446+
/**
447+
* Mayo
448+
*/
449+
ASN1ObjectIdentifier mayo = bc_sig.branch("10");
450+
ASN1ObjectIdentifier mayo1 = mayo.branch("1");
451+
ASN1ObjectIdentifier mayo2 = mayo.branch("2");
452+
ASN1ObjectIdentifier mayo3 = mayo.branch("3");
453+
ASN1ObjectIdentifier mayo5 = mayo.branch("4");
446454
}

core/src/main/java/org/bouncycastle/pqc/crypto/mayo/MayoKeyPairGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,6 @@ public AsymmetricCipherKeyPair generateKeyPair()
110110
Arrays.clear(O);
111111
Arrays.clear(P3);
112112

113-
return new AsymmetricCipherKeyPair(new MayoPublicKeyParameter(p, cpk), new MayoPrivateKeyParameter(p, seed_sk));
113+
return new AsymmetricCipherKeyPair(new MayoPublicKeyParameters(p, cpk), new MayoPrivateKeyParameters(p, seed_sk));
114114
}
115115
}

core/src/main/java/org/bouncycastle/pqc/crypto/mayo/MayoParameters.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
public class MayoParameters
44
{
5-
public static final MayoParameters MAYO1 = new MayoParameters(
5+
public static final MayoParameters mayo1 = new MayoParameters(
66
"MAYO_1", // name
77
86, // n
88
78, // m
@@ -30,7 +30,7 @@ public class MayoParameters
3030
24 // sk_seed_bytes
3131
);
3232

33-
public static final MayoParameters MAYO2 = new MayoParameters(
33+
public static final MayoParameters mayo2 = new MayoParameters(
3434
"MAYO_2", // name
3535
81, // n
3636
64, // m
@@ -58,7 +58,7 @@ public class MayoParameters
5858
24 // sk_seed_bytes
5959
);
6060

61-
public static final MayoParameters MAYO3 = new MayoParameters(
61+
public static final MayoParameters mayo3 = new MayoParameters(
6262
"MAYO_3", // name
6363
118, // n
6464
108, // m
@@ -86,7 +86,7 @@ public class MayoParameters
8686
32 // sk_seed_bytes
8787
);
8888

89-
public static final MayoParameters MAYO5 = new MayoParameters(
89+
public static final MayoParameters mayo5 = new MayoParameters(
9090
"MAYO_5", // name
9191
154, // n
9292
142, // m

core/src/main/java/org/bouncycastle/pqc/crypto/mayo/MayoPrivateKeyParameter.java

Lines changed: 0 additions & 41 deletions
This file was deleted.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.bouncycastle.pqc.crypto.mayo;
2+
3+
import org.bouncycastle.util.Arrays;
4+
5+
public class MayoPrivateKeyParameters
6+
extends MayoKeyParameters
7+
{
8+
private final byte[] seed_sk;
9+
10+
public MayoPrivateKeyParameters(MayoParameters params, byte[] seed_sk)
11+
{
12+
super(true, params);
13+
this.seed_sk = seed_sk;
14+
}
15+
16+
public byte[] getEncoded()
17+
{
18+
return Arrays.clone(seed_sk);
19+
}
20+
21+
public byte[] getSeedSk()
22+
{
23+
return Arrays.clone(seed_sk);
24+
}
25+
}

core/src/main/java/org/bouncycastle/pqc/crypto/mayo/MayoPublicKeyParameter.java renamed to core/src/main/java/org/bouncycastle/pqc/crypto/mayo/MayoPublicKeyParameters.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22

33
import org.bouncycastle.util.Arrays;
44

5-
public class MayoPublicKeyParameter
5+
public class MayoPublicKeyParameters
66
extends MayoKeyParameters
77
{
8-
// Represents the field: uint64_t p[P1_LIMBS_MAX + P2_LIMBS_MAX + P3_LIMBS_MAX];
98
private final byte[] p;
109

11-
public MayoPublicKeyParameter(MayoParameters params, byte[] p)
10+
public MayoPublicKeyParameters(MayoParameters params, byte[] p)
1211
{
1312
super(false, params);
1413
this.p = p;

core/src/main/java/org/bouncycastle/pqc/crypto/mayo/MayoSigner.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ public class MayoSigner
1616
{
1717
private SecureRandom random;
1818
MayoParameters params;
19-
private MayoPublicKeyParameter pubKey;
20-
private MayoPrivateKeyParameter privKey;
19+
private MayoPublicKeyParameters pubKey;
20+
private MayoPrivateKeyParameters privKey;
2121

2222
@Override
2323
public void init(boolean forSigning, CipherParameters param)
@@ -30,19 +30,19 @@ public void init(boolean forSigning, CipherParameters param)
3030
if (param instanceof ParametersWithRandom)
3131
{
3232
ParametersWithRandom withRandom = (ParametersWithRandom)param;
33-
privKey = (MayoPrivateKeyParameter)withRandom.getParameters();
33+
privKey = (MayoPrivateKeyParameters)withRandom.getParameters();
3434
random = withRandom.getRandom();
3535
}
3636
else
3737
{
38-
privKey = (MayoPrivateKeyParameter)param;
38+
privKey = (MayoPrivateKeyParameters)param;
3939
random = null;
4040
}
4141
params = privKey.getParameters();
4242
}
4343
else
4444
{
45-
pubKey = (MayoPublicKeyParameter)param;
45+
pubKey = (MayoPublicKeyParameters)param;
4646
params = pubKey.getParameters();
4747
privKey = null;
4848
random = null;

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
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.mayo.MayoParameters;
47+
import org.bouncycastle.pqc.crypto.mayo.MayoPrivateKeyParameters;
4648
import org.bouncycastle.pqc.crypto.mldsa.MLDSAParameters;
4749
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPrivateKeyParameters;
4850
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPublicKeyParameters;
@@ -183,7 +185,7 @@ else if (algOID.on(BCObjectIdentifiers.sphincsPlus) || algOID.on(BCObjectIdentif
183185
return new SPHINCSPlusPrivateKeyParameters(spParams, ASN1OctetString.getInstance(obj).getOctets());
184186
}
185187
}
186-
else if (Utils.shldsaParams.containsKey(algOID))
188+
else if (Utils.slhdsaParams.containsKey(algOID))
187189
{
188190
SLHDSAParameters spParams = Utils.slhdsaParamsLookup(algOID);
189191
ASN1OctetString slhdsaKey = parseOctetString(keyInfo.getPrivateKey(), spParams.getN() * 4);
@@ -479,6 +481,12 @@ else if (algOID.equals(PQCObjectIdentifiers.mcElieceCca2))
479481

480482
return new McElieceCCA2PrivateKeyParameters(mKey.getN(), mKey.getK(), mKey.getField(), mKey.getGoppaPoly(), mKey.getP(), Utils.getDigestName(mKey.getDigest().getAlgorithm()));
481483
}
484+
else if (algOID.on(BCObjectIdentifiers.mayo))
485+
{
486+
byte[] keyEnc = ASN1OctetString.getInstance(keyInfo.parsePrivateKey()).getOctets();
487+
MayoParameters mayoParams = Utils.mayoParamsLookup(algOID);
488+
return new MayoPrivateKeyParameters(mayoParams, keyEnc);
489+
}
482490
else
483491
{
484492
throw new RuntimeException("algorithm identifier in private key not recognised");

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.bouncycastle.pqc.crypto.lms.Composer;
3434
import org.bouncycastle.pqc.crypto.lms.HSSPrivateKeyParameters;
3535
import org.bouncycastle.pqc.crypto.lms.LMSPrivateKeyParameters;
36+
import org.bouncycastle.pqc.crypto.mayo.MayoPrivateKeyParameters;
3637
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPrivateKeyParameters;
3738
import org.bouncycastle.pqc.crypto.mlkem.MLKEMPrivateKeyParameters;
3839
import org.bouncycastle.pqc.crypto.newhope.NHPrivateKeyParameters;
@@ -336,6 +337,13 @@ else if (privateKey instanceof RainbowPrivateKeyParameters)
336337
byte[] encoding = params.getEncoded();
337338
return new PrivateKeyInfo(algorithmIdentifier, new DEROctetString(encoding), attributes);
338339
}
340+
else if (privateKey instanceof MayoPrivateKeyParameters)
341+
{
342+
MayoPrivateKeyParameters params = (MayoPrivateKeyParameters)privateKey;
343+
AlgorithmIdentifier algorithmIdentifier = new AlgorithmIdentifier(Utils.mayoOidLookup(params.getParameters()));
344+
byte[] encoding = params.getEncoded();
345+
return new PrivateKeyInfo(algorithmIdentifier, new DEROctetString(encoding), attributes);
346+
}
339347
else
340348
{
341349
throw new IOException("key parameters not recognized");

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
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.mayo.MayoParameters;
44+
import org.bouncycastle.pqc.crypto.mayo.MayoPublicKeyParameters;
4345
import org.bouncycastle.pqc.crypto.mldsa.MLDSAParameters;
4446
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPublicKeyParameters;
4547
import org.bouncycastle.pqc.crypto.mlkem.MLKEMParameters;
@@ -253,6 +255,11 @@ public class PublicKeyFactory
253255
converters.put(NISTObjectIdentifiers.id_hash_slh_dsa_shake_192f_with_shake256, new SLHDSAConverter());
254256
converters.put(NISTObjectIdentifiers.id_hash_slh_dsa_shake_256s_with_shake256, new SLHDSAConverter());
255257
converters.put(NISTObjectIdentifiers.id_hash_slh_dsa_shake_256f_with_shake256, new SLHDSAConverter());
258+
259+
converters.put(BCObjectIdentifiers.mayo1, new MayoConverter());
260+
converters.put(BCObjectIdentifiers.mayo2, new MayoConverter());
261+
converters.put(BCObjectIdentifiers.mayo3, new MayoConverter());
262+
converters.put(BCObjectIdentifiers.mayo5, new MayoConverter());
256263
}
257264

258265
/**
@@ -847,4 +854,18 @@ AsymmetricKeyParameter getPublicKeyParameters(SubjectPublicKeyInfo keyInfo, Obje
847854
return new RainbowPublicKeyParameters(rainbowParams, keyEnc);
848855
}
849856
}
857+
858+
private static class MayoConverter
859+
extends SubjectPublicKeyInfoConverter
860+
{
861+
AsymmetricKeyParameter getPublicKeyParameters(SubjectPublicKeyInfo keyInfo, Object defaultParams)
862+
throws IOException
863+
{
864+
byte[] keyEnc = ASN1OctetString.getInstance(keyInfo.parsePublicKey()).getOctets();
865+
866+
MayoParameters mayoParams = Utils.mayoParamsLookup(keyInfo.getAlgorithm().getAlgorithm());
867+
868+
return new MayoPublicKeyParameters(mayoParams, keyEnc);
869+
}
870+
}
850871
}

0 commit comments

Comments
 (0)