xref: /aosp_15_r20/external/aws-crt-java/src/native/aws_signing.c (revision 3c7ae9de214676c52d19f01067dc1a404272dc11)
1*3c7ae9deSAndroid Build Coastguard Worker /**
2*3c7ae9deSAndroid Build Coastguard Worker  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3*3c7ae9deSAndroid Build Coastguard Worker  * SPDX-License-Identifier: Apache-2.0.
4*3c7ae9deSAndroid Build Coastguard Worker  */
5*3c7ae9deSAndroid Build Coastguard Worker 
6*3c7ae9deSAndroid Build Coastguard Worker #include "crt.h"
7*3c7ae9deSAndroid Build Coastguard Worker 
8*3c7ae9deSAndroid Build Coastguard Worker #include "aws_signing.h"
9*3c7ae9deSAndroid Build Coastguard Worker #include "credentials.h"
10*3c7ae9deSAndroid Build Coastguard Worker #include "http_request_utils.h"
11*3c7ae9deSAndroid Build Coastguard Worker #include "java_class_ids.h"
12*3c7ae9deSAndroid Build Coastguard Worker 
13*3c7ae9deSAndroid Build Coastguard Worker #include <jni.h>
14*3c7ae9deSAndroid Build Coastguard Worker #include <string.h>
15*3c7ae9deSAndroid Build Coastguard Worker 
16*3c7ae9deSAndroid Build Coastguard Worker #include <aws/auth/credentials.h>
17*3c7ae9deSAndroid Build Coastguard Worker #include <aws/auth/signable.h>
18*3c7ae9deSAndroid Build Coastguard Worker #include <aws/auth/signing.h>
19*3c7ae9deSAndroid Build Coastguard Worker #include <aws/auth/signing_result.h>
20*3c7ae9deSAndroid Build Coastguard Worker #include <aws/cal/ecc.h>
21*3c7ae9deSAndroid Build Coastguard Worker #include <aws/common/string.h>
22*3c7ae9deSAndroid Build Coastguard Worker #include <aws/http/request_response.h>
23*3c7ae9deSAndroid Build Coastguard Worker #include <aws/io/stream.h>
24*3c7ae9deSAndroid Build Coastguard Worker 
25*3c7ae9deSAndroid Build Coastguard Worker /* on 32-bit platforms, casting pointers to longs throws a warning we don't need */
26*3c7ae9deSAndroid Build Coastguard Worker #if UINTPTR_MAX == 0xffffffff
27*3c7ae9deSAndroid Build Coastguard Worker #    if defined(_MSC_VER)
28*3c7ae9deSAndroid Build Coastguard Worker #        pragma warning(push)
29*3c7ae9deSAndroid Build Coastguard Worker #        pragma warning(disable : 4305) /* 'type cast': truncation from 'jlong' to 'jni_tls_ctx_options *' */
30*3c7ae9deSAndroid Build Coastguard Worker #    else
31*3c7ae9deSAndroid Build Coastguard Worker #        pragma GCC diagnostic push
32*3c7ae9deSAndroid Build Coastguard Worker #        pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
33*3c7ae9deSAndroid Build Coastguard Worker #        pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
34*3c7ae9deSAndroid Build Coastguard Worker #    endif
35*3c7ae9deSAndroid Build Coastguard Worker #endif
36*3c7ae9deSAndroid Build Coastguard Worker 
37*3c7ae9deSAndroid Build Coastguard Worker struct s_aws_sign_request_callback_data {
38*3c7ae9deSAndroid Build Coastguard Worker     JavaVM *jvm;
39*3c7ae9deSAndroid Build Coastguard Worker     jobject java_signing_result_future;
40*3c7ae9deSAndroid Build Coastguard Worker     jobject java_original_request;
41*3c7ae9deSAndroid Build Coastguard Worker     jobject java_original_chunk_body;
42*3c7ae9deSAndroid Build Coastguard Worker     jbyteArray java_previous_signature;
43*3c7ae9deSAndroid Build Coastguard Worker     struct aws_http_headers *trailing_headers;
44*3c7ae9deSAndroid Build Coastguard Worker     struct aws_input_stream *chunk_body_stream;
45*3c7ae9deSAndroid Build Coastguard Worker     struct aws_http_message *native_request;
46*3c7ae9deSAndroid Build Coastguard Worker     struct aws_signable *original_message_signable;
47*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor previous_signature;
48*3c7ae9deSAndroid Build Coastguard Worker 
49*3c7ae9deSAndroid Build Coastguard Worker     struct aws_signing_config_data signing_config_data;
50*3c7ae9deSAndroid Build Coastguard Worker };
51*3c7ae9deSAndroid Build Coastguard Worker 
aws_signing_config_data_clean_up(struct aws_signing_config_data * data,JNIEnv * env)52*3c7ae9deSAndroid Build Coastguard Worker void aws_signing_config_data_clean_up(struct aws_signing_config_data *data, JNIEnv *env) {
53*3c7ae9deSAndroid Build Coastguard Worker 
54*3c7ae9deSAndroid Build Coastguard Worker     aws_string_destroy(data->region);
55*3c7ae9deSAndroid Build Coastguard Worker     aws_string_destroy(data->service);
56*3c7ae9deSAndroid Build Coastguard Worker     aws_string_destroy(data->signed_body_value);
57*3c7ae9deSAndroid Build Coastguard Worker 
58*3c7ae9deSAndroid Build Coastguard Worker     if (data->java_sign_header_predicate) {
59*3c7ae9deSAndroid Build Coastguard Worker         (*env)->DeleteGlobalRef(env, data->java_sign_header_predicate);
60*3c7ae9deSAndroid Build Coastguard Worker     }
61*3c7ae9deSAndroid Build Coastguard Worker     if (data->java_credentials_provider) {
62*3c7ae9deSAndroid Build Coastguard Worker         (*env)->DeleteGlobalRef(env, data->java_credentials_provider);
63*3c7ae9deSAndroid Build Coastguard Worker     }
64*3c7ae9deSAndroid Build Coastguard Worker     aws_credentials_release(data->credentials);
65*3c7ae9deSAndroid Build Coastguard Worker }
66*3c7ae9deSAndroid Build Coastguard Worker 
s_cleanup_callback_data(struct s_aws_sign_request_callback_data * callback_data,JNIEnv * env)67*3c7ae9deSAndroid Build Coastguard Worker static void s_cleanup_callback_data(struct s_aws_sign_request_callback_data *callback_data, JNIEnv *env) {
68*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data == NULL || env == NULL) {
69*3c7ae9deSAndroid Build Coastguard Worker         return;
70*3c7ae9deSAndroid Build Coastguard Worker     }
71*3c7ae9deSAndroid Build Coastguard Worker 
72*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data->java_signing_result_future != NULL) {
73*3c7ae9deSAndroid Build Coastguard Worker         (*env)->DeleteGlobalRef(env, callback_data->java_signing_result_future);
74*3c7ae9deSAndroid Build Coastguard Worker     }
75*3c7ae9deSAndroid Build Coastguard Worker 
76*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data->java_original_request != NULL) {
77*3c7ae9deSAndroid Build Coastguard Worker         (*env)->DeleteGlobalRef(env, callback_data->java_original_request);
78*3c7ae9deSAndroid Build Coastguard Worker     }
79*3c7ae9deSAndroid Build Coastguard Worker 
80*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data->java_original_chunk_body != NULL) {
81*3c7ae9deSAndroid Build Coastguard Worker         (*env)->DeleteGlobalRef(env, callback_data->java_original_chunk_body);
82*3c7ae9deSAndroid Build Coastguard Worker     }
83*3c7ae9deSAndroid Build Coastguard Worker 
84*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data->native_request) {
85*3c7ae9deSAndroid Build Coastguard Worker         aws_http_message_release(callback_data->native_request);
86*3c7ae9deSAndroid Build Coastguard Worker     }
87*3c7ae9deSAndroid Build Coastguard Worker 
88*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data->original_message_signable) {
89*3c7ae9deSAndroid Build Coastguard Worker         aws_signable_destroy(callback_data->original_message_signable);
90*3c7ae9deSAndroid Build Coastguard Worker     }
91*3c7ae9deSAndroid Build Coastguard Worker 
92*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data->chunk_body_stream != NULL) {
93*3c7ae9deSAndroid Build Coastguard Worker         aws_input_stream_destroy(callback_data->chunk_body_stream);
94*3c7ae9deSAndroid Build Coastguard Worker     }
95*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data->trailing_headers != NULL) {
96*3c7ae9deSAndroid Build Coastguard Worker         aws_http_headers_release(callback_data->trailing_headers);
97*3c7ae9deSAndroid Build Coastguard Worker     }
98*3c7ae9deSAndroid Build Coastguard Worker 
99*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data->previous_signature.len > 0 && callback_data->java_previous_signature != NULL) {
100*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_byte_cursor_from_jbyteArray_release(
101*3c7ae9deSAndroid Build Coastguard Worker             env, callback_data->java_previous_signature, callback_data->previous_signature);
102*3c7ae9deSAndroid Build Coastguard Worker     }
103*3c7ae9deSAndroid Build Coastguard Worker 
104*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data->java_previous_signature != NULL) {
105*3c7ae9deSAndroid Build Coastguard Worker         (*env)->DeleteGlobalRef(env, callback_data->java_previous_signature);
106*3c7ae9deSAndroid Build Coastguard Worker     }
107*3c7ae9deSAndroid Build Coastguard Worker 
108*3c7ae9deSAndroid Build Coastguard Worker     aws_signing_config_data_clean_up(&callback_data->signing_config_data, env);
109*3c7ae9deSAndroid Build Coastguard Worker 
110*3c7ae9deSAndroid Build Coastguard Worker     aws_mem_release(aws_jni_get_allocator(), callback_data);
111*3c7ae9deSAndroid Build Coastguard Worker }
112*3c7ae9deSAndroid Build Coastguard Worker 
s_create_signed_java_http_request(JNIEnv * env,struct aws_http_message * native_request,jobject java_original_request)113*3c7ae9deSAndroid Build Coastguard Worker static jobject s_create_signed_java_http_request(
114*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
115*3c7ae9deSAndroid Build Coastguard Worker     struct aws_http_message *native_request,
116*3c7ae9deSAndroid Build Coastguard Worker     jobject java_original_request) {
117*3c7ae9deSAndroid Build Coastguard Worker     jobject jni_body_stream =
118*3c7ae9deSAndroid Build Coastguard Worker         (*env)->GetObjectField(env, java_original_request, http_request_properties.body_stream_field_id);
119*3c7ae9deSAndroid Build Coastguard Worker 
120*3c7ae9deSAndroid Build Coastguard Worker     jobject http_request = aws_java_http_request_from_native(env, native_request, jni_body_stream);
121*3c7ae9deSAndroid Build Coastguard Worker 
122*3c7ae9deSAndroid Build Coastguard Worker     if (jni_body_stream != NULL) {
123*3c7ae9deSAndroid Build Coastguard Worker         (*env)->DeleteLocalRef(env, jni_body_stream);
124*3c7ae9deSAndroid Build Coastguard Worker     }
125*3c7ae9deSAndroid Build Coastguard Worker 
126*3c7ae9deSAndroid Build Coastguard Worker     return http_request;
127*3c7ae9deSAndroid Build Coastguard Worker }
128*3c7ae9deSAndroid Build Coastguard Worker 
s_complete_signing_exceptionally(JNIEnv * env,struct s_aws_sign_request_callback_data * callback_data,int error_code)129*3c7ae9deSAndroid Build Coastguard Worker static void s_complete_signing_exceptionally(
130*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
131*3c7ae9deSAndroid Build Coastguard Worker     struct s_aws_sign_request_callback_data *callback_data,
132*3c7ae9deSAndroid Build Coastguard Worker     int error_code) {
133*3c7ae9deSAndroid Build Coastguard Worker 
134*3c7ae9deSAndroid Build Coastguard Worker     if (error_code == AWS_ERROR_SUCCESS) {
135*3c7ae9deSAndroid Build Coastguard Worker         error_code = AWS_ERROR_UNKNOWN;
136*3c7ae9deSAndroid Build Coastguard Worker     }
137*3c7ae9deSAndroid Build Coastguard Worker 
138*3c7ae9deSAndroid Build Coastguard Worker     jobject crt_exception = aws_jni_new_crt_exception_from_error_code(env, error_code);
139*3c7ae9deSAndroid Build Coastguard Worker 
140*3c7ae9deSAndroid Build Coastguard Worker     (*env)->CallBooleanMethod(
141*3c7ae9deSAndroid Build Coastguard Worker         env,
142*3c7ae9deSAndroid Build Coastguard Worker         callback_data->java_signing_result_future,
143*3c7ae9deSAndroid Build Coastguard Worker         completable_future_properties.complete_exceptionally_method_id,
144*3c7ae9deSAndroid Build Coastguard Worker         crt_exception);
145*3c7ae9deSAndroid Build Coastguard Worker 
146*3c7ae9deSAndroid Build Coastguard Worker     aws_jni_check_and_clear_exception(env);
147*3c7ae9deSAndroid Build Coastguard Worker     (*env)->DeleteLocalRef(env, crt_exception);
148*3c7ae9deSAndroid Build Coastguard Worker }
149*3c7ae9deSAndroid Build Coastguard Worker 
s_aws_complete_signing_result(JNIEnv * env,struct aws_signing_result * result,struct s_aws_sign_request_callback_data * callback_data,jobject java_signed_request)150*3c7ae9deSAndroid Build Coastguard Worker static void s_aws_complete_signing_result(
151*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
152*3c7ae9deSAndroid Build Coastguard Worker     struct aws_signing_result *result,
153*3c7ae9deSAndroid Build Coastguard Worker     struct s_aws_sign_request_callback_data *callback_data,
154*3c7ae9deSAndroid Build Coastguard Worker     jobject java_signed_request) {
155*3c7ae9deSAndroid Build Coastguard Worker     jbyteArray java_signature = NULL;
156*3c7ae9deSAndroid Build Coastguard Worker     jobject java_signing_result = NULL;
157*3c7ae9deSAndroid Build Coastguard Worker 
158*3c7ae9deSAndroid Build Coastguard Worker     struct aws_string *signature = NULL;
159*3c7ae9deSAndroid Build Coastguard Worker     aws_signing_result_get_property(result, g_aws_signature_property_name, &signature);
160*3c7ae9deSAndroid Build Coastguard Worker 
161*3c7ae9deSAndroid Build Coastguard Worker     /* Anonymous requests don't have a signature because they are not signed. */
162*3c7ae9deSAndroid Build Coastguard Worker     if (signature != NULL) {
163*3c7ae9deSAndroid Build Coastguard Worker         struct aws_byte_cursor signature_cursor = aws_byte_cursor_from_string(signature);
164*3c7ae9deSAndroid Build Coastguard Worker         java_signature = aws_jni_byte_array_from_cursor(env, &signature_cursor);
165*3c7ae9deSAndroid Build Coastguard Worker     }
166*3c7ae9deSAndroid Build Coastguard Worker 
167*3c7ae9deSAndroid Build Coastguard Worker     java_signing_result = (*env)->NewObject(
168*3c7ae9deSAndroid Build Coastguard Worker         env, aws_signing_result_properties.aws_signing_result_class, aws_signing_result_properties.constructor);
169*3c7ae9deSAndroid Build Coastguard Worker     if ((*env)->ExceptionCheck(env) || java_signing_result == NULL) {
170*3c7ae9deSAndroid Build Coastguard Worker         s_complete_signing_exceptionally(env, callback_data, AWS_ERROR_UNKNOWN);
171*3c7ae9deSAndroid Build Coastguard Worker         goto done;
172*3c7ae9deSAndroid Build Coastguard Worker     }
173*3c7ae9deSAndroid Build Coastguard Worker 
174*3c7ae9deSAndroid Build Coastguard Worker     (*env)->SetObjectField(
175*3c7ae9deSAndroid Build Coastguard Worker         env, java_signing_result, aws_signing_result_properties.signed_request_field_id, java_signed_request);
176*3c7ae9deSAndroid Build Coastguard Worker     (*env)->SetObjectField(env, java_signing_result, aws_signing_result_properties.signature_field_id, java_signature);
177*3c7ae9deSAndroid Build Coastguard Worker 
178*3c7ae9deSAndroid Build Coastguard Worker     (*env)->CallBooleanMethod(
179*3c7ae9deSAndroid Build Coastguard Worker         env,
180*3c7ae9deSAndroid Build Coastguard Worker         callback_data->java_signing_result_future,
181*3c7ae9deSAndroid Build Coastguard Worker         completable_future_properties.complete_method_id,
182*3c7ae9deSAndroid Build Coastguard Worker         java_signing_result);
183*3c7ae9deSAndroid Build Coastguard Worker 
184*3c7ae9deSAndroid Build Coastguard Worker     /* I have no idea what we should do here... but the JVM really doesn't like us NOT calling this function after
185*3c7ae9deSAndroid Build Coastguard Worker        we cross the barrier. */
186*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(!aws_jni_check_and_clear_exception(env));
187*3c7ae9deSAndroid Build Coastguard Worker 
188*3c7ae9deSAndroid Build Coastguard Worker done:
189*3c7ae9deSAndroid Build Coastguard Worker 
190*3c7ae9deSAndroid Build Coastguard Worker     if (java_signature != NULL) {
191*3c7ae9deSAndroid Build Coastguard Worker         (*env)->DeleteLocalRef(env, java_signature);
192*3c7ae9deSAndroid Build Coastguard Worker     }
193*3c7ae9deSAndroid Build Coastguard Worker 
194*3c7ae9deSAndroid Build Coastguard Worker     if (java_signing_result != NULL) {
195*3c7ae9deSAndroid Build Coastguard Worker         (*env)->DeleteLocalRef(env, java_signing_result);
196*3c7ae9deSAndroid Build Coastguard Worker     }
197*3c7ae9deSAndroid Build Coastguard Worker 
198*3c7ae9deSAndroid Build Coastguard Worker     if (java_signed_request != NULL) {
199*3c7ae9deSAndroid Build Coastguard Worker         (*env)->DeleteLocalRef(env, java_signed_request);
200*3c7ae9deSAndroid Build Coastguard Worker     }
201*3c7ae9deSAndroid Build Coastguard Worker }
202*3c7ae9deSAndroid Build Coastguard Worker 
s_aws_request_signing_complete(struct aws_signing_result * result,int error_code,void * userdata)203*3c7ae9deSAndroid Build Coastguard Worker static void s_aws_request_signing_complete(struct aws_signing_result *result, int error_code, void *userdata) {
204*3c7ae9deSAndroid Build Coastguard Worker 
205*3c7ae9deSAndroid Build Coastguard Worker     struct s_aws_sign_request_callback_data *callback_data = userdata;
206*3c7ae9deSAndroid Build Coastguard Worker 
207*3c7ae9deSAndroid Build Coastguard Worker     /********** JNI ENV ACQUIRE **********/
208*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env = aws_jni_acquire_thread_env(callback_data->jvm);
209*3c7ae9deSAndroid Build Coastguard Worker     if (env == NULL) {
210*3c7ae9deSAndroid Build Coastguard Worker         /* If we can't get an environment, then the JVM is probably shutting down.  Don't crash. */
211*3c7ae9deSAndroid Build Coastguard Worker         return;
212*3c7ae9deSAndroid Build Coastguard Worker     }
213*3c7ae9deSAndroid Build Coastguard Worker 
214*3c7ae9deSAndroid Build Coastguard Worker     if (result == NULL || error_code != AWS_ERROR_SUCCESS) {
215*3c7ae9deSAndroid Build Coastguard Worker         s_complete_signing_exceptionally(env, callback_data, error_code);
216*3c7ae9deSAndroid Build Coastguard Worker         goto done;
217*3c7ae9deSAndroid Build Coastguard Worker     }
218*3c7ae9deSAndroid Build Coastguard Worker 
219*3c7ae9deSAndroid Build Coastguard Worker     if (aws_apply_signing_result_to_http_request(callback_data->native_request, aws_jni_get_allocator(), result)) {
220*3c7ae9deSAndroid Build Coastguard Worker         s_complete_signing_exceptionally(env, callback_data, aws_last_error());
221*3c7ae9deSAndroid Build Coastguard Worker         goto done;
222*3c7ae9deSAndroid Build Coastguard Worker     }
223*3c7ae9deSAndroid Build Coastguard Worker 
224*3c7ae9deSAndroid Build Coastguard Worker     jobject java_signed_request =
225*3c7ae9deSAndroid Build Coastguard Worker         s_create_signed_java_http_request(env, callback_data->native_request, callback_data->java_original_request);
226*3c7ae9deSAndroid Build Coastguard Worker     if (java_signed_request == NULL) {
227*3c7ae9deSAndroid Build Coastguard Worker         s_complete_signing_exceptionally(env, callback_data, aws_last_error());
228*3c7ae9deSAndroid Build Coastguard Worker         goto done;
229*3c7ae9deSAndroid Build Coastguard Worker     }
230*3c7ae9deSAndroid Build Coastguard Worker 
231*3c7ae9deSAndroid Build Coastguard Worker     s_aws_complete_signing_result(env, result, callback_data, java_signed_request);
232*3c7ae9deSAndroid Build Coastguard Worker 
233*3c7ae9deSAndroid Build Coastguard Worker done:;
234*3c7ae9deSAndroid Build Coastguard Worker 
235*3c7ae9deSAndroid Build Coastguard Worker     JavaVM *jvm = callback_data->jvm;
236*3c7ae9deSAndroid Build Coastguard Worker     s_cleanup_callback_data(callback_data, env);
237*3c7ae9deSAndroid Build Coastguard Worker 
238*3c7ae9deSAndroid Build Coastguard Worker     aws_jni_release_thread_env(jvm, env);
239*3c7ae9deSAndroid Build Coastguard Worker     /********** JNI ENV RELEASE **********/
240*3c7ae9deSAndroid Build Coastguard Worker }
241*3c7ae9deSAndroid Build Coastguard Worker 
s_aws_chunk_like_signing_complete(struct aws_signing_result * result,int error_code,void * userdata)242*3c7ae9deSAndroid Build Coastguard Worker static void s_aws_chunk_like_signing_complete(struct aws_signing_result *result, int error_code, void *userdata) {
243*3c7ae9deSAndroid Build Coastguard Worker 
244*3c7ae9deSAndroid Build Coastguard Worker     struct s_aws_sign_request_callback_data *callback_data = userdata;
245*3c7ae9deSAndroid Build Coastguard Worker 
246*3c7ae9deSAndroid Build Coastguard Worker     /********** JNI ENV ACQUIRE **********/
247*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env = aws_jni_acquire_thread_env(callback_data->jvm);
248*3c7ae9deSAndroid Build Coastguard Worker     if (env == NULL) {
249*3c7ae9deSAndroid Build Coastguard Worker         /* If we can't get an environment, then the JVM is probably shutting down.  Don't crash. */
250*3c7ae9deSAndroid Build Coastguard Worker         return;
251*3c7ae9deSAndroid Build Coastguard Worker     }
252*3c7ae9deSAndroid Build Coastguard Worker 
253*3c7ae9deSAndroid Build Coastguard Worker     if (result == NULL || error_code != AWS_ERROR_SUCCESS) {
254*3c7ae9deSAndroid Build Coastguard Worker         s_complete_signing_exceptionally(env, callback_data, error_code);
255*3c7ae9deSAndroid Build Coastguard Worker         goto done;
256*3c7ae9deSAndroid Build Coastguard Worker     }
257*3c7ae9deSAndroid Build Coastguard Worker 
258*3c7ae9deSAndroid Build Coastguard Worker     s_aws_complete_signing_result(env, result, callback_data, NULL);
259*3c7ae9deSAndroid Build Coastguard Worker 
260*3c7ae9deSAndroid Build Coastguard Worker done:;
261*3c7ae9deSAndroid Build Coastguard Worker 
262*3c7ae9deSAndroid Build Coastguard Worker     JavaVM *jvm = callback_data->jvm;
263*3c7ae9deSAndroid Build Coastguard Worker     s_cleanup_callback_data(callback_data, env);
264*3c7ae9deSAndroid Build Coastguard Worker 
265*3c7ae9deSAndroid Build Coastguard Worker     aws_jni_release_thread_env(jvm, env);
266*3c7ae9deSAndroid Build Coastguard Worker     /********** JNI ENV RELEASE **********/
267*3c7ae9deSAndroid Build Coastguard Worker }
268*3c7ae9deSAndroid Build Coastguard Worker 
s_aws_chunk_signing_complete(struct aws_signing_result * result,int error_code,void * userdata)269*3c7ae9deSAndroid Build Coastguard Worker static void s_aws_chunk_signing_complete(struct aws_signing_result *result, int error_code, void *userdata) {
270*3c7ae9deSAndroid Build Coastguard Worker     s_aws_chunk_like_signing_complete(result, error_code, userdata);
271*3c7ae9deSAndroid Build Coastguard Worker }
272*3c7ae9deSAndroid Build Coastguard Worker 
s_aws_trailing_headers_signing_complete(struct aws_signing_result * result,int error_code,void * userdata)273*3c7ae9deSAndroid Build Coastguard Worker static void s_aws_trailing_headers_signing_complete(struct aws_signing_result *result, int error_code, void *userdata) {
274*3c7ae9deSAndroid Build Coastguard Worker     s_aws_chunk_like_signing_complete(result, error_code, userdata);
275*3c7ae9deSAndroid Build Coastguard Worker }
276*3c7ae9deSAndroid Build Coastguard Worker 
s_should_sign_header(const struct aws_byte_cursor * name,void * user_data)277*3c7ae9deSAndroid Build Coastguard Worker static bool s_should_sign_header(const struct aws_byte_cursor *name, void *user_data) {
278*3c7ae9deSAndroid Build Coastguard Worker     struct aws_signing_config_data *callback_data = user_data;
279*3c7ae9deSAndroid Build Coastguard Worker 
280*3c7ae9deSAndroid Build Coastguard Worker     /********** JNI ENV ACQUIRE **********/
281*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env = aws_jni_acquire_thread_env(callback_data->jvm);
282*3c7ae9deSAndroid Build Coastguard Worker     if (env == NULL) {
283*3c7ae9deSAndroid Build Coastguard Worker         /* If we can't get an environment, then the JVM is probably shutting down.  Don't crash. */
284*3c7ae9deSAndroid Build Coastguard Worker         return false;
285*3c7ae9deSAndroid Build Coastguard Worker     }
286*3c7ae9deSAndroid Build Coastguard Worker 
287*3c7ae9deSAndroid Build Coastguard Worker     jstring header_name = aws_jni_string_from_cursor(env, name);
288*3c7ae9deSAndroid Build Coastguard Worker 
289*3c7ae9deSAndroid Build Coastguard Worker     bool result = (*env)->CallBooleanMethod(
290*3c7ae9deSAndroid Build Coastguard Worker         env, callback_data->java_sign_header_predicate, predicate_properties.test_method_id, (jobject)header_name);
291*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(!aws_jni_check_and_clear_exception(env));
292*3c7ae9deSAndroid Build Coastguard Worker 
293*3c7ae9deSAndroid Build Coastguard Worker     (*env)->DeleteLocalRef(env, header_name);
294*3c7ae9deSAndroid Build Coastguard Worker 
295*3c7ae9deSAndroid Build Coastguard Worker     aws_jni_release_thread_env(callback_data->jvm, env);
296*3c7ae9deSAndroid Build Coastguard Worker     /********** JNI ENV RELEASE **********/
297*3c7ae9deSAndroid Build Coastguard Worker 
298*3c7ae9deSAndroid Build Coastguard Worker     return result;
299*3c7ae9deSAndroid Build Coastguard Worker }
300*3c7ae9deSAndroid Build Coastguard Worker 
aws_build_signing_config(JNIEnv * env,jobject java_config,struct aws_signing_config_data * config_data,struct aws_signing_config_aws * config)301*3c7ae9deSAndroid Build Coastguard Worker int aws_build_signing_config(
302*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
303*3c7ae9deSAndroid Build Coastguard Worker     jobject java_config,
304*3c7ae9deSAndroid Build Coastguard Worker     struct aws_signing_config_data *config_data,
305*3c7ae9deSAndroid Build Coastguard Worker     struct aws_signing_config_aws *config) {
306*3c7ae9deSAndroid Build Coastguard Worker 
307*3c7ae9deSAndroid Build Coastguard Worker     jint jvmresult = (*env)->GetJavaVM(env, &config_data->jvm);
308*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(jvmresult == 0);
309*3c7ae9deSAndroid Build Coastguard Worker 
310*3c7ae9deSAndroid Build Coastguard Worker     config->config_type = AWS_SIGNING_CONFIG_AWS;
311*3c7ae9deSAndroid Build Coastguard Worker     config->algorithm = (enum aws_signing_algorithm)(*env)->GetIntField(
312*3c7ae9deSAndroid Build Coastguard Worker         env, java_config, aws_signing_config_properties.algorithm_field_id);
313*3c7ae9deSAndroid Build Coastguard Worker     config->signature_type = (enum aws_signature_type)(*env)->GetIntField(
314*3c7ae9deSAndroid Build Coastguard Worker         env, java_config, aws_signing_config_properties.signature_type_field_id);
315*3c7ae9deSAndroid Build Coastguard Worker 
316*3c7ae9deSAndroid Build Coastguard Worker     jstring region = (jstring)(*env)->GetObjectField(env, java_config, aws_signing_config_properties.region_field_id);
317*3c7ae9deSAndroid Build Coastguard Worker     if (region == NULL) {
318*3c7ae9deSAndroid Build Coastguard Worker         AWS_ZERO_STRUCT(config->region);
319*3c7ae9deSAndroid Build Coastguard Worker     } else {
320*3c7ae9deSAndroid Build Coastguard Worker         config_data->region = aws_jni_new_string_from_jstring(env, region);
321*3c7ae9deSAndroid Build Coastguard Worker         config->region = aws_byte_cursor_from_string(config_data->region);
322*3c7ae9deSAndroid Build Coastguard Worker     }
323*3c7ae9deSAndroid Build Coastguard Worker 
324*3c7ae9deSAndroid Build Coastguard Worker     jstring service = (jstring)(*env)->GetObjectField(env, java_config, aws_signing_config_properties.service_field_id);
325*3c7ae9deSAndroid Build Coastguard Worker     if (service == NULL) {
326*3c7ae9deSAndroid Build Coastguard Worker         AWS_ZERO_STRUCT(config->service);
327*3c7ae9deSAndroid Build Coastguard Worker     } else {
328*3c7ae9deSAndroid Build Coastguard Worker         config_data->service = aws_jni_new_string_from_jstring(env, service);
329*3c7ae9deSAndroid Build Coastguard Worker         config->service = aws_byte_cursor_from_string(config_data->service);
330*3c7ae9deSAndroid Build Coastguard Worker     }
331*3c7ae9deSAndroid Build Coastguard Worker 
332*3c7ae9deSAndroid Build Coastguard Worker     int64_t epoch_time_millis = (*env)->GetLongField(env, java_config, aws_signing_config_properties.time_field_id);
333*3c7ae9deSAndroid Build Coastguard Worker     aws_date_time_init_epoch_millis(&config->date, (uint64_t)epoch_time_millis);
334*3c7ae9deSAndroid Build Coastguard Worker 
335*3c7ae9deSAndroid Build Coastguard Worker     jobject sign_header_predicate =
336*3c7ae9deSAndroid Build Coastguard Worker         (*env)->GetObjectField(env, java_config, aws_signing_config_properties.should_sign_header_field_id);
337*3c7ae9deSAndroid Build Coastguard Worker     if (sign_header_predicate != NULL) {
338*3c7ae9deSAndroid Build Coastguard Worker         config_data->java_sign_header_predicate = (*env)->NewGlobalRef(env, sign_header_predicate);
339*3c7ae9deSAndroid Build Coastguard Worker         AWS_FATAL_ASSERT(config_data->java_sign_header_predicate != NULL);
340*3c7ae9deSAndroid Build Coastguard Worker 
341*3c7ae9deSAndroid Build Coastguard Worker         config->should_sign_header = s_should_sign_header;
342*3c7ae9deSAndroid Build Coastguard Worker         config->should_sign_header_ud = config_data;
343*3c7ae9deSAndroid Build Coastguard Worker     }
344*3c7ae9deSAndroid Build Coastguard Worker 
345*3c7ae9deSAndroid Build Coastguard Worker     config->flags.use_double_uri_encode =
346*3c7ae9deSAndroid Build Coastguard Worker         (*env)->GetBooleanField(env, java_config, aws_signing_config_properties.use_double_uri_encode_field_id);
347*3c7ae9deSAndroid Build Coastguard Worker     config->flags.should_normalize_uri_path =
348*3c7ae9deSAndroid Build Coastguard Worker         (*env)->GetBooleanField(env, java_config, aws_signing_config_properties.should_normalize_uri_path_field_id);
349*3c7ae9deSAndroid Build Coastguard Worker     config->flags.omit_session_token =
350*3c7ae9deSAndroid Build Coastguard Worker         (*env)->GetBooleanField(env, java_config, aws_signing_config_properties.omit_session_token_field_id);
351*3c7ae9deSAndroid Build Coastguard Worker 
352*3c7ae9deSAndroid Build Coastguard Worker     jstring signed_body_value =
353*3c7ae9deSAndroid Build Coastguard Worker         (jstring)(*env)->GetObjectField(env, java_config, aws_signing_config_properties.signed_body_value_field_id);
354*3c7ae9deSAndroid Build Coastguard Worker     if (signed_body_value == NULL) {
355*3c7ae9deSAndroid Build Coastguard Worker         AWS_ZERO_STRUCT(config->signed_body_value);
356*3c7ae9deSAndroid Build Coastguard Worker     } else {
357*3c7ae9deSAndroid Build Coastguard Worker         config_data->signed_body_value = aws_jni_new_string_from_jstring(env, signed_body_value);
358*3c7ae9deSAndroid Build Coastguard Worker         config->signed_body_value = aws_byte_cursor_from_string(config_data->signed_body_value);
359*3c7ae9deSAndroid Build Coastguard Worker     }
360*3c7ae9deSAndroid Build Coastguard Worker 
361*3c7ae9deSAndroid Build Coastguard Worker     config->signed_body_header =
362*3c7ae9deSAndroid Build Coastguard Worker         (*env)->GetIntField(env, java_config, aws_signing_config_properties.signed_body_header_field_id);
363*3c7ae9deSAndroid Build Coastguard Worker 
364*3c7ae9deSAndroid Build Coastguard Worker     jobject provider =
365*3c7ae9deSAndroid Build Coastguard Worker         (*env)->GetObjectField(env, java_config, aws_signing_config_properties.credentials_provider_field_id);
366*3c7ae9deSAndroid Build Coastguard Worker     if (provider != NULL) {
367*3c7ae9deSAndroid Build Coastguard Worker         config->credentials_provider =
368*3c7ae9deSAndroid Build Coastguard Worker             (void *)(*env)->CallLongMethod(env, provider, crt_resource_properties.get_native_handle_method_id);
369*3c7ae9deSAndroid Build Coastguard Worker         /* Keep the java object alive */
370*3c7ae9deSAndroid Build Coastguard Worker         config_data->java_credentials_provider = (*env)->NewGlobalRef(env, provider);
371*3c7ae9deSAndroid Build Coastguard Worker         AWS_FATAL_ASSERT(config_data->java_credentials_provider != NULL);
372*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_check_and_clear_exception(env);
373*3c7ae9deSAndroid Build Coastguard Worker     }
374*3c7ae9deSAndroid Build Coastguard Worker 
375*3c7ae9deSAndroid Build Coastguard Worker     jobject credentials = (*env)->GetObjectField(env, java_config, aws_signing_config_properties.credentials_field_id);
376*3c7ae9deSAndroid Build Coastguard Worker     if (credentials != NULL) {
377*3c7ae9deSAndroid Build Coastguard Worker         config_data->credentials = aws_credentials_new_from_java_credentials(env, credentials);
378*3c7ae9deSAndroid Build Coastguard Worker         config->credentials = config_data->credentials;
379*3c7ae9deSAndroid Build Coastguard Worker     }
380*3c7ae9deSAndroid Build Coastguard Worker 
381*3c7ae9deSAndroid Build Coastguard Worker     config->expiration_in_seconds =
382*3c7ae9deSAndroid Build Coastguard Worker         (uint64_t)(*env)->GetLongField(env, java_config, aws_signing_config_properties.expiration_in_seconds_field_id);
383*3c7ae9deSAndroid Build Coastguard Worker 
384*3c7ae9deSAndroid Build Coastguard Worker     if (aws_jni_check_and_clear_exception(env)) {
385*3c7ae9deSAndroid Build Coastguard Worker         return aws_raise_error(AWS_ERROR_HTTP_CALLBACK_FAILURE);
386*3c7ae9deSAndroid Build Coastguard Worker     }
387*3c7ae9deSAndroid Build Coastguard Worker 
388*3c7ae9deSAndroid Build Coastguard Worker     return AWS_OP_SUCCESS;
389*3c7ae9deSAndroid Build Coastguard Worker }
390*3c7ae9deSAndroid Build Coastguard Worker 
391*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT
Java_software_amazon_awssdk_crt_auth_signing_AwsSigner_awsSignerSignRequest(JNIEnv * env,jclass jni_class,jobject java_http_request,jbyteArray marshalled_request,jobject java_signing_config,jobject java_signing_result_future)392*3c7ae9deSAndroid Build Coastguard Worker void JNICALL Java_software_amazon_awssdk_crt_auth_signing_AwsSigner_awsSignerSignRequest(
393*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
394*3c7ae9deSAndroid Build Coastguard Worker     jclass jni_class,
395*3c7ae9deSAndroid Build Coastguard Worker     jobject java_http_request,
396*3c7ae9deSAndroid Build Coastguard Worker     jbyteArray marshalled_request,
397*3c7ae9deSAndroid Build Coastguard Worker     jobject java_signing_config,
398*3c7ae9deSAndroid Build Coastguard Worker     jobject java_signing_result_future) {
399*3c7ae9deSAndroid Build Coastguard Worker 
400*3c7ae9deSAndroid Build Coastguard Worker     (void)jni_class;
401*3c7ae9deSAndroid Build Coastguard Worker     aws_cache_jni_ids(env);
402*3c7ae9deSAndroid Build Coastguard Worker 
403*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator = aws_jni_get_allocator();
404*3c7ae9deSAndroid Build Coastguard Worker     struct s_aws_sign_request_callback_data *callback_data =
405*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct s_aws_sign_request_callback_data));
406*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data == NULL) {
407*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to allocated sign request callback data");
408*3c7ae9deSAndroid Build Coastguard Worker         return;
409*3c7ae9deSAndroid Build Coastguard Worker     }
410*3c7ae9deSAndroid Build Coastguard Worker 
411*3c7ae9deSAndroid Build Coastguard Worker     jint jvmresult = (*env)->GetJavaVM(env, &callback_data->jvm);
412*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(jvmresult == 0);
413*3c7ae9deSAndroid Build Coastguard Worker 
414*3c7ae9deSAndroid Build Coastguard Worker     callback_data->java_signing_result_future = (*env)->NewGlobalRef(env, java_signing_result_future);
415*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(callback_data->java_signing_result_future != NULL);
416*3c7ae9deSAndroid Build Coastguard Worker 
417*3c7ae9deSAndroid Build Coastguard Worker     callback_data->java_original_request = (*env)->NewGlobalRef(env, java_http_request);
418*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(callback_data->java_original_request != NULL);
419*3c7ae9deSAndroid Build Coastguard Worker 
420*3c7ae9deSAndroid Build Coastguard Worker     /* Build a native aws_signing_config_aws object */
421*3c7ae9deSAndroid Build Coastguard Worker     struct aws_signing_config_aws signing_config;
422*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(signing_config);
423*3c7ae9deSAndroid Build Coastguard Worker 
424*3c7ae9deSAndroid Build Coastguard Worker     if (aws_build_signing_config(env, java_signing_config, &callback_data->signing_config_data, &signing_config)) {
425*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to create signing configuration");
426*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
427*3c7ae9deSAndroid Build Coastguard Worker     }
428*3c7ae9deSAndroid Build Coastguard Worker 
429*3c7ae9deSAndroid Build Coastguard Worker     jobject java_http_request_body_stream =
430*3c7ae9deSAndroid Build Coastguard Worker         (*env)->GetObjectField(env, java_http_request, http_request_properties.body_stream_field_id);
431*3c7ae9deSAndroid Build Coastguard Worker 
432*3c7ae9deSAndroid Build Coastguard Worker     callback_data->native_request =
433*3c7ae9deSAndroid Build Coastguard Worker         aws_http_request_new_from_java_http_request(env, marshalled_request, java_http_request_body_stream);
434*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data->native_request == NULL) {
435*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to create native http request from Java HttpRequest");
436*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
437*3c7ae9deSAndroid Build Coastguard Worker     }
438*3c7ae9deSAndroid Build Coastguard Worker 
439*3c7ae9deSAndroid Build Coastguard Worker     callback_data->original_message_signable = aws_signable_new_http_request(allocator, callback_data->native_request);
440*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data->original_message_signable == NULL) {
441*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to create signable from http request");
442*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
443*3c7ae9deSAndroid Build Coastguard Worker     }
444*3c7ae9deSAndroid Build Coastguard Worker 
445*3c7ae9deSAndroid Build Coastguard Worker     /* Sign the native request */
446*3c7ae9deSAndroid Build Coastguard Worker     if (aws_sign_request_aws(
447*3c7ae9deSAndroid Build Coastguard Worker             allocator,
448*3c7ae9deSAndroid Build Coastguard Worker             callback_data->original_message_signable,
449*3c7ae9deSAndroid Build Coastguard Worker             (struct aws_signing_config_base *)&signing_config,
450*3c7ae9deSAndroid Build Coastguard Worker             s_aws_request_signing_complete,
451*3c7ae9deSAndroid Build Coastguard Worker             callback_data)) {
452*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to initiate signing process for HttpRequest");
453*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
454*3c7ae9deSAndroid Build Coastguard Worker     }
455*3c7ae9deSAndroid Build Coastguard Worker 
456*3c7ae9deSAndroid Build Coastguard Worker     return;
457*3c7ae9deSAndroid Build Coastguard Worker 
458*3c7ae9deSAndroid Build Coastguard Worker on_error:
459*3c7ae9deSAndroid Build Coastguard Worker 
460*3c7ae9deSAndroid Build Coastguard Worker     s_cleanup_callback_data(callback_data, env);
461*3c7ae9deSAndroid Build Coastguard Worker }
462*3c7ae9deSAndroid Build Coastguard Worker 
463*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT
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)464*3c7ae9deSAndroid Build Coastguard Worker void JNICALL Java_software_amazon_awssdk_crt_auth_signing_AwsSigner_awsSignerSignChunk(
465*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
466*3c7ae9deSAndroid Build Coastguard Worker     jclass jni_class,
467*3c7ae9deSAndroid Build Coastguard Worker     jobject java_chunk_body_stream,
468*3c7ae9deSAndroid Build Coastguard Worker     jbyteArray java_previous_signature,
469*3c7ae9deSAndroid Build Coastguard Worker     jobject java_signing_config,
470*3c7ae9deSAndroid Build Coastguard Worker     jobject java_signing_result_future) {
471*3c7ae9deSAndroid Build Coastguard Worker 
472*3c7ae9deSAndroid Build Coastguard Worker     (void)jni_class;
473*3c7ae9deSAndroid Build Coastguard Worker     aws_cache_jni_ids(env);
474*3c7ae9deSAndroid Build Coastguard Worker 
475*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator = aws_jni_get_allocator();
476*3c7ae9deSAndroid Build Coastguard Worker     struct s_aws_sign_request_callback_data *callback_data =
477*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct s_aws_sign_request_callback_data));
478*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data == NULL) {
479*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to allocate chunk signing callback data");
480*3c7ae9deSAndroid Build Coastguard Worker         return;
481*3c7ae9deSAndroid Build Coastguard Worker     }
482*3c7ae9deSAndroid Build Coastguard Worker 
483*3c7ae9deSAndroid Build Coastguard Worker     jint jvmresult = (*env)->GetJavaVM(env, &callback_data->jvm);
484*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(jvmresult == 0);
485*3c7ae9deSAndroid Build Coastguard Worker 
486*3c7ae9deSAndroid Build Coastguard Worker     callback_data->java_signing_result_future = (*env)->NewGlobalRef(env, java_signing_result_future);
487*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(callback_data->java_signing_result_future != NULL);
488*3c7ae9deSAndroid Build Coastguard Worker 
489*3c7ae9deSAndroid Build Coastguard Worker     if (java_chunk_body_stream != NULL) {
490*3c7ae9deSAndroid Build Coastguard Worker         callback_data->java_original_chunk_body = (*env)->NewGlobalRef(env, java_chunk_body_stream);
491*3c7ae9deSAndroid Build Coastguard Worker         AWS_FATAL_ASSERT(callback_data->java_original_chunk_body != NULL);
492*3c7ae9deSAndroid Build Coastguard Worker 
493*3c7ae9deSAndroid Build Coastguard Worker         callback_data->chunk_body_stream = aws_input_stream_new_from_java_http_request_body_stream(
494*3c7ae9deSAndroid Build Coastguard Worker             aws_jni_get_allocator(), env, java_chunk_body_stream);
495*3c7ae9deSAndroid Build Coastguard Worker         if (callback_data->chunk_body_stream == NULL) {
496*3c7ae9deSAndroid Build Coastguard Worker             aws_jni_throw_runtime_exception(env, "Error building chunk body stream");
497*3c7ae9deSAndroid Build Coastguard Worker             goto on_error;
498*3c7ae9deSAndroid Build Coastguard Worker         }
499*3c7ae9deSAndroid Build Coastguard Worker     }
500*3c7ae9deSAndroid Build Coastguard Worker 
501*3c7ae9deSAndroid Build Coastguard Worker     /* Build a native aws_signing_config_aws object */
502*3c7ae9deSAndroid Build Coastguard Worker     struct aws_signing_config_aws signing_config;
503*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(signing_config);
504*3c7ae9deSAndroid Build Coastguard Worker     if (aws_build_signing_config(env, java_signing_config, &callback_data->signing_config_data, &signing_config)) {
505*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to create signing configuration");
506*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
507*3c7ae9deSAndroid Build Coastguard Worker     }
508*3c7ae9deSAndroid Build Coastguard Worker 
509*3c7ae9deSAndroid Build Coastguard Worker     callback_data->java_previous_signature = (*env)->NewGlobalRef(env, java_previous_signature);
510*3c7ae9deSAndroid Build Coastguard Worker     callback_data->previous_signature = aws_jni_byte_cursor_from_jbyteArray_acquire(env, java_previous_signature);
511*3c7ae9deSAndroid Build Coastguard Worker 
512*3c7ae9deSAndroid Build Coastguard Worker     callback_data->original_message_signable =
513*3c7ae9deSAndroid Build Coastguard Worker         aws_signable_new_chunk(allocator, callback_data->chunk_body_stream, callback_data->previous_signature);
514*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data->original_message_signable == NULL) {
515*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to create signable from chunk data");
516*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
517*3c7ae9deSAndroid Build Coastguard Worker     }
518*3c7ae9deSAndroid Build Coastguard Worker 
519*3c7ae9deSAndroid Build Coastguard Worker     /* Sign the native request */
520*3c7ae9deSAndroid Build Coastguard Worker     if (aws_sign_request_aws(
521*3c7ae9deSAndroid Build Coastguard Worker             allocator,
522*3c7ae9deSAndroid Build Coastguard Worker             callback_data->original_message_signable,
523*3c7ae9deSAndroid Build Coastguard Worker             (struct aws_signing_config_base *)&signing_config,
524*3c7ae9deSAndroid Build Coastguard Worker             s_aws_chunk_signing_complete,
525*3c7ae9deSAndroid Build Coastguard Worker             callback_data)) {
526*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to initiate signing process for Chunk");
527*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
528*3c7ae9deSAndroid Build Coastguard Worker     }
529*3c7ae9deSAndroid Build Coastguard Worker 
530*3c7ae9deSAndroid Build Coastguard Worker     return;
531*3c7ae9deSAndroid Build Coastguard Worker 
532*3c7ae9deSAndroid Build Coastguard Worker on_error:
533*3c7ae9deSAndroid Build Coastguard Worker 
534*3c7ae9deSAndroid Build Coastguard Worker     s_cleanup_callback_data(callback_data, env);
535*3c7ae9deSAndroid Build Coastguard Worker }
536*3c7ae9deSAndroid Build Coastguard Worker 
537*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT
Java_software_amazon_awssdk_crt_auth_signing_AwsSigner_awsSignerSignTrailingHeaders(JNIEnv * env,jclass jni_class,jbyteArray marshalled_headers,jbyteArray java_previous_signature,jobject java_signing_config,jobject java_signing_result_future)538*3c7ae9deSAndroid Build Coastguard Worker void JNICALL Java_software_amazon_awssdk_crt_auth_signing_AwsSigner_awsSignerSignTrailingHeaders(
539*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
540*3c7ae9deSAndroid Build Coastguard Worker     jclass jni_class,
541*3c7ae9deSAndroid Build Coastguard Worker     jbyteArray marshalled_headers,
542*3c7ae9deSAndroid Build Coastguard Worker     jbyteArray java_previous_signature,
543*3c7ae9deSAndroid Build Coastguard Worker     jobject java_signing_config,
544*3c7ae9deSAndroid Build Coastguard Worker     jobject java_signing_result_future) {
545*3c7ae9deSAndroid Build Coastguard Worker 
546*3c7ae9deSAndroid Build Coastguard Worker     (void)jni_class;
547*3c7ae9deSAndroid Build Coastguard Worker     aws_cache_jni_ids(env);
548*3c7ae9deSAndroid Build Coastguard Worker 
549*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator = aws_jni_get_allocator();
550*3c7ae9deSAndroid Build Coastguard Worker     struct s_aws_sign_request_callback_data *callback_data =
551*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct s_aws_sign_request_callback_data));
552*3c7ae9deSAndroid Build Coastguard Worker     /* we no longer worry about allocation failures */
553*3c7ae9deSAndroid Build Coastguard Worker 
554*3c7ae9deSAndroid Build Coastguard Worker     jint jvmresult = (*env)->GetJavaVM(env, &callback_data->jvm);
555*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(jvmresult == 0);
556*3c7ae9deSAndroid Build Coastguard Worker 
557*3c7ae9deSAndroid Build Coastguard Worker     callback_data->java_signing_result_future = (*env)->NewGlobalRef(env, java_signing_result_future);
558*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(callback_data->java_signing_result_future != NULL);
559*3c7ae9deSAndroid Build Coastguard Worker 
560*3c7ae9deSAndroid Build Coastguard Worker     callback_data->trailing_headers = aws_http_headers_new_from_java_http_headers(env, marshalled_headers);
561*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data->trailing_headers == NULL) {
562*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
563*3c7ae9deSAndroid Build Coastguard Worker     }
564*3c7ae9deSAndroid Build Coastguard Worker 
565*3c7ae9deSAndroid Build Coastguard Worker     /* Build a native aws_signing_config_aws object */
566*3c7ae9deSAndroid Build Coastguard Worker     struct aws_signing_config_aws signing_config;
567*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(signing_config);
568*3c7ae9deSAndroid Build Coastguard Worker 
569*3c7ae9deSAndroid Build Coastguard Worker     if (aws_build_signing_config(env, java_signing_config, &callback_data->signing_config_data, &signing_config)) {
570*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to create signing configuration");
571*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
572*3c7ae9deSAndroid Build Coastguard Worker     }
573*3c7ae9deSAndroid Build Coastguard Worker 
574*3c7ae9deSAndroid Build Coastguard Worker     callback_data->java_previous_signature = (*env)->NewGlobalRef(env, java_previous_signature);
575*3c7ae9deSAndroid Build Coastguard Worker     callback_data->previous_signature = aws_jni_byte_cursor_from_jbyteArray_acquire(env, java_previous_signature);
576*3c7ae9deSAndroid Build Coastguard Worker 
577*3c7ae9deSAndroid Build Coastguard Worker     callback_data->original_message_signable = aws_signable_new_trailing_headers(
578*3c7ae9deSAndroid Build Coastguard Worker         allocator, callback_data->trailing_headers, callback_data->previous_signature);
579*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data->original_message_signable == NULL) {
580*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to create signable from trailing headers data");
581*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
582*3c7ae9deSAndroid Build Coastguard Worker     }
583*3c7ae9deSAndroid Build Coastguard Worker 
584*3c7ae9deSAndroid Build Coastguard Worker     /* Sign the native request */
585*3c7ae9deSAndroid Build Coastguard Worker     if (aws_sign_request_aws(
586*3c7ae9deSAndroid Build Coastguard Worker             allocator,
587*3c7ae9deSAndroid Build Coastguard Worker             callback_data->original_message_signable,
588*3c7ae9deSAndroid Build Coastguard Worker             (struct aws_signing_config_base *)&signing_config,
589*3c7ae9deSAndroid Build Coastguard Worker             s_aws_trailing_headers_signing_complete,
590*3c7ae9deSAndroid Build Coastguard Worker             callback_data)) {
591*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, "Failed to initiate signing process for trailing headers");
592*3c7ae9deSAndroid Build Coastguard Worker         goto on_error;
593*3c7ae9deSAndroid Build Coastguard Worker     }
594*3c7ae9deSAndroid Build Coastguard Worker 
595*3c7ae9deSAndroid Build Coastguard Worker     return;
596*3c7ae9deSAndroid Build Coastguard Worker 
597*3c7ae9deSAndroid Build Coastguard Worker on_error:
598*3c7ae9deSAndroid Build Coastguard Worker 
599*3c7ae9deSAndroid Build Coastguard Worker     s_cleanup_callback_data(callback_data, env);
600*3c7ae9deSAndroid Build Coastguard Worker }
601*3c7ae9deSAndroid Build Coastguard Worker 
602*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT
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)603*3c7ae9deSAndroid Build Coastguard Worker bool JNICALL Java_software_amazon_awssdk_crt_auth_signing_AwsSigningUtils_awsSigningUtilsVerifyEcdsaSignature(
604*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
605*3c7ae9deSAndroid Build Coastguard Worker     jclass jni_class,
606*3c7ae9deSAndroid Build Coastguard Worker     jobject java_http_request,
607*3c7ae9deSAndroid Build Coastguard Worker     jbyteArray java_marshalled_request,
608*3c7ae9deSAndroid Build Coastguard Worker     jstring java_expected_canonical_request,
609*3c7ae9deSAndroid Build Coastguard Worker     jobject java_signing_config,
610*3c7ae9deSAndroid Build Coastguard Worker     jbyteArray java_signature,
611*3c7ae9deSAndroid Build Coastguard Worker     jstring java_verifier_pub_x,
612*3c7ae9deSAndroid Build Coastguard Worker     jstring java_verifier_pub_y) {
613*3c7ae9deSAndroid Build Coastguard Worker 
614*3c7ae9deSAndroid Build Coastguard Worker     (void)jni_class;
615*3c7ae9deSAndroid Build Coastguard Worker     aws_cache_jni_ids(env);
616*3c7ae9deSAndroid Build Coastguard Worker 
617*3c7ae9deSAndroid Build Coastguard Worker     bool success = false;
618*3c7ae9deSAndroid Build Coastguard Worker 
619*3c7ae9deSAndroid Build Coastguard Worker     struct aws_string *expected_canonical_request = NULL;
620*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor signature_cursor;
621*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(signature_cursor);
622*3c7ae9deSAndroid Build Coastguard Worker     struct aws_string *pub_x = NULL;
623*3c7ae9deSAndroid Build Coastguard Worker     struct aws_string *pub_y = NULL;
624*3c7ae9deSAndroid Build Coastguard Worker 
625*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator = aws_jni_get_allocator();
626*3c7ae9deSAndroid Build Coastguard Worker     struct s_aws_sign_request_callback_data *callback_data =
627*3c7ae9deSAndroid Build Coastguard Worker         aws_mem_calloc(allocator, 1, sizeof(struct s_aws_sign_request_callback_data));
628*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data == NULL) {
629*3c7ae9deSAndroid Build Coastguard Worker         goto done;
630*3c7ae9deSAndroid Build Coastguard Worker     }
631*3c7ae9deSAndroid Build Coastguard Worker 
632*3c7ae9deSAndroid Build Coastguard Worker     if (java_signature == NULL) {
633*3c7ae9deSAndroid Build Coastguard Worker         goto done;
634*3c7ae9deSAndroid Build Coastguard Worker     }
635*3c7ae9deSAndroid Build Coastguard Worker 
636*3c7ae9deSAndroid Build Coastguard Worker     signature_cursor = aws_jni_byte_cursor_from_jbyteArray_acquire(env, java_signature);
637*3c7ae9deSAndroid Build Coastguard Worker     if (signature_cursor.len == 0) {
638*3c7ae9deSAndroid Build Coastguard Worker         goto done;
639*3c7ae9deSAndroid Build Coastguard Worker     }
640*3c7ae9deSAndroid Build Coastguard Worker 
641*3c7ae9deSAndroid Build Coastguard Worker     jint jvmresult = (*env)->GetJavaVM(env, &callback_data->jvm);
642*3c7ae9deSAndroid Build Coastguard Worker     AWS_FATAL_ASSERT(jvmresult == 0);
643*3c7ae9deSAndroid Build Coastguard Worker 
644*3c7ae9deSAndroid Build Coastguard Worker     /* Build a native aws_signing_config_aws object */
645*3c7ae9deSAndroid Build Coastguard Worker     struct aws_signing_config_aws signing_config;
646*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(signing_config);
647*3c7ae9deSAndroid Build Coastguard Worker 
648*3c7ae9deSAndroid Build Coastguard Worker     if (aws_build_signing_config(env, java_signing_config, &callback_data->signing_config_data, &signing_config)) {
649*3c7ae9deSAndroid Build Coastguard Worker         goto done;
650*3c7ae9deSAndroid Build Coastguard Worker     }
651*3c7ae9deSAndroid Build Coastguard Worker 
652*3c7ae9deSAndroid Build Coastguard Worker     jobject java_http_request_body_stream =
653*3c7ae9deSAndroid Build Coastguard Worker         (*env)->GetObjectField(env, java_http_request, http_request_properties.body_stream_field_id);
654*3c7ae9deSAndroid Build Coastguard Worker 
655*3c7ae9deSAndroid Build Coastguard Worker     callback_data->native_request =
656*3c7ae9deSAndroid Build Coastguard Worker         aws_http_request_new_from_java_http_request(env, java_marshalled_request, java_http_request_body_stream);
657*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data->native_request == NULL) {
658*3c7ae9deSAndroid Build Coastguard Worker         goto done;
659*3c7ae9deSAndroid Build Coastguard Worker     }
660*3c7ae9deSAndroid Build Coastguard Worker 
661*3c7ae9deSAndroid Build Coastguard Worker     callback_data->original_message_signable = aws_signable_new_http_request(allocator, callback_data->native_request);
662*3c7ae9deSAndroid Build Coastguard Worker     if (callback_data->original_message_signable == NULL) {
663*3c7ae9deSAndroid Build Coastguard Worker         goto done;
664*3c7ae9deSAndroid Build Coastguard Worker     }
665*3c7ae9deSAndroid Build Coastguard Worker 
666*3c7ae9deSAndroid Build Coastguard Worker     expected_canonical_request = aws_jni_new_string_from_jstring(env, java_expected_canonical_request);
667*3c7ae9deSAndroid Build Coastguard Worker     pub_x = aws_jni_new_string_from_jstring(env, java_verifier_pub_x);
668*3c7ae9deSAndroid Build Coastguard Worker     pub_y = aws_jni_new_string_from_jstring(env, java_verifier_pub_y);
669*3c7ae9deSAndroid Build Coastguard Worker 
670*3c7ae9deSAndroid Build Coastguard Worker     if (aws_verify_sigv4a_signing(
671*3c7ae9deSAndroid Build Coastguard Worker             allocator,
672*3c7ae9deSAndroid Build Coastguard Worker             callback_data->original_message_signable,
673*3c7ae9deSAndroid Build Coastguard Worker             (struct aws_signing_config_base *)&signing_config,
674*3c7ae9deSAndroid Build Coastguard Worker             aws_byte_cursor_from_string(expected_canonical_request),
675*3c7ae9deSAndroid Build Coastguard Worker             signature_cursor,
676*3c7ae9deSAndroid Build Coastguard Worker             aws_byte_cursor_from_string(pub_x),
677*3c7ae9deSAndroid Build Coastguard Worker             aws_byte_cursor_from_string(pub_y))) {
678*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_throw_runtime_exception(env, aws_error_str(aws_last_error()));
679*3c7ae9deSAndroid Build Coastguard Worker         goto done;
680*3c7ae9deSAndroid Build Coastguard Worker     }
681*3c7ae9deSAndroid Build Coastguard Worker 
682*3c7ae9deSAndroid Build Coastguard Worker     success = true;
683*3c7ae9deSAndroid Build Coastguard Worker 
684*3c7ae9deSAndroid Build Coastguard Worker done:
685*3c7ae9deSAndroid Build Coastguard Worker 
686*3c7ae9deSAndroid Build Coastguard Worker     s_cleanup_callback_data(callback_data, env);
687*3c7ae9deSAndroid Build Coastguard Worker 
688*3c7ae9deSAndroid Build Coastguard Worker     aws_string_destroy(expected_canonical_request);
689*3c7ae9deSAndroid Build Coastguard Worker     if (signature_cursor.len > 0) {
690*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_byte_cursor_from_jbyteArray_release(env, java_signature, signature_cursor);
691*3c7ae9deSAndroid Build Coastguard Worker     }
692*3c7ae9deSAndroid Build Coastguard Worker     aws_string_destroy(pub_x);
693*3c7ae9deSAndroid Build Coastguard Worker     aws_string_destroy(pub_y);
694*3c7ae9deSAndroid Build Coastguard Worker 
695*3c7ae9deSAndroid Build Coastguard Worker     return success;
696*3c7ae9deSAndroid Build Coastguard Worker }
697*3c7ae9deSAndroid Build Coastguard Worker 
698*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT
Java_software_amazon_awssdk_crt_auth_signing_AwsSigningUtils_awsSigningUtilsVerifyRawSha256EcdsaSignature(JNIEnv * env,jclass jni_class,jbyteArray java_string_to_sign,jbyteArray java_signature,jstring java_verifier_pub_x,jstring java_verifier_pub_y)699*3c7ae9deSAndroid Build Coastguard Worker bool JNICALL Java_software_amazon_awssdk_crt_auth_signing_AwsSigningUtils_awsSigningUtilsVerifyRawSha256EcdsaSignature(
700*3c7ae9deSAndroid Build Coastguard Worker     JNIEnv *env,
701*3c7ae9deSAndroid Build Coastguard Worker     jclass jni_class,
702*3c7ae9deSAndroid Build Coastguard Worker     jbyteArray java_string_to_sign,
703*3c7ae9deSAndroid Build Coastguard Worker     jbyteArray java_signature,
704*3c7ae9deSAndroid Build Coastguard Worker     jstring java_verifier_pub_x,
705*3c7ae9deSAndroid Build Coastguard Worker     jstring java_verifier_pub_y) {
706*3c7ae9deSAndroid Build Coastguard Worker 
707*3c7ae9deSAndroid Build Coastguard Worker     (void)jni_class;
708*3c7ae9deSAndroid Build Coastguard Worker     aws_cache_jni_ids(env);
709*3c7ae9deSAndroid Build Coastguard Worker 
710*3c7ae9deSAndroid Build Coastguard Worker     bool success = false;
711*3c7ae9deSAndroid Build Coastguard Worker     struct aws_allocator *allocator = aws_jni_get_allocator();
712*3c7ae9deSAndroid Build Coastguard Worker 
713*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor string_to_sign_cursor;
714*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(string_to_sign_cursor);
715*3c7ae9deSAndroid Build Coastguard Worker     struct aws_byte_cursor signature_cursor;
716*3c7ae9deSAndroid Build Coastguard Worker     AWS_ZERO_STRUCT(signature_cursor);
717*3c7ae9deSAndroid Build Coastguard Worker 
718*3c7ae9deSAndroid Build Coastguard Worker     struct aws_ecc_key_pair *ecc_key = NULL;
719*3c7ae9deSAndroid Build Coastguard Worker     struct aws_string *pub_x = NULL;
720*3c7ae9deSAndroid Build Coastguard Worker     struct aws_string *pub_y = NULL;
721*3c7ae9deSAndroid Build Coastguard Worker 
722*3c7ae9deSAndroid Build Coastguard Worker     if (java_string_to_sign == NULL || java_signature == NULL || java_verifier_pub_x == NULL ||
723*3c7ae9deSAndroid Build Coastguard Worker         java_verifier_pub_y == NULL) {
724*3c7ae9deSAndroid Build Coastguard Worker         goto done;
725*3c7ae9deSAndroid Build Coastguard Worker     }
726*3c7ae9deSAndroid Build Coastguard Worker 
727*3c7ae9deSAndroid Build Coastguard Worker     pub_x = aws_jni_new_string_from_jstring(env, java_verifier_pub_x);
728*3c7ae9deSAndroid Build Coastguard Worker     pub_y = aws_jni_new_string_from_jstring(env, java_verifier_pub_y);
729*3c7ae9deSAndroid Build Coastguard Worker     if (pub_x == NULL || pub_y == NULL) {
730*3c7ae9deSAndroid Build Coastguard Worker         goto done;
731*3c7ae9deSAndroid Build Coastguard Worker     }
732*3c7ae9deSAndroid Build Coastguard Worker 
733*3c7ae9deSAndroid Build Coastguard Worker     ecc_key = aws_ecc_key_new_from_hex_coordinates(
734*3c7ae9deSAndroid Build Coastguard Worker         allocator, AWS_CAL_ECDSA_P256, aws_byte_cursor_from_string(pub_x), aws_byte_cursor_from_string(pub_y));
735*3c7ae9deSAndroid Build Coastguard Worker     if (ecc_key == NULL) {
736*3c7ae9deSAndroid Build Coastguard Worker         goto done;
737*3c7ae9deSAndroid Build Coastguard Worker     }
738*3c7ae9deSAndroid Build Coastguard Worker 
739*3c7ae9deSAndroid Build Coastguard Worker     string_to_sign_cursor = aws_jni_byte_cursor_from_jbyteArray_acquire(env, java_string_to_sign);
740*3c7ae9deSAndroid Build Coastguard Worker     signature_cursor = aws_jni_byte_cursor_from_jbyteArray_acquire(env, java_signature);
741*3c7ae9deSAndroid Build Coastguard Worker 
742*3c7ae9deSAndroid Build Coastguard Worker     if (aws_validate_v4a_authorization_value(allocator, ecc_key, string_to_sign_cursor, signature_cursor)) {
743*3c7ae9deSAndroid Build Coastguard Worker         goto done;
744*3c7ae9deSAndroid Build Coastguard Worker     }
745*3c7ae9deSAndroid Build Coastguard Worker 
746*3c7ae9deSAndroid Build Coastguard Worker     success = true;
747*3c7ae9deSAndroid Build Coastguard Worker 
748*3c7ae9deSAndroid Build Coastguard Worker done:
749*3c7ae9deSAndroid Build Coastguard Worker 
750*3c7ae9deSAndroid Build Coastguard Worker     if (string_to_sign_cursor.len > 0) {
751*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_byte_cursor_from_jbyteArray_release(env, java_string_to_sign, string_to_sign_cursor);
752*3c7ae9deSAndroid Build Coastguard Worker     }
753*3c7ae9deSAndroid Build Coastguard Worker 
754*3c7ae9deSAndroid Build Coastguard Worker     if (signature_cursor.len > 0) {
755*3c7ae9deSAndroid Build Coastguard Worker         aws_jni_byte_cursor_from_jbyteArray_release(env, java_signature, signature_cursor);
756*3c7ae9deSAndroid Build Coastguard Worker     }
757*3c7ae9deSAndroid Build Coastguard Worker 
758*3c7ae9deSAndroid Build Coastguard Worker     aws_string_destroy(pub_x);
759*3c7ae9deSAndroid Build Coastguard Worker     aws_string_destroy(pub_y);
760*3c7ae9deSAndroid Build Coastguard Worker 
761*3c7ae9deSAndroid Build Coastguard Worker     aws_ecc_key_pair_release(ecc_key);
762*3c7ae9deSAndroid Build Coastguard Worker 
763*3c7ae9deSAndroid Build Coastguard Worker     return success;
764*3c7ae9deSAndroid Build Coastguard Worker }
765*3c7ae9deSAndroid Build Coastguard Worker 
766*3c7ae9deSAndroid Build Coastguard Worker #if UINTPTR_MAX == 0xffffffff
767*3c7ae9deSAndroid Build Coastguard Worker #    if defined(_MSC_VER)
768*3c7ae9deSAndroid Build Coastguard Worker #        pragma warning(pop)
769*3c7ae9deSAndroid Build Coastguard Worker #    else
770*3c7ae9deSAndroid Build Coastguard Worker #        pragma GCC diagnostic pop
771*3c7ae9deSAndroid Build Coastguard Worker #    endif
772*3c7ae9deSAndroid Build Coastguard Worker #endif
773