xref: /aosp_15_r20/external/aws-crt-java/src/native/string_utils.c (revision 3c7ae9de214676c52d19f01067dc1a404272dc11)
1 /**
2  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3  * SPDX-License-Identifier: Apache-2.0.
4  */
5 #include <jni.h>
6 
7 #include <aws/common/encoding.h>
8 #include <aws/common/string.h>
9 
10 #include "crt.h"
11 #include "java_class_ids.h"
12 
13 JNIEXPORT
Java_software_amazon_awssdk_crt_utils_StringUtils_stringUtilsBase64Encode(JNIEnv * env,jclass jni_class,jbyteArray jni_data)14 jbyteArray JNICALL Java_software_amazon_awssdk_crt_utils_StringUtils_stringUtilsBase64Encode(
15     JNIEnv *env,
16     jclass jni_class,
17     jbyteArray jni_data) {
18     (void)jni_class;
19     aws_cache_jni_ids(env);
20 
21     struct aws_byte_cursor data_cursor;
22     AWS_ZERO_STRUCT(data_cursor);
23     struct aws_byte_buf formatted_data;
24     AWS_ZERO_STRUCT(formatted_data);
25     jbyteArray return_data = NULL;
26 
27     data_cursor = aws_jni_byte_cursor_from_jbyteArray_acquire(env, jni_data);
28     if (data_cursor.ptr == NULL) {
29         return return_data;
30     }
31 
32     // Determine how much space we need
33     size_t terminated_length = 0;
34     if (aws_base64_compute_encoded_len(data_cursor.len, &terminated_length) != AWS_OP_SUCCESS) {
35         aws_jni_throw_runtime_exception(env, "StringUtils: Could not determine length for base64 encode");
36         goto clean_up;
37     }
38 
39     aws_byte_buf_init(&formatted_data, aws_jni_get_allocator(), terminated_length);
40     int result = aws_base64_encode(&data_cursor, &formatted_data);
41     if (result != AWS_OP_SUCCESS) {
42         aws_jni_throw_runtime_exception(env, "StringUtils: Could not perform base64 encode");
43         goto clean_up;
44     }
45 
46     struct aws_byte_cursor formatted_data_cursor = aws_byte_cursor_from_buf(&formatted_data);
47     return_data = aws_jni_byte_array_from_cursor(env, &formatted_data_cursor);
48 
49 clean_up:
50     aws_jni_byte_cursor_from_jbyteArray_release(env, jni_data, data_cursor);
51     aws_byte_buf_clean_up_secure(&formatted_data);
52     return return_data;
53 }
54 
55 JNIEXPORT
Java_software_amazon_awssdk_crt_utils_StringUtils_stringUtilsBase64Decode(JNIEnv * env,jclass jni_class,jbyteArray jni_data)56 jbyteArray JNICALL Java_software_amazon_awssdk_crt_utils_StringUtils_stringUtilsBase64Decode(
57     JNIEnv *env,
58     jclass jni_class,
59     jbyteArray jni_data) {
60     (void)jni_class;
61     aws_cache_jni_ids(env);
62 
63     struct aws_byte_cursor data_cursor;
64     AWS_ZERO_STRUCT(data_cursor);
65     struct aws_byte_buf formatted_data;
66     AWS_ZERO_STRUCT(formatted_data);
67     jbyteArray return_data = NULL;
68 
69     data_cursor = aws_jni_byte_cursor_from_jbyteArray_acquire(env, jni_data);
70     if (data_cursor.ptr == NULL) {
71         return NULL;
72     }
73 
74     // Determine how much space we need
75     size_t terminated_length = 0;
76     if (aws_base64_compute_decoded_len(&data_cursor, &terminated_length) != AWS_OP_SUCCESS) {
77         aws_jni_throw_runtime_exception(env, "StringUtils: Could not determine length for base64 decode");
78         goto clean_up;
79     }
80 
81     aws_byte_buf_init(&formatted_data, aws_jni_get_allocator(), terminated_length);
82     int result = aws_base64_decode(&data_cursor, &formatted_data);
83     if (result != AWS_OP_SUCCESS) {
84         aws_jni_throw_runtime_exception(env, "StringUtils: Could not perform base64 decode");
85         goto clean_up;
86     }
87 
88     struct aws_byte_cursor formatted_data_cursor = aws_byte_cursor_from_buf(&formatted_data);
89     return_data = aws_jni_byte_array_from_cursor(env, &formatted_data_cursor);
90 
91 clean_up:
92     aws_jni_byte_cursor_from_jbyteArray_release(env, jni_data, data_cursor);
93     aws_byte_buf_clean_up_secure(&formatted_data);
94     return return_data;
95 }
96