Skip to content

Commit bce7c71

Browse files
committed
added support for conversion from EdDSA keys to EdECKeySpec.
1 parent b0f8158 commit bce7c71

File tree

2 files changed

+42
-5
lines changed

2 files changed

+42
-5
lines changed

prov/src/main/jdk1.15/org/bouncycastle/jcajce/provider/asymmetric/edec/KeyFactorySpi.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@
55
import java.security.Key;
66
import java.security.PrivateKey;
77
import java.security.PublicKey;
8+
import java.security.interfaces.EdECPrivateKey;
9+
import java.security.interfaces.EdECPublicKey;
810
import java.security.spec.EdECPrivateKeySpec;
911
import java.security.spec.EdECPublicKeySpec;
1012
import java.security.spec.InvalidKeySpecException;
1113
import java.security.spec.KeySpec;
1214
import java.security.spec.NamedParameterSpec;
1315
import java.security.spec.X509EncodedKeySpec;
16+
import java.util.Optional;
1417

1518
import org.bouncycastle.asn1.ASN1Encoding;
1619
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
@@ -131,6 +134,28 @@ else if (spec.isAssignableFrom(RawEncodedKeySpec.class))
131134
return new RawEncodedKeySpec(((EdDSAPublicKey)key).getPointEncoding());
132135
}
133136
}
137+
else if (spec.isAssignableFrom(EdECPrivateKeySpec.class))
138+
{
139+
if (key instanceof EdECPrivateKey)
140+
{
141+
Optional<byte[]> bytes = ((EdECPrivateKey)key).getBytes();
142+
if (bytes.isPresent())
143+
{
144+
return new EdECPrivateKeySpec(((EdECPrivateKey)key).getParams(), bytes.get());
145+
}
146+
else
147+
{
148+
throw new IllegalArgumentException("no byte[] data associated with key");
149+
}
150+
}
151+
}
152+
else if (spec.isAssignableFrom(EdECPublicKeySpec.class))
153+
{
154+
if (key instanceof EdECPublicKey)
155+
{
156+
return new EdECPublicKeySpec(((EdECPublicKey)key).getParams(), ((EdECPublicKey)key).getPoint());
157+
}
158+
}
134159

135160
return super.engineGetKeySpec(key, spec);
136161
}

prov/src/test/jdk1.15/org/bouncycastle/jcajce/provider/test/EdDSA15Test.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,18 @@
1515
import java.security.spec.AlgorithmParameterSpec;
1616
import java.security.spec.EdECPrivateKeySpec;
1717
import java.security.spec.EdECPublicKeySpec;
18-
import java.security.spec.KeySpec;
1918
import java.security.spec.NamedParameterSpec;
2019
import java.util.Base64;
2120

21+
import junit.framework.Assert;
2222
import junit.framework.Test;
2323
import junit.framework.TestCase;
2424
import junit.framework.TestSuite;
2525
import org.bouncycastle.jcajce.interfaces.EdDSAPrivateKey;
2626
import org.bouncycastle.jcajce.spec.EdDSAParameterSpec;
2727
import org.bouncycastle.jcajce.spec.RawEncodedKeySpec;
2828
import org.bouncycastle.jce.provider.BouncyCastleProvider;
29+
import org.bouncycastle.util.Arrays;
2930
import org.bouncycastle.util.Strings;
3031

3132
public class EdDSA15Test
@@ -158,10 +159,10 @@ private void implTestInterop(String algorithm)
158159
KeyFactory bcKeyFact = KeyFactory.getInstance(algorithm, bc);
159160
KeyPair kpSunEC = kpGenSunEC.generateKeyPair();
160161

161-
KeySpec pubSpec = sunKeyFact.getKeySpec(kpSunEC.getPublic(), EdECPublicKeySpec.class);
162+
EdECPublicKeySpec pubSpec = sunKeyFact.getKeySpec(kpSunEC.getPublic(), EdECPublicKeySpec.class);
162163
PublicKey pubKey = bcKeyFact.generatePublic(pubSpec);
163164

164-
KeySpec privSpec = sunKeyFact.getKeySpec(kpSunEC.getPrivate(), EdECPrivateKeySpec.class);
165+
EdECPrivateKeySpec privSpec = sunKeyFact.getKeySpec(kpSunEC.getPrivate(), EdECPrivateKeySpec.class);
165166
PrivateKey privKey = bcKeyFact.generatePrivate(privSpec);
166167

167168
sigBC.initSign(kpSunEC.getPrivate());
@@ -174,7 +175,7 @@ private void implTestInterop(String algorithm)
174175

175176
sigBC.update(Strings.toByteArray("Hello, world!"));
176177

177-
sigBC.verify(sig);
178+
Assert.assertTrue(sigBC.verify(sig));
178179

179180
sigBC.initSign(privKey);
180181

@@ -186,7 +187,18 @@ private void implTestInterop(String algorithm)
186187

187188
sigBC.update(Strings.toByteArray("Hello, world!"));
188189

189-
sigBC.verify(sig);
190+
Assert.assertTrue(sigBC.verify(sig));
191+
192+
EdECPrivateKeySpec bcPrivSpec = bcKeyFact.getKeySpec(privKey, EdECPrivateKeySpec.class);
193+
194+
Assert.assertEquals(privSpec.getParams().getName(), bcPrivSpec.getParams().getName());
195+
Assert.assertTrue(Arrays.areEqual(privSpec.getBytes(), bcPrivSpec.getBytes()));
196+
197+
EdECPublicKeySpec bcPubSpec = bcKeyFact.getKeySpec(pubKey, EdECPublicKeySpec.class);
198+
199+
Assert.assertEquals(pubSpec.getParams().getName(), bcPubSpec.getParams().getName());
200+
Assert.assertEquals(pubSpec.getPoint().isXOdd(), bcPubSpec.getPoint().isXOdd());
201+
Assert.assertEquals(pubSpec.getPoint().getY(), bcPubSpec.getPoint().getY());
190202
}
191203

192204
private void implTestInteropCase(KeyPair kp, Signature signer, Signature verifier)

0 commit comments

Comments
 (0)