bool JNICALL Java_software_amazon_awssdk_crt_auth_signing_AwsSigningUtils_awsSigningUtilsVerifyEcdsaSignature()

in src/native/aws_signing.c [574:666]


bool JNICALL Java_software_amazon_awssdk_crt_auth_signing_AwsSigningUtils_awsSigningUtilsVerifyEcdsaSignature(
    JNIEnv *env,
    jclass jni_class,
    jobject java_http_request,
    jbyteArray java_marshalled_request,
    jstring java_expected_canonical_request,
    jobject java_signing_config,
    jbyteArray java_signature,
    jstring java_verifier_pub_x,
    jstring java_verifier_pub_y) {

    (void)jni_class;

    bool success = false;

    struct aws_string *expected_canonical_request = NULL;
    struct aws_byte_cursor signature_cursor;
    AWS_ZERO_STRUCT(signature_cursor);
    struct aws_string *pub_x = NULL;
    struct aws_string *pub_y = NULL;

    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) {
        goto done;
    }

    if (java_signature == NULL) {
        goto done;
    }

    signature_cursor = aws_jni_byte_cursor_from_jbyteArray_acquire(env, java_signature);
    if (signature_cursor.len == 0) {
        goto done;
    }

    jint jvmresult = (*env)->GetJavaVM(env, &callback_data->jvm);
    AWS_FATAL_ASSERT(jvmresult == 0);

    /* 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)) {
        goto done;
    }

    jobject java_http_request_body_stream =
        (*env)->GetObjectField(env, java_http_request, http_request_properties.body_stream_field_id);

    callback_data->native_request =
        aws_http_request_new_from_java_http_request(env, java_marshalled_request, java_http_request_body_stream);
    if (callback_data->native_request == NULL) {
        goto done;
    }

    callback_data->original_message_signable = aws_signable_new_http_request(allocator, callback_data->native_request);
    if (callback_data->original_message_signable == NULL) {
        goto done;
    }

    expected_canonical_request = aws_jni_new_string_from_jstring(env, java_expected_canonical_request);
    pub_x = aws_jni_new_string_from_jstring(env, java_verifier_pub_x);
    pub_y = aws_jni_new_string_from_jstring(env, java_verifier_pub_y);

    if (aws_verify_sigv4a_signing(
            allocator,
            callback_data->original_message_signable,
            (struct aws_signing_config_base *)&signing_config,
            aws_byte_cursor_from_string(expected_canonical_request),
            signature_cursor,
            aws_byte_cursor_from_string(pub_x),
            aws_byte_cursor_from_string(pub_y))) {
        aws_jni_throw_runtime_exception(env, aws_error_str(aws_last_error()));
        goto done;
    }

    success = true;

done:

    s_cleanup_callback_data(callback_data);

    aws_string_destroy(expected_canonical_request);
    if (signature_cursor.len > 0) {
        aws_jni_byte_cursor_from_jbyteArray_release(env, java_signature, signature_cursor);
    }
    aws_string_destroy(pub_x);
    aws_string_destroy(pub_y);

    return success;
}