enclave_calling_stub_result enclave_calling_entry()

in sdk/host/src/main/native/cpp/platform/tee_sdk_svm/jni/jni_tee_sdk_svm.c [62:99]


enclave_calling_stub_result enclave_calling_entry(JNIEnv *env, jlong enclave_handler, jlong isolate_handler, jbyteArray payload, enclave_calling_stub stub) {
    jbyte *payload_copy = (*env)->GetByteArrayElements(env, payload, NULL);
    int payload_copy_length = (*env)->GetArrayLength(env, payload);

    enc_data_t input;
    input.data = (char*)payload_copy;
    input.data_len = payload_copy_length;
    enc_data_t output;
    output.data = NULL;
    output.data_len = 0x0;

    jbyteArray invocation_result_array;
    enclave_calling_stub_result result_wrapper;
    result_wrapper.ret = 0;
    result_wrapper.result = invocation_result_array;

    stub(enclave_handler, &result_wrapper.ret, (graal_isolate_t*)isolate_handler, (void*)(input.data), (size_t)(input.data_len), (void*)(&(output.data)), (size_t*)(&(output.data_len)));
    if (result_wrapper.ret != 0) {
        (*env)->ReleaseByteArrayElements(env, payload, payload_copy, 0);
        // free buffer malloc in native image by callback mechanism.
        free(output.data);
        return result_wrapper;
    }

    // create a byte array.
    invocation_result_array = (*env)->NewByteArray(env, output.data_len);
    jbyte *invocation_result_array_ptr = (*env)->GetByteArrayElements(env, invocation_result_array, NULL);
    memcpy(invocation_result_array_ptr, output.data, (size_t)output.data_len);

    (*env)->ReleaseByteArrayElements(env, payload, payload_copy, 0);
    // free buffer malloc in jni.
    (*env)->ReleaseByteArrayElements(env, invocation_result_array, invocation_result_array_ptr, 0);
    // free buffer malloc in native image by callback mechanism.
    free(output.data);

    result_wrapper.result = invocation_result_array;
    return result_wrapper;
}