diff options
Diffstat (limited to 'src/cz/crcs/ectester/standalone/libs/jni/tomcrypt.c')
| -rw-r--r-- | src/cz/crcs/ectester/standalone/libs/jni/tomcrypt.c | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/tomcrypt.c b/src/cz/crcs/ectester/standalone/libs/jni/tomcrypt.c index 29ee707..d609a48 100644 --- a/src/cz/crcs/ectester/standalone/libs/jni/tomcrypt.c +++ b/src/cz/crcs/ectester/standalone/libs/jni/tomcrypt.c @@ -128,6 +128,7 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPa } curve++; } + (*env)->ReleaseStringUTFChars(env, name, utf_name); return JNI_FALSE; } else { return JNI_FALSE; @@ -229,6 +230,17 @@ static ltc_ecc_set_type* create_curve(JNIEnv *env, jobject params) { return curve; } +static void free_curve(ltc_ecc_set_type *curve) { + if (curve) { + free((void*)curve->prime); + free((void*)curve->B); + free((void*)curve->order); + free((void*)curve->Gx); + free((void*)curve->Gy); + free(curve); + } +} + static jobject generate_from_curve(JNIEnv *env, const ltc_ecc_set_type *curve) { ecc_key key; int err; @@ -240,7 +252,7 @@ static jobject generate_from_curve(JNIEnv *env, const ltc_ecc_set_type *curve) { jbyteArray pub_bytes = (*env)->NewByteArray(env, key_len); jbyte *key_pub = (*env)->GetByteArrayElements(env, pub_bytes, NULL); ecc_ansi_x963_export(&key, key_pub, &key_len); - (*env)->ReleaseByteArrayElements(env, pub_bytes, key_pub, JNI_COMMIT); + (*env)->ReleaseByteArrayElements(env, pub_bytes, key_pub, 0); jobject ec_param_spec = create_ec_param_spec(env, curve); @@ -251,7 +263,7 @@ static jobject generate_from_curve(JNIEnv *env, const ltc_ecc_set_type *curve) { jbyteArray priv_bytes = (*env)->NewByteArray(env, curve->size); jbyte *key_priv = (*env)->GetByteArrayElements(env, priv_bytes, NULL); ltc_mp.unsigned_write(key.k, key_priv); - (*env)->ReleaseByteArrayElements(env, priv_bytes, key_priv, JNI_COMMIT); + (*env)->ReleaseByteArrayElements(env, priv_bytes, key_priv, 0); jobject ec_priv_param_spec = (*env)->NewLocalRef(env, ec_param_spec); jmethodID ec_priv_init = (*env)->GetMethodID(env, privkey_class, "<init>", "([BLjava/security/spec/ECParameterSpec;)V"); @@ -286,7 +298,7 @@ JNIEXPORT jobject JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKeyPai if ((*env)->IsInstanceOf(env, params, ec_parameter_spec_class)) { ltc_ecc_set_type *curve = create_curve(env, params); jobject result = generate_from_curve(env, curve); - free(curve); + free_curve(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;"); @@ -356,13 +368,13 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKey ecc_key pub; if (!pubkey_from_bytes(env, pubkey, curve, &pub)) { - free(curve); + free_curve(curve); return NULL; } ecc_key priv; if (!privkey_from_bytes(env, privkey, curve, &priv)) { - free(curve); + free_curve(curve); return NULL; } @@ -371,17 +383,17 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeKey int err; if ((err = ecc_shared_secret(&priv, &pub, result, &output_len)) != CRYPT_OK) { throw_new(env, "java/security/GeneralSecurityException", error_to_string(err)); - free(curve); + free_curve(curve); return NULL; } jbyteArray output = (*env)->NewByteArray(env, curve->size); jbyte *output_data = (*env)->GetByteArrayElements(env, output, NULL); memcpy(output_data, result, curve->size); - (*env)->ReleaseByteArrayElements(env, output, output_data, JNI_COMMIT); + (*env)->ReleaseByteArrayElements(env, output, output_data, 0); ltc_cleanup_multi(&pub.pubkey.x, &pub.pubkey.y, &pub.pubkey.z, &priv.k, NULL); - free(curve); + free_curve(curve); return output; } @@ -390,7 +402,7 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSig ecc_key priv; if (!privkey_from_bytes(env, privkey, curve, &priv)) { - free(curve); + free_curve(curve); return NULL; } @@ -402,7 +414,7 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSig int err; if ((err = ecc_sign_hash(data_data, data_size, result, &output_len, <c_prng, find_prng("yarrow"), &priv)) != CRYPT_OK) { throw_new(env, "java/security/GeneralSecurityException", error_to_string(err)); - free(curve); + free_curve(curve); (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); return NULL; } @@ -412,9 +424,9 @@ JNIEXPORT jbyteArray JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSig jbyteArray output = (*env)->NewByteArray(env, output_len); jbyte *output_data = (*env)->GetByteArrayElements(env, output, NULL); memcpy(output_data, result, output_len); - (*env)->ReleaseByteArrayElements(env, output, output_data, JNI_COMMIT); + (*env)->ReleaseByteArrayElements(env, output, output_data, 0); - free(curve); + free_curve(curve); return output; } @@ -423,7 +435,7 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna ecc_key pub; if (!pubkey_from_bytes(env, pubkey, curve, &pub)) { - free(curve); + free_curve(curve); return JNI_FALSE; } @@ -437,7 +449,7 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna int result; if ((err = ecc_verify_hash(sig_data, sig_size, data_data, data_size, &result, &pub)) != CRYPT_OK) { throw_new(env, "java/security/GeneralSecurityException", error_to_string(err)); - free(curve); + free_curve(curve); (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); (*env)->ReleaseByteArrayElements(env, signature, sig_data, JNI_ABORT); return JNI_FALSE; @@ -445,6 +457,6 @@ JNIEXPORT jboolean JNICALL Java_cz_crcs_ectester_standalone_libs_jni_NativeSigna (*env)->ReleaseByteArrayElements(env, data, data_data, JNI_ABORT); (*env)->ReleaseByteArrayElements(env, signature, sig_data, JNI_ABORT); - free(curve); + free_curve(curve); return result; }
\ No newline at end of file |
