summaryrefslogtreecommitdiff
path: root/src/cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi.java')
-rw-r--r--src/cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi.java227
1 files changed, 227 insertions, 0 deletions
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi.java b/src/cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi.java
new file mode 100644
index 0000000..b212697
--- /dev/null
+++ b/src/cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi.java
@@ -0,0 +1,227 @@
+package cz.crcs.ectester.standalone.libs.jni;
+
+import cz.crcs.ectester.common.util.ECUtil;
+
+import java.io.ByteArrayOutputStream;
+import java.security.*;
+import java.security.interfaces.ECPrivateKey;
+import java.security.interfaces.ECPublicKey;
+import java.security.spec.ECParameterSpec;
+
+/**
+ * @author Jan Jancar johny@neuromancer.sk
+ */
+public abstract class NativeSignatureSpi extends SignatureSpi {
+ private ECPublicKey verifyKey;
+ private ECPrivateKey signKey;
+ private ECParameterSpec params;
+
+ private ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+
+ @Override
+ protected void engineInitVerify(PublicKey publicKey) throws InvalidKeyException {
+ if (!(publicKey instanceof ECPublicKey)) {
+ throw new InvalidKeyException
+ ("Key must be an instance of ECPublicKey");
+ }
+ verifyKey = (ECPublicKey) publicKey;
+ params = verifyKey.getParams();
+ buffer.reset();
+ }
+
+ @Override
+ protected void engineInitSign(PrivateKey privateKey) throws InvalidKeyException {
+ if (!(privateKey instanceof ECPrivateKey)) {
+ throw new InvalidKeyException
+ ("Key must be an instance of ECPrivateKey");
+ }
+ signKey = (ECPrivateKey) privateKey;
+ params = signKey.getParams();
+ buffer.reset();
+ }
+
+ @Override
+ protected void engineUpdate(byte b) throws SignatureException {
+ buffer.write(b);
+ }
+
+ @Override
+ protected void engineUpdate(byte[] b, int off, int len) throws SignatureException {
+ buffer.write(b, off, len);
+ }
+
+ @Override
+ protected byte[] engineSign() throws SignatureException {
+ return sign(buffer.toByteArray(), ECUtil.toByteArray(signKey.getS(), params.getCurve().getField().getFieldSize()), params);
+ }
+
+ @Override
+ protected boolean engineVerify(byte[] sigBytes) throws SignatureException {
+ return verify(sigBytes, buffer.toByteArray(), ECUtil.toX962Uncompressed(verifyKey.getW(), params), params);
+ }
+
+ @Override
+ @Deprecated
+ protected void engineSetParameter(String param, Object value) throws InvalidParameterException {
+ throw new UnsupportedOperationException("setParameter() not supported");
+ }
+
+ @Override
+ @Deprecated
+ protected Object engineGetParameter(String param) throws InvalidParameterException {
+ throw new UnsupportedOperationException("getParameter() not supported");
+ }
+
+ abstract byte[] sign(byte[] data, byte[] privkey, ECParameterSpec params);
+
+ abstract boolean verify(byte[] signature, byte[] data, byte[] pubkey, ECParameterSpec params);
+
+ public static class TomCryptRaw extends NativeSignatureSpi {
+
+ @Override
+ native byte[] sign(byte[] data, byte[] privkey, ECParameterSpec params);
+
+ @Override
+ native boolean verify(byte[] signature, byte[] data, byte[] pubkey, ECParameterSpec params);
+ }
+
+ public abstract static class Botan extends NativeSignatureSpi {
+ private String type;
+
+ public Botan(String type) {
+ this.type = type;
+ }
+
+ @Override
+ native byte[] sign(byte[] data, byte[] privkey, ECParameterSpec params);
+
+ @Override
+ native boolean verify(byte[] signature, byte[] data, byte[] pubkey, ECParameterSpec params);
+ }
+
+ public static class BotanECDSAwithNONE extends Botan {
+
+ public BotanECDSAwithNONE() {
+ super("NONEwithECDSA");
+ }
+ }
+
+ public static class BotanECDSAwithSHA1 extends Botan {
+
+ public BotanECDSAwithSHA1() {
+ super("SHA1withECDSA");
+ }
+ }
+
+ public static class BotanECDSAwithSHA224 extends Botan {
+
+ public BotanECDSAwithSHA224() {
+ super("SHA224withECDSA");
+ }
+ }
+
+ public static class BotanECDSAwithSHA256 extends Botan {
+
+ public BotanECDSAwithSHA256() {
+ super("SHA256withECDSA");
+ }
+ }
+
+ public static class BotanECDSAwithSHA384 extends Botan {
+
+ public BotanECDSAwithSHA384() {
+ super("SHA384withECDSA");
+ }
+ }
+
+ public static class BotanECDSAwithSHA512 extends Botan {
+
+ public BotanECDSAwithSHA512() {
+ super("SHA512withECDSA");
+ }
+ }
+
+ public static class BotanECKCDSAwithNONE extends Botan {
+
+ public BotanECKCDSAwithNONE() {
+ super("NONEwithECKCDSA");
+ }
+ }
+
+ public static class BotanECKCDSAwithSHA1 extends Botan {
+
+ public BotanECKCDSAwithSHA1() {
+ super("SHA1withECKCDSA");
+ }
+ }
+
+ public static class BotanECKCDSAwithSHA224 extends Botan {
+
+ public BotanECKCDSAwithSHA224() {
+ super("SHA224withECKCDSA");
+ }
+ }
+
+ public static class BotanECKCDSAwithSHA256 extends Botan {
+
+ public BotanECKCDSAwithSHA256() {
+ super("SHA256withECKCDSA");
+ }
+ }
+
+ public static class BotanECKCDSAwithSHA384 extends Botan {
+
+ public BotanECKCDSAwithSHA384() {
+ super("SHA384withECKCDSA");
+ }
+ }
+
+ public static class BotanECKCDSAwithSHA512 extends Botan {
+
+ public BotanECKCDSAwithSHA512() {
+ super("SHA512withECKCDSA");
+ }
+ }
+
+ public static class BotanECGDSAwithNONE extends Botan {
+
+ public BotanECGDSAwithNONE() {
+ super("NONEwithECGDSA");
+ }
+ }
+
+ public static class BotanECGDSAwithSHA1 extends Botan {
+
+ public BotanECGDSAwithSHA1() {
+ super("SHA1withECGDSA");
+ }
+ }
+
+ public static class BotanECGDSAwithSHA224 extends Botan {
+
+ public BotanECGDSAwithSHA224() {
+ super("SHA224withECGDSA");
+ }
+ }
+
+ public static class BotanECGDSAwithSHA256 extends Botan {
+
+ public BotanECGDSAwithSHA256() {
+ super("SHA256withECGDSA");
+ }
+ }
+
+ public static class BotanECGDSAwithSHA384 extends Botan {
+
+ public BotanECGDSAwithSHA384() {
+ super("SHA384withECGDSA");
+ }
+ }
+
+ public static class BotanECGDSAwithSHA512 extends Botan {
+
+ public BotanECGDSAwithSHA512() {
+ super("SHA512withECGDSA");
+ }
+ }
+}