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