Skip to content

Commit 77f6705

Browse files
committed
added algorithm name to OID lookup
1 parent 7c4d661 commit 77f6705

File tree

5 files changed

+82
-9
lines changed

5 files changed

+82
-9
lines changed

prov/src/main/java/org/bouncycastle/jcajce/CompositePrivateKey.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ public static Builder builder(ASN1ObjectIdentifier compAlgOid)
8686
return new Builder(new AlgorithmIdentifier(compAlgOid));
8787
}
8888

89+
public static Builder builder(String algorithmName)
90+
{
91+
return builder(CompositeUtil.getOid(algorithmName));
92+
}
93+
8994
private final List<PrivateKey> keys;
9095
private final List<Provider> providers;
9196

prov/src/main/java/org/bouncycastle/jcajce/CompositePublicKey.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ public static Builder builder(ASN1ObjectIdentifier compAlgOid)
8181
return new Builder(new AlgorithmIdentifier(compAlgOid));
8282
}
8383

84+
public static Builder builder(String algorithmName)
85+
{
86+
return builder(CompositeUtil.getOid(algorithmName));
87+
}
88+
8489
private final List<PublicKey> keys;
8590
private final List<Provider> providers;
8691

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.bouncycastle.jcajce;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
7+
import org.bouncycastle.internal.asn1.iana.IANAObjectIdentifiers;
8+
import org.bouncycastle.util.Strings;
9+
10+
class CompositeUtil
11+
{
12+
private static final Map<String, ASN1ObjectIdentifier> algorithmOids = new HashMap<String, ASN1ObjectIdentifier>();
13+
14+
static
15+
{
16+
algorithmOids.put("MLDSA44-RSA2048-PSS-SHA256", IANAObjectIdentifiers.id_MLDSA44_RSA2048_PSS_SHA256);
17+
algorithmOids.put("MLDSA44-RSA2048-PKCS15-SHA256", IANAObjectIdentifiers.id_MLDSA44_RSA2048_PKCS15_SHA256);
18+
algorithmOids.put("MLDSA44-Ed25519-SHA512", IANAObjectIdentifiers.id_MLDSA44_Ed25519_SHA512);
19+
algorithmOids.put("MLDSA44-ECDSA-P256-SHA256", IANAObjectIdentifiers.id_MLDSA44_ECDSA_P256_SHA256);
20+
algorithmOids.put("MLDSA65-RSA3072-PSS-SHA512", IANAObjectIdentifiers.id_MLDSA65_RSA3072_PSS_SHA512);
21+
algorithmOids.put("MLDSA65-RSA3072-PKCS15-SHA512", IANAObjectIdentifiers.id_MLDSA65_RSA3072_PKCS15_SHA512);
22+
algorithmOids.put("MLDSA65-RSA4096-PSS-SHA512", IANAObjectIdentifiers.id_MLDSA65_RSA4096_PSS_SHA512);
23+
algorithmOids.put("MLDSA65-RSA4096-PKCS15-SHA512", IANAObjectIdentifiers.id_MLDSA65_RSA4096_PKCS15_SHA512);
24+
algorithmOids.put("MLDSA65-ECDSA-P256-SHA512", IANAObjectIdentifiers.id_MLDSA65_ECDSA_P256_SHA512);
25+
algorithmOids.put("MLDSA65-ECDSA-P384-SHA512", IANAObjectIdentifiers.id_MLDSA65_ECDSA_P384_SHA512);
26+
algorithmOids.put("MLDSA65-ECDSA-brainpoolP256r1-SHA512", IANAObjectIdentifiers.id_MLDSA65_ECDSA_brainpoolP256r1_SHA512);
27+
algorithmOids.put("MLDSA65-Ed25519-SHA512", IANAObjectIdentifiers.id_MLDSA65_Ed25519_SHA512);
28+
algorithmOids.put("MLDSA87-ECDSA-P384-SHA512", IANAObjectIdentifiers.id_MLDSA87_ECDSA_P384_SHA512);
29+
algorithmOids.put("MLDSA87-ECDSA-brainpoolP384r1-SHA512", IANAObjectIdentifiers.id_MLDSA87_ECDSA_brainpoolP384r1_SHA512);
30+
algorithmOids.put("MLDSA87-Ed448-SHAKE256", IANAObjectIdentifiers.id_MLDSA87_Ed448_SHAKE256);
31+
algorithmOids.put("MLDSA87-RSA4096-PSS-SHA512", IANAObjectIdentifiers.id_MLDSA87_RSA4096_PSS_SHA512);
32+
algorithmOids.put("MLDSA87-ECDSA-P521-SHA512", IANAObjectIdentifiers.id_MLDSA87_ECDSA_P521_SHA512);
33+
algorithmOids.put("MLDSA87-RSA3072-PSS-SHA512", IANAObjectIdentifiers.id_MLDSA87_RSA3072_PSS_SHA512);
34+
}
35+
36+
static ASN1ObjectIdentifier getOid(String name)
37+
{
38+
ASN1ObjectIdentifier oid = algorithmOids.get(Strings.toUpperCase(name));
39+
if (oid == null)
40+
{
41+
throw new IllegalArgumentException("name " + name + " not recognized");
42+
}
43+
44+
return oid;
45+
}
46+
}

prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/compositesignatures/SignatureSpi.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ private void sigInitVerify()
183183
this.componentSignatures[i].initVerify(compositePublicKey.getPublicKeys().get(i));
184184
}
185185
this.unprimed = true;
186+
System.err.println("verified init");
186187
}
187188

188189
protected void engineInitSign(PrivateKey privateKey)
@@ -467,8 +468,13 @@ else if (componentSignatures[0] instanceof org.bouncycastle.jcajce.provider.asym
467468
//signatures[0] is 32-byte random number
468469
if (!this.componentSignatures[i].verify(signatures[i]))
469470
{
471+
System.err.println(i + " fails");
470472
fail = true;
471473
}
474+
else
475+
{
476+
System.err.println(i + " works");
477+
}
472478
}
473479

474480
return !fail;

prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/mldsa/SignatureSpi.java

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
import java.security.SecureRandom;
1010
import java.security.SignatureException;
1111

12+
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
1213
import org.bouncycastle.crypto.CipherParameters;
1314
import org.bouncycastle.crypto.DataLengthException;
1415
import org.bouncycastle.jcajce.MLDSAProxyPrivateKey;
1516
import org.bouncycastle.jcajce.interfaces.MLDSAPublicKey;
1617
import org.bouncycastle.jcajce.provider.asymmetric.util.BaseDeterministicOrRandomSignature;
1718
import org.bouncycastle.jcajce.spec.MLDSAParameterSpec;
1819
import org.bouncycastle.pqc.crypto.mldsa.MLDSAParameters;
20+
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPublicKeyParameters;
1921
import org.bouncycastle.pqc.crypto.mldsa.MLDSASigner;
2022
import org.bouncycastle.pqc.crypto.util.PublicKeyFactory;
2123

@@ -49,19 +51,28 @@ protected void verifyInit(PublicKey publicKey)
4951
BCMLDSAPublicKey key = (BCMLDSAPublicKey)publicKey;
5052

5153
this.keyParams = key.getKeyParams();
52-
53-
if (parameters != null)
54+
}
55+
else
56+
{
57+
try
5458
{
55-
String canonicalAlg = MLDSAParameterSpec.fromName(parameters.getName()).getName();
56-
if (!canonicalAlg.equals(key.getAlgorithm()))
57-
{
58-
throw new InvalidKeyException("signature configured for " + canonicalAlg);
59-
}
59+
SubjectPublicKeyInfo pubKeyInfo = SubjectPublicKeyInfo.getInstance(publicKey.getEncoded());
60+
this.keyParams = org.bouncycastle.pqc.crypto.util.PublicKeyFactory.createKey(pubKeyInfo);
61+
publicKey = new BCMLDSAPublicKey((MLDSAPublicKeyParameters)this.keyParams);
62+
}
63+
catch (Exception e)
64+
{
65+
throw new InvalidKeyException("unknown public key passed to ML-DSA");
6066
}
6167
}
62-
else
68+
69+
if (parameters != null)
6370
{
64-
throw new InvalidKeyException("unknown public key passed to ML-DSA");
71+
String canonicalAlg = MLDSAParameterSpec.fromName(parameters.getName()).getName();
72+
if (!canonicalAlg.equals(publicKey.getAlgorithm()))
73+
{
74+
throw new InvalidKeyException("signature configured for " + canonicalAlg);
75+
}
6576
}
6677
}
6778

0 commit comments

Comments
 (0)