aboutsummaryrefslogtreecommitdiff
path: root/standalone/src
diff options
context:
space:
mode:
Diffstat (limited to 'standalone/src')
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/NettleLib.java32
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java126
-rw-r--r--standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi.java49
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/native.h136
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/nettle.c51
-rw-r--r--standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java15
6 files changed, 282 insertions, 127 deletions
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NettleLib.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NettleLib.java
index 6b60779..d4df414 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NettleLib.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/NettleLib.java
@@ -1,6 +1,15 @@
package cz.crcs.ectester.standalone.libs;
+import cz.crcs.ectester.common.ec.EC_Curve;
+import cz.crcs.ectester.common.util.ECUtil;
+import cz.crcs.ectester.data.EC_Store;
+
+import java.security.InvalidAlgorithmParameterException;
import java.security.Provider;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.ECGenParameterSpec;
+import java.security.spec.ECParameterSpec;
+import java.util.Arrays;
import java.util.Set;
/**
@@ -17,4 +26,27 @@ public class NettleLib extends NativeECLibrary {
@Override
public native Set<String> getCurves();
+
+ public static ECGenParameterSpec parametersKnown(AlgorithmParameterSpec params) throws InvalidAlgorithmParameterException {
+ if (params instanceof ECGenParameterSpec) {
+ if (Arrays.asList("secp192r1", "secp224r1", "secp256r1", "secp384r1", "secp521r1").contains(((ECGenParameterSpec) params).getName())) {
+ return (ECGenParameterSpec) params;
+ }
+ } else if (params instanceof ECParameterSpec) {
+ ECParameterSpec spec = (ECParameterSpec) params;
+ EC_Store store = EC_Store.getInstance();
+ if (ECUtil.equalECParameterSpec(spec, store.getObject(EC_Curve.class, "secg/secp192r1").toSpec())) {
+ return new ECGenParameterSpec("secp192r1");
+ } else if (ECUtil.equalECParameterSpec(spec, store.getObject(EC_Curve.class, "secg/secp224r1").toSpec())) {
+ return new ECGenParameterSpec("secp224r1");
+ } else if (ECUtil.equalECParameterSpec(spec, store.getObject(EC_Curve.class, "secg/secp256r1").toSpec())) {
+ return new ECGenParameterSpec("secp256r1");
+ } else if (ECUtil.equalECParameterSpec(spec, store.getObject(EC_Curve.class, "secg/secp384r1").toSpec())) {
+ return new ECGenParameterSpec("secp384r1");
+ } else if (ECUtil.equalECParameterSpec(spec, store.getObject(EC_Curve.class, "secg/secp521r1").toSpec())) {
+ return new ECGenParameterSpec("secp521r1");
+ }
+ }
+ throw new InvalidAlgorithmParameterException("Unknown curve.");
+ }
}
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java
index afed02b..d9a4d40 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java
@@ -1,6 +1,9 @@
package cz.crcs.ectester.standalone.libs.jni;
+import cz.crcs.ectester.common.ec.EC_Curve;
import cz.crcs.ectester.common.util.ECUtil;
+import cz.crcs.ectester.data.EC_Store;
+import cz.crcs.ectester.standalone.libs.NettleLib;
import javax.crypto.KeyAgreementSpi;
import javax.crypto.SecretKey;
@@ -11,7 +14,6 @@ import java.security.interfaces.ECPublicKey;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.ECGenParameterSpec;
import java.security.spec.ECParameterSpec;
-import java.security.spec.InvalidParameterSpecException;
/**
* @author Jan Jancar johny@neuromancer.sk
@@ -61,6 +63,22 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
return secret.length;
}
+ protected byte[] getPubkey() {
+ if (publicKey instanceof NativeECPublicKey) {
+ return ((NativeECPublicKey) publicKey).getData();
+ } else {
+ return ECUtil.pubkeyToBytes(publicKey);
+ }
+ }
+
+ protected byte[] getPrivkey() {
+ if (privateKey instanceof NativeECPrivateKey) {
+ return ((NativeECPrivateKey) privateKey).getData();
+ } else {
+ return ECUtil.privkeyToBytes(privateKey);
+ }
+ }
+
private abstract static class SimpleKeyAgreementSpi extends NativeKeyAgreementSpi {
@Override
@@ -72,51 +90,79 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
this.params = params;
}
- private byte[] getPubkey() {
- if (publicKey instanceof NativeECPublicKey) {
- return ((NativeECPublicKey) publicKey).getData();
- } else {
- return ECUtil.toX962Uncompressed(publicKey.getW(), ((ECParameterSpec) params));
+ @Override
+ protected byte[] engineGenerateSecret() throws IllegalStateException {
+ return generateSecret(getPubkey(), getPrivkey(), (ECParameterSpec) params);
+ }
+
+ abstract byte[] generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params);
+
+ @Override
+ protected SecretKey engineGenerateSecret(String algorithm) throws IllegalStateException, NoSuchAlgorithmException, InvalidKeyException {
+ if (algorithm == null) {
+ throw new NoSuchAlgorithmException("Algorithm must not be null.");
}
+ return generateSecret(getPubkey(), getPrivkey(), (ECParameterSpec) params, algorithm);
}
- private byte[] getPrivkey() {
- if (privateKey instanceof NativeECPrivateKey) {
- return ((NativeECPrivateKey) privateKey).getData();
- } else {
- return ECUtil.toByteArray(privateKey.getS(), ((ECParameterSpec) params).getOrder().bitLength());
+ abstract SecretKey generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params, String algorithm);
+ }
+
+ private abstract static class ExtendedKeyAgreementSpi extends NativeKeyAgreementSpi {
+
+ @Override
+ protected void engineInit(Key key, AlgorithmParameterSpec params, SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException {
+ if (!(params instanceof ECParameterSpec || params instanceof ECGenParameterSpec)) {
+ throw new InvalidAlgorithmParameterException("Unknown parameter class.");
}
+ engineInit(key, random);
+ this.params = params;
}
@Override
protected byte[] engineGenerateSecret() throws IllegalStateException {
- return generateSecret(getPubkey(), getPrivkey(), (ECParameterSpec) params);
+ return generateSecret(publicKey, privateKey, params);
}
- abstract byte[] generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params);
+ abstract byte[] generateSecret(ECPublicKey pubkey, ECPrivateKey privkey, AlgorithmParameterSpec params);
@Override
protected SecretKey engineGenerateSecret(String algorithm) throws IllegalStateException, NoSuchAlgorithmException, InvalidKeyException {
if (algorithm == null) {
throw new NoSuchAlgorithmException("Algorithm must not be null");
}
- return generateSecret(getPubkey(), getPrivkey(), (ECParameterSpec) params, algorithm);
+ return generateSecret(publicKey, privateKey, params, algorithm);
}
- abstract SecretKey generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params, String algorithm);
+ abstract SecretKey generateSecret(ECPublicKey pubkey, ECPrivateKey privkey, AlgorithmParameterSpec params, String algorithm);
}
- private abstract static class ExtendedKeyAgreementSpi extends NativeKeyAgreementSpi {
+ private abstract static class NamedKeyAgreementSpi extends NativeKeyAgreementSpi {
+
+ @Override
+ protected void engineInit(Key key, SecureRandom random) throws InvalidKeyException {
+ if (!(key instanceof ECPrivateKey)) {
+ throw new InvalidKeyException("Key must be instance of ECPrivateKey");
+ }
+ privateKey = (ECPrivateKey) key;
+ try {
+ this.params = parametersKnown(privateKey.getParams());
+ } catch (InvalidAlgorithmParameterException e) {
+ throw new InvalidKeyException(e);
+ }
+ }
@Override
protected void engineInit(Key key, AlgorithmParameterSpec params, SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException {
if (!(params instanceof ECParameterSpec || params instanceof ECGenParameterSpec)) {
- throw new InvalidAlgorithmParameterException();
+ throw new InvalidAlgorithmParameterException("Unknown parameter class.");
}
engineInit(key, random);
- this.params = params;
+ this.params = parametersKnown(params);
}
+ abstract ECGenParameterSpec parametersKnown(AlgorithmParameterSpec params) throws InvalidAlgorithmParameterException;
+
@Override
protected byte[] engineGenerateSecret() throws IllegalStateException {
return generateSecret(publicKey, privateKey, params);
@@ -374,7 +420,7 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
}
}
- public abstract static class Nettle extends SimpleKeyAgreementSpi {
+ public abstract static class Nettle extends NamedKeyAgreementSpi {
private final String type;
public Nettle(String type) {
@@ -382,43 +428,21 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi {
}
@Override
- byte[] generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params) {
- try {
- // TODO: OMG remove this monstrosity.
- AlgorithmParameters tmp = AlgorithmParameters.getInstance("EC");
- tmp.init(params);
- ECGenParameterSpec spec = tmp.getParameterSpec(ECGenParameterSpec.class);
- switch (spec.getName()) {
- case "1.2.840.10045.3.1.7":
- spec = new ECGenParameterSpec("secp256r1");
- break;
- case "1.2.840.10045.3.1.1":
- spec = new ECGenParameterSpec("secp192r1");
- break;
- case "1.3.132.0.33":
- spec = new ECGenParameterSpec("secp224r1");
- break;
- case "1.3.132.0.34":
- spec = new ECGenParameterSpec("secp384r1");
- break;
- case "1.3.132.0.35":
- spec = new ECGenParameterSpec("secp521r1");
- break;
- default:
- return null;
+ ECGenParameterSpec parametersKnown(AlgorithmParameterSpec params) throws InvalidAlgorithmParameterException {
+ return NettleLib.parametersKnown(params);
+ }
- }
- return generateSecret(pubkey, privkey, spec);
+ @Override
+ byte[] generateSecret(ECPublicKey pubkey, ECPrivateKey privkey, AlgorithmParameterSpec params) {
+ return generateSecret(getPubkey(), getPrivkey(), (ECGenParameterSpec) params);
+ }
- } catch (NoSuchAlgorithmException | InvalidParameterSpecException e) {
- return null;
- }
+ @Override
+ SecretKey generateSecret(ECPublicKey pubkey, ECPrivateKey privkey, AlgorithmParameterSpec params, String algorithm) {
+ throw new UnsupportedOperationException("Not supported.");
}
native byte[] generateSecret(byte[] pubkey, byte[] privkey, ECGenParameterSpec params);
-
- @Override
- native SecretKey generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params, String algorithm);
}
public static class NettleECDH extends Nettle {
diff --git a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi.java b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi.java
index 0a9487f..086c2c4 100644
--- a/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi.java
+++ b/standalone/src/main/java/cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi.java
@@ -2,6 +2,7 @@ package cz.crcs.ectester.standalone.libs.jni;
import cz.crcs.ectester.common.ec.EC_Curve;
import cz.crcs.ectester.data.EC_Store;
+import cz.crcs.ectester.standalone.libs.NettleLib;
import java.security.*;
import java.security.spec.AlgorithmParameterSpec;
@@ -293,7 +294,7 @@ public abstract class NativeKeyPairGeneratorSpi extends KeyPairGeneratorSpi {
@Override
native KeyPair generate(AlgorithmParameterSpec params, SecureRandom random);
}
-
+
public static class Libressl extends NativeKeyPairGeneratorSpi {
public Libressl() {
@@ -319,26 +320,48 @@ public abstract class NativeKeyPairGeneratorSpi extends KeyPairGeneratorSpi {
}
@Override
- native boolean keysizeSupported(int keysize);
+ boolean keysizeSupported(int keysize) {
+ switch (keysize) {
+ case 192, 224, 256, 384, 521:
+ return true;
+ default:
+ return false;
+ }
+ }
@Override
- native boolean paramsSupported(AlgorithmParameterSpec params);
+ boolean paramsSupported(AlgorithmParameterSpec params) {
+ try {
+ NettleLib.parametersKnown(params);
+ return true;
+ } catch (InvalidAlgorithmParameterException ignored) {
+ return false;
+ }
+ }
@Override
- native KeyPair generate(int keysize, SecureRandom random);
+ KeyPair generate(int keysize, SecureRandom random) {
+ EC_Curve curve = EC_Store.getInstance().getObject(EC_Curve.class, "secg/secp" + keysize + "r1");
+ return generate(keysize, random, curve.toSpec());
+ }
+
+ native KeyPair generate(int keysize, SecureRandom random, AlgorithmParameterSpec spec);
@Override
KeyPair generate(AlgorithmParameterSpec params, SecureRandom random) {
- if (params instanceof ECGenParameterSpec) {
- String curveName = ((ECGenParameterSpec) params).getName();
- if (curveName.contains("secp")) {
- curveName = "secg/" + curveName;
- }
- EC_Curve curve = EC_Store.getInstance().getObject(EC_Curve.class, curveName);
- ECParameterSpec spec = curve.toSpec();
- return generate(params, random, spec);
+ ECGenParameterSpec named;
+ try {
+ named = NettleLib.parametersKnown(params);
+ } catch (InvalidAlgorithmParameterException ignored) {
+ return null;
+ }
+ String curveName = named.getName();
+ if (curveName.startsWith("secp")) {
+ curveName = "secg/" + curveName;
}
- return null;
+ EC_Curve curve = EC_Store.getInstance().getObject(EC_Curve.class, curveName);
+ ECParameterSpec spec = curve.toSpec();
+ return generate(params, random, spec);
}
native KeyPair generate(AlgorithmParameterSpec params, SecureRandom random, AlgorithmParameterSpec spec);
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/native.h b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/native.h
index dcaf57c..60c59b1 100644
--- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/native.h
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/native.h
@@ -1861,3 +1861,139 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna
}
#endif
#endif
+/* Header for class cz_crcs_ectester_standalone_libs_NettleLib */
+
+#ifndef _Included_cz_crcs_ectester_standalone_libs_NettleLib
+#define _Included_cz_crcs_ectester_standalone_libs_NettleLib
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class: cz_crcs_ectester_standalone_libs_NettleLib
+ * Method: createProvider
+ * Signature: ()Ljava/security/Provider;
+ */
+JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_NettleLib_createProvider
+ (JNIEnv *, jobject);
+
+/*
+ * Class: cz_crcs_ectester_standalone_libs_NettleLib
+ * Method: getCurves
+ * Signature: ()Ljava/util/Set;
+ */
+JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_NettleLib_getCurves
+ (JNIEnv *, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle */
+
+#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle
+#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle
+#ifdef __cplusplus
+extern "C" {
+#endif
+#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_serialVersionUID
+#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_serialVersionUID 1421746759512286392LL
+#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_MAX_ARRAY_SIZE
+#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_MAX_ARRAY_SIZE 2147483639L
+#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_KEYS
+#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_KEYS 0L
+#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_VALUES
+#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_VALUES 1L
+#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_ENTRIES
+#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_ENTRIES 2L
+#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_serialVersionUID
+#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_serialVersionUID 4112578634029874840LL
+#undef cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_serialVersionUID
+#define cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle_serialVersionUID -4298000515446427739LL
+/*
+ * Class: cz_crcs_ectester_standalone_libs_jni_NativeProvider_Nettle
+ * Method: setup
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Nettle_setup
+ (JNIEnv *, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Nettle */
+
+#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Nettle
+#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Nettle
+#ifdef __cplusplus
+extern "C" {
+#endif
+#undef cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Nettle_DEFAULT_KEYSIZE
+#define cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Nettle_DEFAULT_KEYSIZE 256L
+/*
+ * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Nettle
+ * Method: generate
+ * Signature: (ILjava/security/SecureRandom;Ljava/security/spec/AlgorithmParameterSpec;)Ljava/security/KeyPair;
+ */
+JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Nettle_generate__ILjava_security_SecureRandom_2Ljava_security_spec_AlgorithmParameterSpec_2
+ (JNIEnv *, jobject, jint, jobject, jobject);
+
+/*
+ * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_Nettle
+ * Method: generate
+ * Signature: (Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;Ljava/security/spec/AlgorithmParameterSpec;)Ljava/security/KeyPair;
+ */
+JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Nettle_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2Ljava_security_spec_AlgorithmParameterSpec_2
+ (JNIEnv *, jobject, jobject, jobject, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Nettle */
+
+#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Nettle
+#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Nettle
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class: cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_Nettle
+ * Method: generateSecret
+ * Signature: ([B[BLjava/security/spec/ECGenParameterSpec;)[B
+ */
+JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Nettle_generateSecret
+ (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+/* Header for class cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Nettle */
+
+#ifndef _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Nettle
+#define _Included_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Nettle
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Nettle
+ * Method: sign
+ * Signature: ([B[BLjava/security/spec/ECGenParameterSpec;)[B
+ */
+JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Nettle_sign
+ (JNIEnv *, jobject, jbyteArray, jbyteArray, jobject);
+
+/*
+ * Class: cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_Nettle
+ * Method: verify
+ * Signature: ([B[B[BLjava/security/spec/ECGenParameterSpec;)Z
+ */
+JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Nettle_verify
+ (JNIEnv *, jobject, jbyteArray, jbyteArray, jbyteArray, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/nettle.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/nettle.c
index 48b8f26..24ba699 100644
--- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/nettle.c
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/nettle.c
@@ -36,7 +36,6 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_NettleLib_create
}
JNIEXPORT void JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeProvider_00024Nettle_setup(JNIEnv *env, jobject self) {
-
INIT_PROVIDER(env, provider_class);
ADD_KPG(env, self, "EC", "Nettle");
ADD_KA(env, self, "ECDH", "NettleECDH");
@@ -67,16 +66,6 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_NettleLib_getCur
return result;
}
-JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Nettle_keysizeSupported(JNIEnv *env, jobject self, jint keysize) {
- int supported[] = {192, 224, 256, 384, 521};
- for (int i = 0; i < 5; i++) {
- if (keysize == supported[i]) {
- return JNI_TRUE;
- }
- }
- return JNI_FALSE;
-}
-
static const struct ecc_curve* create_curve_from_name(JNIEnv *env, const char* curve_name) {
if (!curve_name) {
return NULL;
@@ -116,34 +105,6 @@ static const struct ecc_curve* create_curve_from_size(JNIEnv *env, jint keysize)
}
}
-JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Nettle_paramsSupported(JNIEnv *env, jobject self, jobject params){
- if (params == NULL) {
- return JNI_FALSE;
- }
-
- if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) {
- return JNI_FALSE;
- } else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) {
- jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
- jstring name = (*env)->CallObjectMethod(env, params, get_name);
- const char *utf_name = (*env)->GetStringUTFChars(env, name, NULL);
-
- char *curve_name[5] = {"secp192r1", "secp224r1", "secp256r1", "secp384r1", "secp521r1"};
- for (int i = 0; i < sizeof(curve_name); i++) {
- if (strcasecmp(utf_name, curve_name[i]) == 0) {
- (*env)->ReleaseStringUTFChars(env, name, utf_name);
- return JNI_TRUE;
- }
- }
- (*env)->ReleaseStringUTFChars(env, name, utf_name);
- return JNI_FALSE;
- } else {
- return JNI_FALSE;
- }
- return JNI_FALSE;
-
-}
-
static jobject generate_from_curve(JNIEnv *env, const struct ecc_curve* curve, jobject spec, int byte_size) {
struct ecc_point pub;
@@ -210,16 +171,15 @@ static jobject generate_from_curve(JNIEnv *env, const struct ecc_curve* curve, j
return (*env)->NewObject(env, keypair_class, keypair_init, pubkey, privkey);
}
-JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Nettle_generate__ILjava_security_SecureRandom_2(JNIEnv *env, jobject self, jint keysize, jobject random) {
+JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Nettle_generate__ILjava_security_SecureRandom_2Ljava_security_spec_AlgorithmParameterSpec_2(JNIEnv *env, jobject self, jint keysize, jobject random, jobject spec) {
const struct ecc_curve* curve = create_curve_from_size(env, keysize);
if (!curve) {
throw_new(env, "java/lang/UnsupportedOperationException", "Not supported.");
return NULL;
}
int byte_size = (keysize + 7) / 8;
- jobject result = generate_from_curve(env, curve, NULL, byte_size);
+ jobject result = generate_from_curve(env, curve, spec, byte_size);
return result;
- return NULL;
}
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Nettle_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2Ljava_security_spec_AlgorithmParameterSpec_2(JNIEnv *env, jobject self, jobject params, jobject random, jobject spec) {
@@ -280,7 +240,7 @@ int barray_to_privkey(JNIEnv *env, struct ecc_scalar* privKey, jbyteArray priv)
return priv_len;
}
-JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Nettle_generateSecret___3B_3BLjava_security_spec_ECGenParameterSpec_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params) {
+JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Nettle_generateSecret(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params) {
jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
jstring name = (*env)->CallObjectMethod(env, params, get_name);
const char* utf_name = (*env)->GetStringUTFChars(env, name, NULL);
@@ -339,11 +299,6 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKey
return result;
}
-JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Nettle_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algorithm) {
- throw_new(env, "java/lang/UnsupportedOperationException", "Not supported.");
- return NULL;
-}
-
// credit to https://github.com/crocs-muni/ECTester/blob/master/src/cz/crcs/ectester/standalone/libs/jni/c_utils.c
size_t signature_to_der(struct dsa_signature* signature, unsigned char *result, int byte_size) {
size_t r_tmpSize;
diff --git a/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java b/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java
index c39ee54..1f82bb0 100644
--- a/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java
+++ b/standalone/src/test/java/cz/crcs/ectester/standalone/AppTests.java
@@ -90,9 +90,6 @@ public class AppTests {
@MethodSource("libs")
@StdIo()
public void defaultSuite(String libName, StdOut out) {
- // TODO: "Nettle" is very broken here for a weird reason.
- assumeFalse(libName.equals("Nettle"));
-
String[] args = buildCLIArgs(libName, "default");
if (libName.equals("Botan") || libName.equals("Crypto++")) {
args = buildCLIArgs(libName, "default", "--kpg-type", "ECDH");
@@ -123,9 +120,6 @@ public class AppTests {
@ParameterizedTest
@MethodSource("libs")
public void performanceSuite(String libName) {
- // TODO: "Nettle" is very broken here for a weird reason.
- assumeFalse(libName.equals("Nettle"));
-
String[] args = buildCLIArgs(libName, "performance");
if (libName.equals("Botan") || libName.equals("Crypto++")) {
args = buildCLIArgs(libName, "performance", "--kpg-type", "ECDH");
@@ -172,9 +166,6 @@ public class AppTests {
@ParameterizedTest
@MethodSource("libs")
public void twistSuite(String libName) {
- // TODO: "Nettle" is very broken here for a weird reason.
- assumeFalse(libName.equals("Nettle"));
-
String[] args = buildCLIArgs(libName, "twist", "-q");
if (libName.equals("Botan") || libName.equals("Crypto++")) {
args = buildCLIArgs(libName, "twist", "--kpg-type", "ECDH", "-q");
@@ -185,9 +176,6 @@ public class AppTests {
@ParameterizedTest
@MethodSource("libs")
public void degenerateSuite(String libName) {
- // TODO: "Nettle" is very broken here for a weird reason.
- assumeFalse(libName.equals("Nettle"));
-
String[] args = buildCLIArgs(libName, "degenerate", "-q");
if (libName.equals("Botan") || libName.equals("Crypto++")) {
args = buildCLIArgs(libName, "degenerate", "--kpg-type", "ECDH", "-q");
@@ -255,9 +243,6 @@ public class AppTests {
@ParameterizedTest
@MethodSource("libs")
public void invalidSuite(String libName) {
- // TODO: "Nettle" is very broken here for a weird reason.
- assumeFalse(libName.equals("Nettle"));
-
String[] args = buildCLIArgs(libName, "invalid", "-q");
if (libName.equals("Botan") || libName.equals("Crypto++")) {
args = buildCLIArgs(libName, "invalid", "--kpg-type", "ECDH", "-q");