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"); }