aboutsummaryrefslogtreecommitdiff
path: root/standalone/src
diff options
context:
space:
mode:
Diffstat (limited to 'standalone/src')
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/boringssl.c58
-rw-r--r--standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/libressl.c49
2 files changed, 86 insertions, 21 deletions
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/boringssl.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/boringssl.c
index 6878549..919cc79 100644
--- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/boringssl.c
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/boringssl.c
@@ -397,11 +397,20 @@ EC_KEY *barray_to_pubkey(JNIEnv *env, const EC_GROUP *curve, jbyteArray pub) {
jsize pub_len = (*env)->GetArrayLength(env, pub);
jbyte *pub_data = (*env)->GetByteArrayElements(env, pub, NULL);
EC_POINT *pub_point = EC_POINT_new(curve);
- EC_POINT_oct2point(curve, pub_point, (unsigned char *) pub_data, pub_len, NULL);
- (*env)->ReleaseByteArrayElements(env, pub, pub_data, JNI_ABORT);
- EC_KEY_set_public_key(result, pub_point);
- EC_POINT_free(pub_point);
- return result;
+ int retval = EC_POINT_oct2point(curve, pub_point, (unsigned char *) pub_data, pub_len, NULL);
+ (*env)->ReleaseByteArrayElements(env, pub, pub_data, JNI_ABORT);
+ if (!retval) {
+ EC_POINT_free(pub_point);
+ throw_new(env, "java/security/GeneralSecurityException", "Error loading key, EC_POINT_oct2point.");
+ return NULL;
+ }
+ retval = EC_KEY_set_public_key(result, pub_point);
+ EC_POINT_free(pub_point);
+ if (!retval) {
+ throw_new(env, "java/security/GeneralSecurityException", "Error loading key, EC_KEY_set_public_key.");
+ return NULL;
+ }
+ return result;
}
EC_KEY *barray_to_privkey(JNIEnv *env, const EC_GROUP *curve, jbyteArray priv) {
@@ -411,27 +420,38 @@ EC_KEY *barray_to_privkey(JNIEnv *env, const EC_GROUP *curve, jbyteArray priv)
jbyte *priv_data = (*env)->GetByteArrayElements(env, priv, NULL);
BIGNUM *s = BN_bin2bn((unsigned char *) priv_data, priv_len, NULL);
(*env)->ReleaseByteArrayElements(env, priv, priv_data, JNI_ABORT);
- EC_KEY_set_private_key(result, s);
+ int retval = EC_KEY_set_private_key(result, s);
BN_free(s);
+ if (!retval) {
+ throw_new(env, "java/security/GeneralSecurityException", "Error loading key, EC_KEY_set_private_key.");
+ return NULL;
+ }
return result;
}
JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Boringssl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params) {
+ jbyteArray result = NULL;
EC_GROUP *curve = create_curve(env, params);
if (!curve) {
throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
- return NULL;
+ goto free_curve;
}
EC_KEY *pub = barray_to_pubkey(env, curve, pubkey);
+ if (!pub) {
+ goto free_pub;
+ }
EC_KEY *priv = barray_to_privkey(env, curve, privkey);
+ if (!priv) {
+ goto free_priv;
+ }
int field_size = EC_GROUP_get_degree(curve);
size_t secret_len = (field_size + 7)/8;
//TODO: Do more KeyAgreements here, but will have to do the hash-fun manually,
// probably using the ECDH_KDF_X9_62 by wrapping it and dynamically choosing the EVP_MD. from the type string.
- jbyteArray result = (*env)->NewByteArray(env, secret_len);
+ result = (*env)->NewByteArray(env, secret_len);
jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL);
int err = 0;
@@ -449,8 +469,11 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKey
}
(*env)->ReleaseByteArrayElements(env, result, result_data, 0);
- EC_KEY_free(pub);
+free_priv:
EC_KEY_free(priv);
+free_pub:
+ EC_KEY_free(pub);
+free_curve:
EC_GROUP_free(curve);
return result;
}
@@ -461,13 +484,17 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgr
}
JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Boringssl_sign(JNIEnv *env, jobject self, jbyteArray data, jbyteArray privkey, jobject params) {
+ jbyteArray result = NULL;
EC_GROUP *curve = create_curve(env, params);
if (!curve) {
throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
- return NULL;
+ goto free_curve;
}
EC_KEY *priv = barray_to_privkey(env, curve, privkey);
+ if (!priv) {
+ goto free_priv;
+ }
jsize data_size = (*env)->GetArrayLength(env, data);
jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL);
@@ -483,19 +510,20 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSig
(*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT);
if (!signature) {
throw_new(env, "java/security/GeneralSecurityException", "Error signing, ECDSA_do_sign.");
- EC_KEY_free(priv); EC_GROUP_free(curve);
- return NULL;
+ goto free_priv;
}
jsize sig_len = i2d_ECDSA_SIG(signature, NULL);
- jbyteArray result = (*env)->NewByteArray(env, sig_len);
+ result = (*env)->NewByteArray(env, sig_len);
jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL);
jbyte *result_data_ptr = result_data;
i2d_ECDSA_SIG(signature, (unsigned char **)&result_data_ptr);
(*env)->ReleaseByteArrayElements(env, result, result_data, 0);
ECDSA_SIG_free(signature);
+free_priv:
EC_KEY_free(priv);
+free_curve:
EC_GROUP_free(curve);
return result;
}
@@ -508,6 +536,10 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna
}
EC_KEY *pub = barray_to_pubkey(env, curve, pubkey);
+ if (!pub) {
+ EC_GROUP_free(curve);
+ return JNI_FALSE;
+ }
jsize sig_len = (*env)->GetArrayLength(env, signature);
jbyte *sig_data = (*env)->GetByteArrayElements(env, signature, NULL);
diff --git a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/libressl.c b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/libressl.c
index 7d50836..d329f45 100644
--- a/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/libressl.c
+++ b/standalone/src/main/resources/cz/crcs/ectester/standalone/libs/jni/libressl.c
@@ -420,10 +420,19 @@ EC_KEY *barray_to_pubkey(JNIEnv *env, const EC_GROUP *curve, jbyteArray pub) {
jsize pub_len = (*env)->GetArrayLength(env, pub);
jbyte *pub_data = (*env)->GetByteArrayElements(env, pub, NULL);
EC_POINT *pub_point = EC_POINT_new(curve);
- EC_POINT_oct2point(curve, pub_point, (unsigned char *) pub_data, pub_len, NULL);
+ int retval = EC_POINT_oct2point(curve, pub_point, (unsigned char *) pub_data, pub_len, NULL);
(*env)->ReleaseByteArrayElements(env, pub, pub_data, JNI_ABORT);
- EC_KEY_set_public_key(result, pub_point);
+ if (!retval) {
+ EC_POINT_free(pub_point);
+ throw_new(env, "java/security/GeneralSecurityException", "Error loading key, EC_POINT_oct2point.");
+ return NULL;
+ }
+ retval = EC_KEY_set_public_key(result, pub_point);
EC_POINT_free(pub_point);
+ if (!retval) {
+ throw_new(env, "java/security/GeneralSecurityException", "Error loading key, EC_KEY_set_public_key.");
+ return NULL;
+ }
return result;
}
@@ -434,27 +443,38 @@ EC_KEY *barray_to_privkey(JNIEnv *env, const EC_GROUP *curve, jbyteArray priv)
jbyte *priv_data = (*env)->GetByteArrayElements(env, priv, NULL);
BIGNUM *s = BN_bin2bn((unsigned char *) priv_data, priv_len, NULL);
(*env)->ReleaseByteArrayElements(env, priv, priv_data, JNI_ABORT);
- EC_KEY_set_private_key(result, s);
+ int retval = EC_KEY_set_private_key(result, s);
BN_free(s);
+ if (!retval) {
+ throw_new(env, "java/security/GeneralSecurityException", "Error loading key, EC_KEY_set_private_key.");
+ return NULL;
+ }
return result;
}
JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgreementSpi_00024Libressl_generateSecret___3B_3BLjava_security_spec_ECParameterSpec_2(JNIEnv *env, jobject self, jbyteArray pubkey, jbyteArray privkey, jobject params) {
+ jbyteArray result = NULL;
EC_GROUP *curve = create_curve(env, params);
if (!curve) {
throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
- return NULL;
+ goto free_curve;
}
EC_KEY *pub = barray_to_pubkey(env, curve, pubkey);
+ if (!pub) {
+ goto free_pub;
+ }
EC_KEY *priv = barray_to_privkey(env, curve, privkey);
+ if (!priv) {
+ goto free_priv;
+ }
int field_size = EC_GROUP_get_degree(curve);
size_t secret_len = (field_size + 7)/8;
//TODO: Do more KeyAgreements here, but will have to do the hash-fun manually,
// probably using the ECDH_KDF_X9_62 by wrapping it and dynamically choosing the EVP_MD. from the type string.
- jbyteArray result = (*env)->NewByteArray(env, secret_len);
+ result = (*env)->NewByteArray(env, secret_len);
jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL);
int err;
@@ -472,8 +492,11 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKey
}
(*env)->ReleaseByteArrayElements(env, result, result_data, 0);
- EC_KEY_free(pub);
+free_priv:
EC_KEY_free(priv);
+free_pub:
+ EC_KEY_free(pub);
+free_curve:
EC_GROUP_free(curve);
return result;
}
@@ -484,13 +507,17 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyAgr
}
JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSignatureSpi_00024Libressl_sign(JNIEnv *env, jobject self, jbyteArray data, jbyteArray privkey, jobject params) {
+ jbyteArray result = NULL;
EC_GROUP *curve = create_curve(env, params);
if (!curve) {
throw_new(env, "java/security/InvalidAlgorithmParameterException", "Curve not found.");
- return NULL;
+ goto free_curve;
}
EC_KEY *priv = barray_to_privkey(env, curve, privkey);
+ if (!priv) {
+ goto free_priv;
+ }
jsize data_size = (*env)->GetArrayLength(env, data);
jbyte *data_data = (*env)->GetByteArrayElements(env, data, NULL);
@@ -511,14 +538,16 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSig
}
jsize sig_len = i2d_ECDSA_SIG(signature, NULL);
- jbyteArray result = (*env)->NewByteArray(env, sig_len);
+ result = (*env)->NewByteArray(env, sig_len);
jbyte *result_data = (*env)->GetByteArrayElements(env, result, NULL);
jbyte *result_data_ptr = result_data;
i2d_ECDSA_SIG(signature, (unsigned char **)&result_data_ptr);
(*env)->ReleaseByteArrayElements(env, result, result_data, 0);
ECDSA_SIG_free(signature);
+free_priv:
EC_KEY_free(priv);
+free_curve:
EC_GROUP_free(curve);
return result;
}
@@ -531,6 +560,10 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna
}
EC_KEY *pub = barray_to_pubkey(env, curve, pubkey);
+ if (!pub) {
+ EC_GROUP_free(curve);
+ return JNI_FALSE;
+ }
jsize sig_len = (*env)->GetArrayLength(env, signature);
jbyte *sig_data = (*env)->GetByteArrayElements(env, signature, NULL);