blob: b94716c5258c5460d9725354a07da6c10ee84652 [file] [log] [blame] [edit]
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include <jni.h>
#include <aws/common/encoding.h>
#include <aws/common/string.h>
#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;
}