Skip to content

Commit

Permalink
Cleanups in provider classes.
Browse files Browse the repository at this point in the history
  • Loading branch information
J08nY committed Mar 29, 2024
1 parent c048a5b commit 63beedc
Show file tree
Hide file tree
Showing 15 changed files with 245 additions and 154 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,12 @@ public Libressl(String type) {
native SecretKey generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params, String algorithm);
}

public static class LibresslECDH extends Libressl {
public LibresslECDH() {
super("ECDH");
}
}

public abstract static class Nettle extends SimpleKeyAgreementSpi {
private final String type;

Expand All @@ -378,6 +384,7 @@ public Nettle(String type) {
@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);
Expand Down Expand Up @@ -420,10 +427,4 @@ public NettleECDH() {
super("ECDH");
}
}
public static class LibresslECDH extends Libressl {
public LibresslECDH() {
super("ECDH");
}
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
#include "c_utils.h"
#include "c_timing.h"

#include "native.h"
#include <string.h>
#include <strings.h>

#include <openssl/conf.h>
#include <openssl/opensslv.h>
Expand All @@ -12,9 +15,11 @@
#include <openssl/ecdh.h>
#include <openssl/ecdsa.h>

#include "c_utils.h"
#include "c_timing.h"

/*
* BoringSSL:
* - Supports prime field curves only.
* - Named curves and explicit params.
*/

static jclass provider_class;

Expand Down Expand Up @@ -113,6 +118,7 @@ static EC_GROUP *create_curve(JNIEnv *env, jobject params) {
jobject field = (*env)->CallObjectMethod(env, elliptic_curve, get_field);

if ((*env)->IsInstanceOf(env, field, f2m_field_class)) {

return NULL;
}

Expand Down Expand Up @@ -192,7 +198,8 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPa
if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) {
EC_GROUP *curve = create_curve(env, params);
jboolean result = !curve;
EC_GROUP_free(curve);
if (curve)
EC_GROUP_free(curve);
return result;
} else if ((*env)->IsInstanceOf(env, params, ecgen_parameter_spec_class)) {
jmethodID get_name = (*env)->GetMethodID(env, ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
Expand Down Expand Up @@ -345,6 +352,10 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPai
JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Boringssl_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(JNIEnv *env, jobject self, jobject params, jobject random) {
if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) {
EC_GROUP *curve = create_curve(env, params);
if (!curve) {
throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
return NULL;
}
jobject result = generate_from_curve(env, curve);
EC_GROUP_free(curve);
return result;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@
#include "cpp_utils.hpp"
#include "c_timing.h"

/*
* Botan:
* - Supports prime field curves only.
* - Named curves and explicit params.
*/

static jclass provider_class;
static Botan::AutoSeeded_RNG rng;

Expand All @@ -32,7 +38,7 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_BotanLib_createP
name_str.insert(0, "Botan ");

jstring name = env->NewStringUTF(name_str.c_str());
double version = strtod(v_str, NULL);
double version = strtod(v_str, nullptr);
jstring info = env->NewStringUTF(info_str);

return env->NewObject(provider_class, init, name, version, info);
Expand Down Expand Up @@ -86,8 +92,7 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_BotanLib_getCurv
jobject result = env->NewObject(set_class, set_ctr);

const std::set<std::string>& curves = Botan::EC_Group::known_named_groups();
for (auto it = curves.begin(); it != curves.end(); ++it) {
std::string curve_name = *it;
for (const auto& curve_name : curves) {
jstring name_str = env->NewStringUTF(curve_name.c_str());
env->CallBooleanMethod(result, set_add, name_str);
}
Expand All @@ -100,7 +105,7 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPa
}

jboolean check_params(JNIEnv *env, jobject params) {
if (params == NULL) {
if (params == nullptr) {
return JNI_FALSE;
}

Expand All @@ -117,8 +122,8 @@ jboolean check_params(JNIEnv *env, jobject params) {
} else if (env->IsInstanceOf(params, ecgen_parameter_spec_class)) {
const std::set<std::string>& curves = Botan::EC_Group::known_named_groups();
jmethodID get_name = env->GetMethodID(ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
jstring name = (jstring) env->CallObjectMethod(params, get_name);
const char *utf_name = env->GetStringUTFChars(name, NULL);
auto name = (jstring) env->CallObjectMethod(params, get_name);
const char *utf_name = env->GetStringUTFChars(name, nullptr);
std::string str_name(utf_name);
env->ReleaseStringUTFChars(name, utf_name);
if (curves.find(str_name) != curves.end()) {
Expand All @@ -135,7 +140,7 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPa
static jobject biginteger_from_bigint(JNIEnv *env, const Botan::BigInt& bigint) {
std::vector<uint8_t> bigint_data = Botan::BigInt::encode(bigint);
jbyteArray bigint_array = env->NewByteArray(bigint_data.size());
jbyte * bigint_bytes = env->GetByteArrayElements(bigint_array, NULL);
jbyte *bigint_bytes = env->GetByteArrayElements(bigint_array, nullptr);
std::copy(bigint_data.begin(), bigint_data.end(), bigint_bytes);
env->ReleaseByteArrayElements(bigint_array, bigint_bytes, 0);

Expand All @@ -147,7 +152,7 @@ static Botan::BigInt bigint_from_biginteger(JNIEnv *env, jobject biginteger) {
jmethodID to_byte_array = env->GetMethodID(biginteger_class, "toByteArray", "()[B");
jbyteArray byte_array = (jbyteArray) env->CallObjectMethod(biginteger, to_byte_array);
jsize byte_length = env->GetArrayLength(byte_array);
jbyte *byte_data = env->GetByteArrayElements(byte_array, NULL);
jbyte *byte_data = env->GetByteArrayElements(byte_array, nullptr);
Botan::BigInt result((unsigned char *) byte_data, byte_length);
env->ReleaseByteArrayElements(byte_array, byte_data, JNI_ABORT);
return result;
Expand Down Expand Up @@ -199,7 +204,7 @@ static Botan::EC_Group group_from_params(JNIEnv *env, jobject params) {
} else if (env->IsInstanceOf(params, ecgen_parameter_spec_class)) {
jmethodID get_name = env->GetMethodID(ecgen_parameter_spec_class, "getName", "()Ljava/lang/String;");
jstring name = (jstring) env->CallObjectMethod(params, get_name);
const char *utf_name = env->GetStringUTFChars(name, NULL);
const char *utf_name = env->GetStringUTFChars(name, nullptr);
std::string curve_name(utf_name);
env->ReleaseStringUTFChars(name, utf_name);
return Botan::EC_Group(curve_name);
Expand Down Expand Up @@ -240,7 +245,7 @@ static jobject generate_from_group(JNIEnv* env, jobject self, Botan::EC_Group gr
jclass botan_kpg_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/NativeKeyPairGeneratorSpi$Botan");
jfieldID type_id = env->GetFieldID(botan_kpg_class, "type", "Ljava/lang/String;");
jstring type = (jstring) env->GetObjectField(self, type_id);
const char* type_data = env->GetStringUTFChars(type, NULL);
const char* type_data = env->GetStringUTFChars(type, nullptr);
std::string type_str(type_data);
env->ReleaseStringUTFChars(type, type_data);

Expand All @@ -259,7 +264,7 @@ static jobject generate_from_group(JNIEnv* env, jobject self, Botan::EC_Group gr
native_timing_stop();
} catch (Botan::Exception & ex) {
throw_new(env, "java/security/GeneralSecurityException", ex.what());
return NULL;
return nullptr;
}

jobject ec_param_spec = params_from_group(env, group);
Expand All @@ -268,7 +273,7 @@ static jobject generate_from_group(JNIEnv* env, jobject self, Botan::EC_Group gr
std::vector<uint8_t> pub_data = pub_point.encode(Botan::PointGFp::UNCOMPRESSED);

jbyteArray pub_bytearray = env->NewByteArray(pub_data.size());
jbyte *pub_bytes = env->GetByteArrayElements(pub_bytearray, NULL);
jbyte *pub_bytes = env->GetByteArrayElements(pub_bytearray, nullptr);
std::copy(pub_data.begin(), pub_data.end(), pub_bytes);
env->ReleaseByteArrayElements(pub_bytearray, pub_bytes, 0);

Expand All @@ -280,7 +285,7 @@ static jobject generate_from_group(JNIEnv* env, jobject self, Botan::EC_Group gr
std::vector<uint8_t> priv_data = Botan::BigInt::encode(priv_scalar);

jbyteArray priv_bytearray = env->NewByteArray(priv_data.size());
jbyte *priv_bytes = env->GetByteArrayElements(priv_bytearray, NULL);
jbyte *priv_bytes = env->GetByteArrayElements(priv_bytearray, nullptr);
std::copy(priv_data.begin(), priv_data.end(), priv_bytes);
env->ReleaseByteArrayElements(priv_bytearray, priv_bytes, 0);

Expand All @@ -295,8 +300,8 @@ static jobject generate_from_group(JNIEnv* env, jobject self, Botan::EC_Group gr

JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Botan_generate__ILjava_security_SecureRandom_2(JNIEnv *env, jobject self, jint keysize, jobject random){
const std::set<std::string>& curves = Botan::EC_Group::known_named_groups();
for (auto it = curves.begin(); it != curves.end(); ++it) {
Botan::EC_Group curve_group = Botan::EC_Group(*it);
for (const auto & curve : curves) {
Botan::EC_Group curve_group = Botan::EC_Group(curve);
size_t curve_size = curve_group.get_p_bits();
if (curve_size == (size_t) keysize) {
//generate on this group. Even thou no default groups are present...
Expand All @@ -305,13 +310,13 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPai
}

throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
return NULL;
return nullptr;
}

JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPairGeneratorSpi_00024Botan_generate__Ljava_security_spec_AlgorithmParameterSpec_2Ljava_security_SecureRandom_2(JNIEnv *env, jobject self, jobject params, jobject random){
if (!check_params(env, params)) {
throw_new(env, "java/lang/UnsupportedOperationException", "Not supported.");
return NULL;
throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
return nullptr;
}
Botan::EC_Group curve_group = group_from_params(env, params);
return generate_from_group(env, self, curve_group);
Expand Down Expand Up @@ -349,20 +354,20 @@ static std::string get_kdf(const std::string& type_str, size_t *kdf_bits) {

jbyteArray generate_secret(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algorithm) {
if (!check_params(env, params)) {
throw_new(env, "java/lang/UnsupportedOperationException", "Not supported.");
return NULL;
throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
return nullptr;
}
Botan::EC_Group curve_group = group_from_params(env, params);

jsize privkey_length = env->GetArrayLength(privkey);
jbyte *privkey_data = env->GetByteArrayElements(privkey, NULL);
jbyte *privkey_data = env->GetByteArrayElements(privkey, nullptr);
Botan::BigInt privkey_scalar((unsigned char *) privkey_data, privkey_length);
env->ReleaseByteArrayElements(privkey, privkey_data, JNI_ABORT);

Botan::ECDH_PrivateKey skey(rng, curve_group, privkey_scalar);

jsize pubkey_length = env->GetArrayLength(pubkey);
jbyte *pubkey_data = env->GetByteArrayElements(pubkey, NULL);
jbyte *pubkey_data = env->GetByteArrayElements(pubkey, nullptr);
Botan::PointGFp public_point = curve_group.OS2ECP((uint8_t*) pubkey_data, pubkey_length);
env->ReleaseByteArrayElements(pubkey, pubkey_data, JNI_ABORT);

Expand All @@ -372,7 +377,7 @@ jbyteArray generate_secret(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteAr
jclass botan_ka_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi$Botan");
jfieldID type_id = env->GetFieldID(botan_ka_class, "type", "Ljava/lang/String;");
jstring type = (jstring) env->GetObjectField(self, type_id);
const char *type_data = env->GetStringUTFChars(type, NULL);
const char *type_data = env->GetStringUTFChars(type, nullptr);
std::string type_str(type_data);
env->ReleaseStringUTFChars(type, type_data);

Expand All @@ -388,45 +393,45 @@ jbyteArray generate_secret(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteAr
native_timing_stop();
} catch (Botan::Exception & ex) {
throw_new(env, "java/security/GeneralSecurityException", ex.what());
return NULL;
return nullptr;
}
jbyteArray result = env->NewByteArray(derived.size());
jbyte *result_data = env->GetByteArrayElements(result, NULL);
jbyte *result_data = env->GetByteArrayElements(result, nullptr);
std::copy(derived.begin(), derived.end(), result_data);
env->ReleaseByteArrayElements(result, result_data, 0);

return result;
}

JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Botan_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params){
return generate_secret(env, self, pubkey, privkey, params, NULL);
return generate_secret(env, self, pubkey, privkey, params, nullptr);
}

JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Botan_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2Ljava_lang_String_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params, jstring algorithm) {
jbyteArray secret = generate_secret(env, self, pubkey, privkey, params, algorithm);
if (secret == NULL) {
return NULL;
if (secret == nullptr) {
return nullptr;
}
jmethodID spec_init = env->GetMethodID(secret_key_spec_class, "<init>", ("([BLjava/lang/String;)V"));
return env->NewObject(secret_key_spec_class, spec_init, secret, algorithm);
}

JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Botan_sign(JNIEnv *env, jobject self, jbyteArray data, jbyteArray privkey, jobject params){
if (!check_params(env, params)) {
throw_new(env, "java/lang/UnsupportedOperationException", "Not supported.");
return NULL;
throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
return nullptr;
}
Botan::EC_Group curve_group = group_from_params(env, params);

jclass botan_sig_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi$Botan");
jfieldID type_id = env->GetFieldID(botan_sig_class, "type", "Ljava/lang/String;");
jstring type = (jstring) env->GetObjectField(self, type_id);
const char *type_data = env->GetStringUTFChars(type, NULL);
const char *type_data = env->GetStringUTFChars(type, nullptr);
std::string type_str(type_data);
env->ReleaseStringUTFChars(type, type_data);

jsize privkey_length = env->GetArrayLength(privkey);
jbyte *privkey_bytes = env->GetByteArrayElements(privkey, NULL);
jbyte *privkey_bytes = env->GetByteArrayElements(privkey, nullptr);
Botan::BigInt privkey_scalar((uint8_t*) privkey_bytes, privkey_length);
env->ReleaseByteArrayElements(privkey, privkey_bytes, JNI_ABORT);

Expand Down Expand Up @@ -457,7 +462,7 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSig
Botan::PK_Signer signer(*skey, rng, emsa, Botan::DER_SEQUENCE);

jsize data_length = env->GetArrayLength(data);
jbyte *data_bytes = env->GetByteArrayElements(data, NULL);
jbyte *data_bytes = env->GetByteArrayElements(data, nullptr);
std::vector<uint8_t> sig;
try {
native_timing_start();
Expand All @@ -466,12 +471,12 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSig
} catch (Botan::Exception & ex) {
throw_new(env, "java/security/GeneralSecurityException", ex.what());
env->ReleaseByteArrayElements(data, data_bytes, JNI_ABORT);
return NULL;
return nullptr;
}
env->ReleaseByteArrayElements(data, data_bytes, JNI_ABORT);

jbyteArray result = env->NewByteArray(sig.size());
jbyte *result_data = env->GetByteArrayElements(result, NULL);
jbyte *result_data = env->GetByteArrayElements(result, nullptr);
std::copy(sig.begin(), sig.end(), result_data);
env->ReleaseByteArrayElements(result, result_data, 0);

Expand All @@ -480,20 +485,20 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSig

JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Botan_verify(JNIEnv *env, jobject self, jbyteArray signature, jbyteArray data, jbyteArray pubkey, jobject params){
if (!check_params(env, params)) {
throw_new(env, "java/lang/UnsupportedOperationException", "Not supported.");
throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
return JNI_FALSE;
}
Botan::EC_Group curve_group = group_from_params(env, params);

jclass botan_sig_class = env->FindClass("cz/crcs/ectester/standalone/libs/jni/NativeSignatureSpi$Botan");
jfieldID type_id = env->GetFieldID(botan_sig_class, "type", "Ljava/lang/String;");
jstring type = (jstring) env->GetObjectField(self, type_id);
const char *type_data = env->GetStringUTFChars(type, NULL);
const char *type_data = env->GetStringUTFChars(type, nullptr);
std::string type_str(type_data);
env->ReleaseStringUTFChars(type, type_data);

jsize pubkey_length = env->GetArrayLength(pubkey);
jbyte *pubkey_data = env->GetByteArrayElements(pubkey, NULL);
jbyte *pubkey_data = env->GetByteArrayElements(pubkey, nullptr);
Botan::PointGFp public_point = curve_group.OS2ECP((uint8_t*) pubkey_data, pubkey_length);
env->ReleaseByteArrayElements(pubkey, pubkey_data, JNI_ABORT);

Expand Down Expand Up @@ -525,8 +530,8 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna

jsize data_length = env->GetArrayLength(data);
jsize sig_length = env->GetArrayLength(signature);
jbyte *data_bytes = env->GetByteArrayElements(data, NULL);
jbyte *sig_bytes = env->GetByteArrayElements(signature, NULL);
jbyte *data_bytes = env->GetByteArrayElements(data, nullptr);
jbyte *sig_bytes = env->GetByteArrayElements(signature, nullptr);

bool result;
try {
Expand Down
Loading

0 comments on commit 63beedc

Please sign in to comment.