diff --git a/.classpath b/.classpath
index 712aa799..86669f7b 100644
--- a/.classpath
+++ b/.classpath
@@ -10,6 +10,7 @@
+
@@ -22,5 +23,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/net/i2p/crypto/eddsa/AlgorithmParameters.java b/src/net/i2p/crypto/eddsa/AlgorithmParameters.java
new file mode 100644
index 00000000..d9b6db9f
--- /dev/null
+++ b/src/net/i2p/crypto/eddsa/AlgorithmParameters.java
@@ -0,0 +1,64 @@
+package net.i2p.crypto.eddsa;
+
+import net.i2p.crypto.eddsa.spec.EdDSAGenParameterSpec;
+import net.i2p.crypto.eddsa.spec.EdDSANamedCurveSpec;
+import net.i2p.crypto.eddsa.spec.EdDSANamedCurveTable;
+import net.i2p.crypto.eddsa.spec.EdDSAParameterSpec;
+
+import java.io.IOException;
+import java.security.AlgorithmParametersSpi;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.InvalidParameterSpecException;
+
+public class AlgorithmParameters extends AlgorithmParametersSpi{
+
+ private EdDSANamedCurveSpec edDSANamedCurveSpec = null;
+
+ @Override
+ protected void engineInit(AlgorithmParameterSpec paramSpec) throws InvalidParameterSpecException {
+
+ if(paramSpec instanceof EdDSAGenParameterSpec){
+ edDSANamedCurveSpec = EdDSANamedCurveTable.getByName(((EdDSAGenParameterSpec) paramSpec).getName());
+ }
+ else if(paramSpec instanceof EdDSANamedCurveSpec){
+ this.edDSANamedCurveSpec= (EdDSANamedCurveSpec) paramSpec;
+ }
+ else throw new InvalidParameterSpecException("Invalid or not yet implemented "+ paramSpec.toString());
+ }
+
+ @Override
+ protected void engineInit(byte[] params) throws IOException {
+ throw new IOException("Not implemented yet...");
+ }
+
+ @Override
+ protected void engineInit(byte[] params, String format) throws IOException {
+ throw new IOException("Not implemented yet...");
+ }
+
+ @Override
+ protected T engineGetParameterSpec(Class paramSpec) throws InvalidParameterSpecException {
+ if(EdDSAParameterSpec.class.isAssignableFrom(paramSpec)){
+ return (T) this.edDSANamedCurveSpec;
+ }
+ else if(EdDSAGenParameterSpec.class.isAssignableFrom(paramSpec)){
+ return (T) new EdDSAGenParameterSpec(edDSANamedCurveSpec.getName());
+ }
+ else throw new InvalidParameterSpecException("Invalid or not yet implemented "+ paramSpec.toString());
+ }
+
+ @Override
+ protected byte[] engineGetEncoded() throws IOException {
+ throw new IOException("Not implemented yet...");
+ }
+
+ @Override
+ protected byte[] engineGetEncoded(String format) throws IOException {
+ throw new IOException("Not implemented yet...");
+ }
+
+ @Override
+ protected String engineToString() {
+ return this.getClass().getCanonicalName();
+ }
+}
diff --git a/src/net/i2p/crypto/eddsa/EdDSASecurityProvider.java b/src/net/i2p/crypto/eddsa/EdDSASecurityProvider.java
index 88c4a512..2c1c7ee4 100644
--- a/src/net/i2p/crypto/eddsa/EdDSASecurityProvider.java
+++ b/src/net/i2p/crypto/eddsa/EdDSASecurityProvider.java
@@ -42,6 +42,7 @@ protected void setup() {
put("KeyFactory." + EdDSAKey.KEY_ALGORITHM, "net.i2p.crypto.eddsa.KeyFactory");
put("KeyPairGenerator." + EdDSAKey.KEY_ALGORITHM, "net.i2p.crypto.eddsa.KeyPairGenerator");
put("Signature." + EdDSAEngine.SIGNATURE_ALGORITHM, "net.i2p.crypto.eddsa.EdDSAEngine");
+ put("AlgorithmParameters." + EdDSAKey.KEY_ALGORITHM, "net.i2p.crypto.eddsa.AlgorithmParameters");
// OID Mappings
// See section "Mapping from OID to name".
diff --git a/test/net/i2p/crypto/eddsa/AlgorithmParametersTest.java b/test/net/i2p/crypto/eddsa/AlgorithmParametersTest.java
new file mode 100644
index 00000000..4fc2662d
--- /dev/null
+++ b/test/net/i2p/crypto/eddsa/AlgorithmParametersTest.java
@@ -0,0 +1,73 @@
+package net.i2p.crypto.eddsa;
+
+import net.i2p.crypto.eddsa.spec.EdDSAGenParameterSpec;
+import net.i2p.crypto.eddsa.spec.EdDSANamedCurveSpec;
+import net.i2p.crypto.eddsa.spec.EdDSANamedCurveTable;
+import net.i2p.crypto.eddsa.spec.EdDSAParameterSpec;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import java.security.spec.ECGenParameterSpec;
+import java.security.spec.InvalidParameterSpecException;
+
+import static org.junit.Assert.assertTrue;
+
+public class AlgorithmParametersTest {
+
+ @Test
+ public void testInitEngineWithEdGen() throws InvalidParameterSpecException {
+ AlgorithmParameters algorithmParameters = new AlgorithmParameters();
+ algorithmParameters.engineInit(new EdDSAGenParameterSpec(EdDSANamedCurveTable.ED_25519));
+ }
+
+ @Test
+ public void testInitEngineEdNameCurve() throws InvalidParameterSpecException {
+ AlgorithmParameters algorithmParameters = new AlgorithmParameters();
+ algorithmParameters.engineInit(EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519));
+ }
+
+ @Rule
+ public ExpectedException exception = ExpectedException.none();
+
+ @Test
+ public void testInitEngineWithNotImplementedParamSpec() throws InvalidParameterSpecException {
+ AlgorithmParameters algorithmParameters = new AlgorithmParameters();
+ EdDSANamedCurveSpec nameSpec = EdDSANamedCurveTable.ED_25519_CURVE_SPEC;
+ EdDSAParameterSpec paramSpec = new EdDSAParameterSpec(nameSpec.getCurve(),nameSpec.getHashAlgorithm(),nameSpec.getScalarOps(),nameSpec.getB());
+ exception.expect(InvalidParameterSpecException.class);
+ algorithmParameters.engineInit(paramSpec);
+ }
+
+ @Test
+ public void testengineGetParameterSpec_A() throws InvalidParameterSpecException {
+ AlgorithmParameters algorithmParameters = new AlgorithmParameters();
+ algorithmParameters.engineInit(EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519));
+ EdDSAGenParameterSpec edDSAGenParameterSpec = algorithmParameters.engineGetParameterSpec(EdDSAGenParameterSpec.class);
+ assertTrue(edDSAGenParameterSpec != null);
+ }
+
+ @Test
+ public void testengineGetParameterSpec_B() throws InvalidParameterSpecException {
+ AlgorithmParameters algorithmParameters = new AlgorithmParameters();
+ algorithmParameters.engineInit(new EdDSAGenParameterSpec(EdDSANamedCurveTable.ED_25519));
+ EdDSANamedCurveSpec edDSANamedCurveSpec = algorithmParameters.engineGetParameterSpec(EdDSANamedCurveSpec.class);
+ assertTrue(edDSANamedCurveSpec != null);
+ }
+
+ @Test
+ public void testengineGetParameterSpec_C() throws InvalidParameterSpecException {
+ AlgorithmParameters algorithmParameters = new AlgorithmParameters();
+ algorithmParameters.engineInit(new EdDSAGenParameterSpec(EdDSANamedCurveTable.ED_25519));
+ EdDSAParameterSpec edDSAParameterSpec = algorithmParameters.engineGetParameterSpec(EdDSAParameterSpec.class);
+ assertTrue(edDSAParameterSpec != null);
+ }
+
+ @Test
+ public void testengineGetParameterSpec_Exception() throws InvalidParameterSpecException {
+ AlgorithmParameters algorithmParameters = new AlgorithmParameters();
+ algorithmParameters.engineInit(new EdDSAGenParameterSpec(EdDSANamedCurveTable.ED_25519));
+ exception.expect(InvalidParameterSpecException.class);
+ ECGenParameterSpec edDSAParameterSpec = algorithmParameters.engineGetParameterSpec(ECGenParameterSpec.class);
+ }
+}
diff --git a/test/net/i2p/crypto/eddsa/EdDSASecurityProviderTest.java b/test/net/i2p/crypto/eddsa/EdDSASecurityProviderTest.java
index 272349e9..664b6c37 100644
--- a/test/net/i2p/crypto/eddsa/EdDSASecurityProviderTest.java
+++ b/test/net/i2p/crypto/eddsa/EdDSASecurityProviderTest.java
@@ -11,6 +11,7 @@
*/
package net.i2p.crypto.eddsa;
+import java.security.AlgorithmParameters;
import java.security.KeyFactory;
import java.security.KeyPairGenerator;
import java.security.NoSuchProviderException;
@@ -39,6 +40,7 @@ public void canGetInstancesWhenProviderIsPresent() throws Exception {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EdDSA", "EdDSA");
KeyFactory keyFac = KeyFactory.getInstance("EdDSA", "EdDSA");
Signature sgr = Signature.getInstance("NONEwithEdDSA", "EdDSA");
+ AlgorithmParameters algParam = AlgorithmParameters.getInstance("EdDSA","EdDSA");
Security.removeProvider("EdDSA");
}