|
8 | 8 | import java.util.HashMap; |
9 | 9 | import java.util.Map; |
10 | 10 |
|
| 11 | +import org.bouncycastle.asn1.ASN1Encodable; |
11 | 12 | import org.bouncycastle.asn1.ASN1EncodableVector; |
| 13 | +import org.bouncycastle.asn1.ASN1Integer; |
| 14 | +import org.bouncycastle.asn1.ASN1OctetString; |
12 | 15 | import org.bouncycastle.asn1.ASN1Sequence; |
| 16 | +import org.bouncycastle.asn1.DERNull; |
13 | 17 | import org.bouncycastle.asn1.DERSequence; |
| 18 | +import org.bouncycastle.asn1.bc.BCObjectIdentifiers; |
| 19 | +import org.bouncycastle.asn1.nist.NISTObjectIdentifiers; |
| 20 | +import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; |
14 | 21 | import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; |
| 22 | +import org.bouncycastle.asn1.sec.SECObjectIdentifiers; |
| 23 | +import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers; |
| 24 | +import org.bouncycastle.asn1.x509.AlgorithmIdentifier; |
15 | 25 | import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; |
| 26 | +import org.bouncycastle.asn1.x9.X9ObjectIdentifiers; |
| 27 | +import org.bouncycastle.internal.asn1.edec.EdECObjectIdentifiers; |
16 | 28 | import org.bouncycastle.internal.asn1.misc.MiscObjectIdentifiers; |
17 | 29 | import org.bouncycastle.jcajce.CompositePrivateKey; |
18 | 30 | import org.bouncycastle.jcajce.CompositePublicKey; |
| 31 | +import org.bouncycastle.jcajce.provider.asymmetric.compositesignatures.CompositeSignaturesConstants; |
19 | 32 | import org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi; |
20 | 33 | import org.bouncycastle.jcajce.provider.config.ConfigurableProvider; |
21 | 34 | import org.bouncycastle.jcajce.provider.util.AsymmetricAlgorithmProvider; |
@@ -89,35 +102,112 @@ public PrivateKey generatePrivate(PrivateKeyInfo keyInfo) |
89 | 102 | ASN1Sequence keySeq = ASN1Sequence.getInstance(keyInfo.parsePrivateKey()); |
90 | 103 | PrivateKey[] privKeys = new PrivateKey[keySeq.size()]; |
91 | 104 |
|
92 | | - for (int i = 0; i != keySeq.size(); i++) |
93 | | - { |
94 | | - ASN1Sequence kSeq = ASN1Sequence.getInstance(keySeq.getObjectAt(i)); |
| 105 | + ASN1Encodable firstKey = keySeq.getObjectAt(0); |
95 | 106 |
|
96 | | - if (kSeq.size() == 2) |
| 107 | + if (firstKey instanceof ASN1OctetString) |
| 108 | + { |
| 109 | + System.err.println(keyInfo.getPrivateKeyAlgorithm().getAlgorithm()); |
| 110 | + CompositeSignaturesConstants.CompositeName name = CompositeSignaturesConstants.ASN1IdentifierCompositeNameMap.get(keyInfo.getPrivateKeyAlgorithm().getAlgorithm()); |
| 111 | + switch (name) |
97 | 112 | { |
98 | | - ASN1EncodableVector v = new ASN1EncodableVector(2); |
99 | | - |
100 | | - v.add(keyInfo.getVersion()); |
101 | | - v.add(kSeq.getObjectAt(0)); |
102 | | - v.add(kSeq.getObjectAt(1)); |
103 | | - |
104 | | - PrivateKeyInfo privInfo = PrivateKeyInfo.getInstance(new DERSequence(v)); |
105 | | - |
106 | | - privKeys[i] = provider.getKeyInfoConverter( |
107 | | - privInfo.getPrivateKeyAlgorithm().getAlgorithm()).generatePrivate(privInfo); |
| 113 | + case MLDSA44_Ed25519_SHA512: |
| 114 | + privKeys[0] = createPrivateKey(new AlgorithmIdentifier(NISTObjectIdentifiers.id_ml_dsa_44), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 115 | + privKeys[1] = createPrivateKey(new AlgorithmIdentifier(EdECObjectIdentifiers.id_Ed25519), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 116 | + break; |
| 117 | + case MLDSA65_Ed25519_SHA512: |
| 118 | + privKeys[0] = createPrivateKey(new AlgorithmIdentifier(NISTObjectIdentifiers.id_ml_dsa_65), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 119 | + privKeys[1] = createPrivateKey(new AlgorithmIdentifier(EdECObjectIdentifiers.id_Ed25519), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 120 | + break; |
| 121 | + case MLDSA87_Ed448_SHA512: |
| 122 | + privKeys[0] = createPrivateKey(new AlgorithmIdentifier(NISTObjectIdentifiers.id_ml_dsa_87), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 123 | + privKeys[1] = createPrivateKey(new AlgorithmIdentifier(EdECObjectIdentifiers.id_Ed448), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 124 | + break; |
| 125 | + case MLDSA44_RSA2048_PSS_SHA256: |
| 126 | + privKeys[0] = createPrivateKey(new AlgorithmIdentifier(NISTObjectIdentifiers.id_ml_dsa_44), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 127 | + privKeys[1] = createPrivateKey(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 128 | + break; |
| 129 | + case MLDSA65_RSA3072_PSS_SHA512: |
| 130 | + privKeys[0] = createPrivateKey(new AlgorithmIdentifier(NISTObjectIdentifiers.id_ml_dsa_65), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 131 | + privKeys[1] = createPrivateKey(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 132 | + break; |
| 133 | + case MLDSA44_RSA2048_PKCS15_SHA256: |
| 134 | + privKeys[0] = createPrivateKey(new AlgorithmIdentifier(NISTObjectIdentifiers.id_ml_dsa_44), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 135 | + privKeys[1] = createPrivateKey(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 136 | + break; |
| 137 | + case MLDSA65_RSA3072_PKCS15_SHA512: |
| 138 | + privKeys[0] = createPrivateKey(new AlgorithmIdentifier(NISTObjectIdentifiers.id_ml_dsa_65), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 139 | + privKeys[1] = createPrivateKey(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 140 | + break; |
| 141 | + case MLDSA44_ECDSA_P256_SHA256: |
| 142 | + privKeys[0] = createPrivateKey(new AlgorithmIdentifier(NISTObjectIdentifiers.id_ml_dsa_44), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 143 | + privKeys[1] = createPrivateKey(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, SECObjectIdentifiers.secp256r1), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 144 | + break; |
| 145 | + case MLDSA44_ECDSA_brainpoolP256r1_SHA256: |
| 146 | + privKeys[0] = createPrivateKey(new AlgorithmIdentifier(NISTObjectIdentifiers.id_ml_dsa_44), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 147 | + break; |
| 148 | + case MLDSA65_ECDSA_P256_SHA512: |
| 149 | + privKeys[0] = createPrivateKey(new AlgorithmIdentifier(NISTObjectIdentifiers.id_ml_dsa_65), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 150 | + privKeys[1] = createPrivateKey(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, SECObjectIdentifiers.secp256r1), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 151 | + break; |
| 152 | + case MLDSA65_ECDSA_brainpoolP256r1_SHA512: |
| 153 | + privKeys[0] = createPrivateKey(new AlgorithmIdentifier(NISTObjectIdentifiers.id_ml_dsa_65), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 154 | + privKeys[1] = createPrivateKey(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, TeleTrusTObjectIdentifiers.brainpoolP256r1), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 155 | + break; |
| 156 | + case MLDSA87_ECDSA_P384_SHA512: |
| 157 | + privKeys[0] = createPrivateKey(new AlgorithmIdentifier(NISTObjectIdentifiers.id_ml_dsa_87), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 158 | + privKeys[1] = createPrivateKey(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, SECObjectIdentifiers.secp384r1), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 159 | + break; |
| 160 | + case MLDSA87_ECDSA_brainpoolP384r1_SHA512: |
| 161 | + privKeys[0] = createPrivateKey(new AlgorithmIdentifier(NISTObjectIdentifiers.id_ml_dsa_87), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 162 | + privKeys[1] = createPrivateKey(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, TeleTrusTObjectIdentifiers.brainpoolP384r1), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 163 | + break; |
| 164 | + case Falcon512_ECDSA_P256_SHA256: |
| 165 | + privKeys[0] = createPrivateKey(new AlgorithmIdentifier(BCObjectIdentifiers.falcon_512), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 166 | + privKeys[1] = createPrivateKey(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, SECObjectIdentifiers.secp256r1), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 167 | + break; |
| 168 | + case Falcon512_ECDSA_brainpoolP256r1_SHA256: |
| 169 | + privKeys[0] = createPrivateKey(new AlgorithmIdentifier(BCObjectIdentifiers.falcon_512), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 170 | + privKeys[1] = createPrivateKey(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, TeleTrusTObjectIdentifiers.brainpoolP256r1), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 171 | + break; |
| 172 | + case Falcon512_Ed25519_SHA512: |
| 173 | + privKeys[0] = createPrivateKey(new AlgorithmIdentifier(BCObjectIdentifiers.falcon_512), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 174 | + privKeys[1] = createPrivateKey(new AlgorithmIdentifier(EdECObjectIdentifiers.id_Ed25519), ASN1OctetString.getInstance(keySeq.getObjectAt(0))); |
| 175 | + break; |
| 176 | + default: |
| 177 | + throw new IllegalArgumentException("unknown composite algorithm"); |
108 | 178 | } |
109 | | - else |
| 179 | + } |
| 180 | + else |
| 181 | + { |
| 182 | + for (int i = 0; i != keySeq.size(); i++) |
110 | 183 | { |
| 184 | + ASN1Sequence kSeq = ASN1Sequence.getInstance(keySeq.getObjectAt(i)); |
| 185 | + |
111 | 186 | PrivateKeyInfo privInfo = PrivateKeyInfo.getInstance(kSeq); |
112 | 187 |
|
113 | 188 | privKeys[i] = provider.getKeyInfoConverter( |
114 | | - privInfo.getPrivateKeyAlgorithm().getAlgorithm()).generatePrivate(privInfo); |
| 189 | + privInfo.getPrivateKeyAlgorithm().getAlgorithm()).generatePrivate(privInfo); |
115 | 190 | } |
116 | 191 | } |
117 | 192 |
|
118 | 193 | return new CompositePrivateKey(privKeys); |
119 | 194 | } |
120 | 195 |
|
| 196 | + private PrivateKey createPrivateKey(AlgorithmIdentifier algId, ASN1OctetString enc) |
| 197 | + throws IOException |
| 198 | + { |
| 199 | + ASN1EncodableVector v = new ASN1EncodableVector(); |
| 200 | + |
| 201 | + v.add(new ASN1Integer(0)); |
| 202 | + v.add(algId); |
| 203 | + v.add(enc); |
| 204 | + |
| 205 | + PrivateKeyInfo privInfo = PrivateKeyInfo.getInstance(new DERSequence(v)); |
| 206 | + |
| 207 | + return provider.getKeyInfoConverter( |
| 208 | + privInfo.getPrivateKeyAlgorithm().getAlgorithm()).generatePrivate(privInfo); |
| 209 | + } |
| 210 | + |
121 | 211 | public PublicKey generatePublic(SubjectPublicKeyInfo keyInfo) |
122 | 212 | throws IOException |
123 | 213 | { |
|
0 commit comments