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