1*3c7ae9deSAndroid Build Coastguard Worker /**
2*3c7ae9deSAndroid Build Coastguard Worker * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3*3c7ae9deSAndroid Build Coastguard Worker * SPDX-License-Identifier: Apache-2.0.
4*3c7ae9deSAndroid Build Coastguard Worker */
5*3c7ae9deSAndroid Build Coastguard Worker #include <jni.h>
6*3c7ae9deSAndroid Build Coastguard Worker
7*3c7ae9deSAndroid Build Coastguard Worker #include <aws/checksums/crc.h>
8*3c7ae9deSAndroid Build Coastguard Worker
9*3c7ae9deSAndroid Build Coastguard Worker #include "crt.h"
10*3c7ae9deSAndroid Build Coastguard Worker #include "java_class_ids.h"
11*3c7ae9deSAndroid Build Coastguard Worker
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*3c7ae9deSAndroid Build Coastguard Worker jint crc_common(
13*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
14*3c7ae9deSAndroid Build Coastguard Worker jbyteArray input,
15*3c7ae9deSAndroid Build Coastguard Worker jint previous,
16*3c7ae9deSAndroid Build Coastguard Worker const size_t start,
17*3c7ae9deSAndroid Build Coastguard Worker size_t length,
18*3c7ae9deSAndroid Build Coastguard Worker uint32_t (*checksum_fn)(const uint8_t *, int, uint32_t)) {
19*3c7ae9deSAndroid Build Coastguard Worker struct aws_byte_cursor c_byte_array = aws_jni_byte_cursor_from_jbyteArray_acquire(env, input);
20*3c7ae9deSAndroid Build Coastguard Worker struct aws_byte_cursor cursor = c_byte_array;
21*3c7ae9deSAndroid Build Coastguard Worker aws_byte_cursor_advance(&cursor, start);
22*3c7ae9deSAndroid Build Coastguard Worker cursor.len = aws_min_size(length, cursor.len);
23*3c7ae9deSAndroid Build Coastguard Worker uint32_t res = (uint32_t)previous;
24*3c7ae9deSAndroid Build Coastguard Worker while (cursor.len > INT_MAX) {
25*3c7ae9deSAndroid Build Coastguard Worker res = checksum_fn(cursor.ptr, INT_MAX, res);
26*3c7ae9deSAndroid Build Coastguard Worker aws_byte_cursor_advance(&cursor, INT_MAX);
27*3c7ae9deSAndroid Build Coastguard Worker }
28*3c7ae9deSAndroid Build Coastguard Worker jint res_signed = (jint)checksum_fn(cursor.ptr, (int)cursor.len, res);
29*3c7ae9deSAndroid Build Coastguard Worker aws_jni_byte_cursor_from_jbyteArray_release(env, input, c_byte_array);
30*3c7ae9deSAndroid Build Coastguard Worker return res_signed;
31*3c7ae9deSAndroid Build Coastguard Worker }
32*3c7ae9deSAndroid Build Coastguard Worker
Java_software_amazon_awssdk_crt_checksums_CRC32_crc32(JNIEnv * env,jclass jni_class,jbyteArray input,jint previous,jint offset,jint length)33*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT jint JNICALL Java_software_amazon_awssdk_crt_checksums_CRC32_crc32(
34*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
35*3c7ae9deSAndroid Build Coastguard Worker jclass jni_class,
36*3c7ae9deSAndroid Build Coastguard Worker jbyteArray input,
37*3c7ae9deSAndroid Build Coastguard Worker jint previous,
38*3c7ae9deSAndroid Build Coastguard Worker jint offset,
39*3c7ae9deSAndroid Build Coastguard Worker jint length) {
40*3c7ae9deSAndroid Build Coastguard Worker (void)jni_class;
41*3c7ae9deSAndroid Build Coastguard Worker aws_cache_jni_ids(env);
42*3c7ae9deSAndroid Build Coastguard Worker
43*3c7ae9deSAndroid Build Coastguard Worker return crc_common(env, input, previous, offset, length, aws_checksums_crc32);
44*3c7ae9deSAndroid Build Coastguard Worker }
45*3c7ae9deSAndroid Build Coastguard Worker
Java_software_amazon_awssdk_crt_checksums_CRC32C_crc32c(JNIEnv * env,jclass jni_class,jbyteArray input,jint previous,jint offset,jint length)46*3c7ae9deSAndroid Build Coastguard Worker JNIEXPORT jint JNICALL Java_software_amazon_awssdk_crt_checksums_CRC32C_crc32c(
47*3c7ae9deSAndroid Build Coastguard Worker JNIEnv *env,
48*3c7ae9deSAndroid Build Coastguard Worker jclass jni_class,
49*3c7ae9deSAndroid Build Coastguard Worker jbyteArray input,
50*3c7ae9deSAndroid Build Coastguard Worker jint previous,
51*3c7ae9deSAndroid Build Coastguard Worker jint offset,
52*3c7ae9deSAndroid Build Coastguard Worker jint length) {
53*3c7ae9deSAndroid Build Coastguard Worker (void)jni_class;
54*3c7ae9deSAndroid Build Coastguard Worker aws_cache_jni_ids(env);
55*3c7ae9deSAndroid Build Coastguard Worker
56*3c7ae9deSAndroid Build Coastguard Worker return crc_common(env, input, previous, offset, length, aws_checksums_crc32c);
57*3c7ae9deSAndroid Build Coastguard Worker }
58