blob: 62f151dc27059a7d933756d71aeb6f8dce18718b [file] [log] [blame]
// Copyright 2023 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <jni.h>
#include <stdlib.h>
#include <string.h>
#include "c/blake3.h"
namespace blaze_jni {
jbyte *get_byte_array(JNIEnv *env, jbyteArray java_array) {
return (jbyte *)env->GetPrimitiveArrayCritical(java_array, nullptr);
}
void release_byte_array(JNIEnv *env, jbyteArray array, jbyte *addr) {
env->ReleasePrimitiveArrayCritical(array, addr, 0);
}
extern "C" JNIEXPORT int JNICALL
Java_com_google_devtools_build_lib_vfs_bazel_Blake3MessageDigest_hasher_1size(
JNIEnv *env, jobject obj) {
return (int)sizeof(blake3_hasher);
}
extern "C" JNIEXPORT void JNICALL
Java_com_google_devtools_build_lib_vfs_bazel_Blake3MessageDigest_initialize_1hasher(
JNIEnv *env, jobject obj, jbyteArray jhasher) {
blake3_hasher *hasher = (blake3_hasher *)get_byte_array(env, jhasher);
if (hasher) {
blake3_hasher_init(hasher);
release_byte_array(env, jhasher, (jbyte *)hasher);
}
}
extern "C" JNIEXPORT void JNICALL
Java_com_google_devtools_build_lib_vfs_bazel_Blake3MessageDigest_blake3_1hasher_1update(
JNIEnv *env, jobject obj, jbyteArray jhasher, jbyteArray input, jint offset,
jint input_len) {
blake3_hasher *hasher = (blake3_hasher *)get_byte_array(env, jhasher);
if (hasher) {
jbyte *input_addr = get_byte_array(env, input);
blake3_hasher_update(hasher, input_addr + offset, input_len);
release_byte_array(env, input, input_addr);
release_byte_array(env, jhasher, (jbyte *)hasher);
}
}
extern "C" JNIEXPORT void JNICALL
Java_com_google_devtools_build_lib_vfs_bazel_Blake3MessageDigest_blake3_1hasher_1finalize(
JNIEnv *env, jobject obj, jbyteArray jhasher, jbyteArray out,
jint out_len) {
blake3_hasher *hasher = (blake3_hasher *)get_byte_array(env, jhasher);
if (hasher) {
jbyte *out_addr = get_byte_array(env, out);
blake3_hasher_finalize(hasher, (uint8_t *)out_addr, out_len);
release_byte_array(env, out, out_addr);
release_byte_array(env, jhasher, (jbyte *)hasher);
}
}
} // namespace blaze_jni