xref: /aosp_15_r20/external/aws-crt-java/src/native/checksums.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/checksums/crc.h>
8 
9 #include "crt.h"
10 #include "java_class_ids.h"
11 
crc_common(JNIEnv * env,jbyteArray input,jint previous,const size_t start,size_t length,uint32_t (* checksum_fn)(const uint8_t *,int,uint32_t))12 jint crc_common(
13     JNIEnv *env,
14     jbyteArray input,
15     jint previous,
16     const size_t start,
17     size_t length,
18     uint32_t (*checksum_fn)(const uint8_t *, int, uint32_t)) {
19     struct aws_byte_cursor c_byte_array = aws_jni_byte_cursor_from_jbyteArray_acquire(env, input);
20     struct aws_byte_cursor cursor = c_byte_array;
21     aws_byte_cursor_advance(&cursor, start);
22     cursor.len = aws_min_size(length, cursor.len);
23     uint32_t res = (uint32_t)previous;
24     while (cursor.len > INT_MAX) {
25         res = checksum_fn(cursor.ptr, INT_MAX, res);
26         aws_byte_cursor_advance(&cursor, INT_MAX);
27     }
28     jint res_signed = (jint)checksum_fn(cursor.ptr, (int)cursor.len, res);
29     aws_jni_byte_cursor_from_jbyteArray_release(env, input, c_byte_array);
30     return res_signed;
31 }
32 
Java_software_amazon_awssdk_crt_checksums_CRC32_crc32(JNIEnv * env,jclass jni_class,jbyteArray input,jint previous,jint offset,jint length)33 JNIEXPORT jint JNICALL Java_software_amazon_awssdk_crt_checksums_CRC32_crc32(
34     JNIEnv *env,
35     jclass jni_class,
36     jbyteArray input,
37     jint previous,
38     jint offset,
39     jint length) {
40     (void)jni_class;
41     aws_cache_jni_ids(env);
42 
43     return crc_common(env, input, previous, offset, length, aws_checksums_crc32);
44 }
45 
Java_software_amazon_awssdk_crt_checksums_CRC32C_crc32c(JNIEnv * env,jclass jni_class,jbyteArray input,jint previous,jint offset,jint length)46 JNIEXPORT jint JNICALL Java_software_amazon_awssdk_crt_checksums_CRC32C_crc32c(
47     JNIEnv *env,
48     jclass jni_class,
49     jbyteArray input,
50     jint previous,
51     jint offset,
52     jint length) {
53     (void)jni_class;
54     aws_cache_jni_ids(env);
55 
56     return crc_common(env, input, previous, offset, length, aws_checksums_crc32c);
57 }
58