in src/native/aws_signing.c [430:504]
void JNICALL Java_software_amazon_awssdk_crt_auth_signing_AwsSigner_awsSignerSignChunk(
JNIEnv *env,
jclass jni_class,
jobject java_chunk_body_stream,
jbyteArray java_previous_signature,
jobject java_signing_config,
jobject java_signing_result_future) {
(void)jni_class;
(void)env;
struct aws_allocator *allocator = aws_jni_get_allocator();
struct s_aws_sign_request_callback_data *callback_data =
aws_mem_calloc(allocator, 1, sizeof(struct s_aws_sign_request_callback_data));
if (callback_data == NULL) {
aws_jni_throw_runtime_exception(env, "Failed to allocate chunk signing callback data");
return;
}
jint jvmresult = (*env)->GetJavaVM(env, &callback_data->jvm);
AWS_FATAL_ASSERT(jvmresult == 0);
callback_data->java_signing_result_future = (*env)->NewGlobalRef(env, java_signing_result_future);
AWS_FATAL_ASSERT(callback_data->java_signing_result_future != NULL);
if (java_chunk_body_stream != NULL) {
callback_data->java_original_chunk_body = (*env)->NewGlobalRef(env, java_chunk_body_stream);
AWS_FATAL_ASSERT(callback_data->java_original_chunk_body != NULL);
callback_data->chunk_body_stream = aws_input_stream_new_from_java_http_request_body_stream(
aws_jni_get_allocator(), env, java_chunk_body_stream);
if (callback_data->chunk_body_stream == NULL) {
aws_jni_throw_runtime_exception(env, "Error building chunk body stream");
goto on_error;
}
}
/* Build a native aws_signing_config_aws object */
struct aws_signing_config_aws signing_config;
AWS_ZERO_STRUCT(signing_config);
if (s_build_signing_config(env, callback_data, java_signing_config, &signing_config)) {
aws_jni_throw_runtime_exception(env, "Failed to create signing configuration");
goto on_error;
}
callback_data->java_previous_signature = (*env)->NewGlobalRef(env, java_previous_signature);
callback_data->previous_signature = aws_jni_byte_cursor_from_jbyteArray_acquire(env, java_previous_signature);
callback_data->original_message_signable =
aws_signable_new_chunk(allocator, callback_data->chunk_body_stream, callback_data->previous_signature);
if (callback_data->original_message_signable == NULL) {
aws_jni_throw_runtime_exception(env, "Failed to create signable from chunk data");
goto on_error;
}
/* Sign the native request */
if (aws_sign_request_aws(
allocator,
callback_data->original_message_signable,
(struct aws_signing_config_base *)&signing_config,
s_aws_chunk_signing_complete,
callback_data)) {
aws_jni_throw_runtime_exception(env, "Failed to initiate signing process for Chunk");
goto on_error;
}
return;
on_error:
s_cleanup_callback_data(callback_data);
(*env)->ExceptionClear(env);
}