/** * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0. */ #include #include #include #include "crt.h" #include "java_class_ids.h" JNIEXPORT jbyteArray JNICALL Java_software_amazon_awssdk_crt_utils_StringUtils_stringUtilsBase64Encode( JNIEnv *env, jclass jni_class, jbyteArray jni_data) { (void)jni_class; aws_cache_jni_ids(env); struct aws_byte_cursor data_cursor; AWS_ZERO_STRUCT(data_cursor); struct aws_byte_buf formatted_data; AWS_ZERO_STRUCT(formatted_data); jbyteArray return_data = NULL; data_cursor = aws_jni_byte_cursor_from_jbyteArray_acquire(env, jni_data); if (data_cursor.ptr == NULL) { return return_data; } // Determine how much space we need size_t terminated_length = 0; if (aws_base64_compute_encoded_len(data_cursor.len, &terminated_length) != AWS_OP_SUCCESS) { aws_jni_throw_runtime_exception(env, "StringUtils: Could not determine length for base64 encode"); goto clean_up; } aws_byte_buf_init(&formatted_data, aws_jni_get_allocator(), terminated_length); int result = aws_base64_encode(&data_cursor, &formatted_data); if (result != AWS_OP_SUCCESS) { aws_jni_throw_runtime_exception(env, "StringUtils: Could not perform base64 encode"); goto clean_up; } struct aws_byte_cursor formatted_data_cursor = aws_byte_cursor_from_buf(&formatted_data); return_data = aws_jni_byte_array_from_cursor(env, &formatted_data_cursor); clean_up: aws_jni_byte_cursor_from_jbyteArray_release(env, jni_data, data_cursor); aws_byte_buf_clean_up_secure(&formatted_data); return return_data; } JNIEXPORT jbyteArray JNICALL Java_software_amazon_awssdk_crt_utils_StringUtils_stringUtilsBase64Decode( JNIEnv *env, jclass jni_class, jbyteArray jni_data) { (void)jni_class; aws_cache_jni_ids(env); struct aws_byte_cursor data_cursor; AWS_ZERO_STRUCT(data_cursor); struct aws_byte_buf formatted_data; AWS_ZERO_STRUCT(formatted_data); jbyteArray return_data = NULL; data_cursor = aws_jni_byte_cursor_from_jbyteArray_acquire(env, jni_data); if (data_cursor.ptr == NULL) { return NULL; } // Determine how much space we need size_t terminated_length = 0; if (aws_base64_compute_decoded_len(&data_cursor, &terminated_length) != AWS_OP_SUCCESS) { aws_jni_throw_runtime_exception(env, "StringUtils: Could not determine length for base64 decode"); goto clean_up; } aws_byte_buf_init(&formatted_data, aws_jni_get_allocator(), terminated_length); int result = aws_base64_decode(&data_cursor, &formatted_data); if (result != AWS_OP_SUCCESS) { aws_jni_throw_runtime_exception(env, "StringUtils: Could not perform base64 decode"); goto clean_up; } struct aws_byte_cursor formatted_data_cursor = aws_byte_cursor_from_buf(&formatted_data); return_data = aws_jni_byte_array_from_cursor(env, &formatted_data_cursor); clean_up: aws_jni_byte_cursor_from_jbyteArray_release(env, jni_data, data_cursor); aws_byte_buf_clean_up_secure(&formatted_data); return return_data; }