[Java binding] Throw exception for an invalid blob size

This commit is contained in:
Stefan Bratanov 2022-12-20 16:49:24 +02:00
parent b8d90a5080
commit 5399336f6a
2 changed files with 40 additions and 25 deletions

View File

@ -32,6 +32,13 @@ void throw_c_kzg_exception(JNIEnv *env, C_KZG_RET error_code, const char *messag
(*env)->Throw(env, exception); (*env)->Throw(env, exception);
} }
void throw_invalid_size_exception(JNIEnv *env, const char *prefix, size_t size, size_t expected_size)
{
char message[100];
sprintf(message, "%s Expected %zu bytes but got %zu.", prefix, expected_size, size);
throw_c_kzg_exception(env, C_KZG_BADARGS, message);
}
JNIEXPORT jint JNICALL Java_ethereum_ckzg4844_CKZG4844JNI_getFieldElementsPerBlob(JNIEnv *env, jclass thisCls) JNIEXPORT jint JNICALL Java_ethereum_ckzg4844_CKZG4844JNI_getFieldElementsPerBlob(JNIEnv *env, jclass thisCls)
{ {
return (jint)FIELD_ELEMENTS_PER_BLOB; return (jint)FIELD_ELEMENTS_PER_BLOB;
@ -39,7 +46,7 @@ JNIEXPORT jint JNICALL Java_ethereum_ckzg4844_CKZG4844JNI_getFieldElementsPerBlo
JNIEXPORT void JNICALL Java_ethereum_ckzg4844_CKZG4844JNI_loadTrustedSetup__Ljava_lang_String_2(JNIEnv *env, jclass thisCls, jstring file) JNIEXPORT void JNICALL Java_ethereum_ckzg4844_CKZG4844JNI_loadTrustedSetup__Ljava_lang_String_2(JNIEnv *env, jclass thisCls, jstring file)
{ {
if (settings != NULL) if (settings)
{ {
throw_exception(env, "Trusted Setup is already loaded. Free it before loading a new one."); throw_exception(env, "Trusted Setup is already loaded. Free it before loading a new one.");
return; return;
@ -48,7 +55,7 @@ JNIEXPORT void JNICALL Java_ethereum_ckzg4844_CKZG4844JNI_loadTrustedSetup__Ljav
settings = malloc(sizeof(KZGSettings)); settings = malloc(sizeof(KZGSettings));
if (settings == NULL) if (settings == NULL)
{ {
throw_exception(env, "Failed to allocate memory for settings."); throw_exception(env, "Failed to allocate memory for the trusted setup.");
return; return;
} }
@ -79,7 +86,7 @@ JNIEXPORT void JNICALL Java_ethereum_ckzg4844_CKZG4844JNI_loadTrustedSetup__Ljav
JNIEXPORT void JNICALL Java_ethereum_ckzg4844_CKZG4844JNI_loadTrustedSetup___3BJ_3BJ(JNIEnv *env, jclass thisCls, jbyteArray g1, jlong g1Count, jbyteArray g2, jlong g2Count) JNIEXPORT void JNICALL Java_ethereum_ckzg4844_CKZG4844JNI_loadTrustedSetup___3BJ_3BJ(JNIEnv *env, jclass thisCls, jbyteArray g1, jlong g1Count, jbyteArray g2, jlong g2Count)
{ {
if (settings != NULL) if (settings)
{ {
throw_exception(env, "Trusted Setup is already loaded. Free it before loading a new one."); throw_exception(env, "Trusted Setup is already loaded. Free it before loading a new one.");
return; return;
@ -88,7 +95,7 @@ JNIEXPORT void JNICALL Java_ethereum_ckzg4844_CKZG4844JNI_loadTrustedSetup___3BJ
settings = malloc(sizeof(KZGSettings)); settings = malloc(sizeof(KZGSettings));
if (settings == NULL) if (settings == NULL)
{ {
throw_exception(env, "Failed to allocate memory for settings."); throw_exception(env, "Failed to allocate memory for the trusted setup.");
return; return;
} }
@ -127,9 +134,10 @@ JNIEXPORT jbyteArray JNICALL Java_ethereum_ckzg4844_CKZG4844JNI_computeAggregate
} }
size_t blobs_size = (size_t)(*env)->GetArrayLength(env, blobs); size_t blobs_size = (size_t)(*env)->GetArrayLength(env, blobs);
if (blobs_size == 0) size_t expected_blobs_size = BYTES_PER_BLOB * (size_t)count;
if (blobs_size != expected_blobs_size)
{ {
throw_exception(env, "Passing byte array with 0 elements for blobs is not supported."); throw_invalid_size_exception(env, "Invalid blobs size.", blobs_size, expected_blobs_size);
return 0; return 0;
} }
@ -166,9 +174,10 @@ JNIEXPORT jboolean JNICALL Java_ethereum_ckzg4844_CKZG4844JNI_verifyAggregateKzg
} }
size_t blobs_size = (size_t)(*env)->GetArrayLength(env, blobs); size_t blobs_size = (size_t)(*env)->GetArrayLength(env, blobs);
if (blobs_size == 0) size_t expected_blobs_size = BYTES_PER_BLOB * (size_t)count;
if (blobs_size != expected_blobs_size)
{ {
throw_exception(env, "Passing byte array with 0 elements for blobs is not supported."); throw_invalid_size_exception(env, "Invalid blobs size.", blobs_size, expected_blobs_size);
return 0; return 0;
} }
@ -236,10 +245,10 @@ JNIEXPORT jbyteArray JNICALL Java_ethereum_ckzg4844_CKZG4844JNI_blobToKzgCommitm
} }
size_t blob_size = (size_t)(*env)->GetArrayLength(env, blob); size_t blob_size = (size_t)(*env)->GetArrayLength(env, blob);
if (blob_size == 0) if (blob_size != BYTES_PER_BLOB)
{ {
throw_exception(env, "Passing byte array with 0 elements for a blob is not supported."); throw_invalid_size_exception(env, "Invalid blob size.", blob_size, BYTES_PER_BLOB);
return NULL; return 0;
} }
jbyte *blob_native = (*env)->GetByteArrayElements(env, blob, NULL); jbyte *blob_native = (*env)->GetByteArrayElements(env, blob, NULL);

View File

@ -100,28 +100,34 @@ public class CKZG4844JNITest {
} }
@Test @Test
public void passingZeroElementArraysForBlobsDoesNotCauseSegmentationFaultErrors() { public void passingInvalidLengthForBlobsThrowsAnException() {
loadTrustedSetup(); loadTrustedSetup();
RuntimeException exception = assertThrows(RuntimeException.class, CKZGException exception = assertThrows(CKZGException.class,
() -> CKZG4844JNI.blobToKzgCommitment(new byte[0])); () -> CKZG4844JNI.blobToKzgCommitment(new byte[0]));
assertEquals("Passing byte array with 0 elements for a blob is not supported.", assertEquals(CKZGError.C_KZG_BADARGS, exception.getError());
exception.getMessage()); assertEquals(String.format("Invalid blob size. Expected %d bytes but got 0.",
CKZG4844JNI.getBytesPerBlob()),
exception.getErrorMessage());
exception = assertThrows(RuntimeException.class, exception = assertThrows(CKZGException.class,
() -> CKZG4844JNI.computeAggregateKzgProof(new byte[0], 1)); () -> CKZG4844JNI.computeAggregateKzgProof(new byte[123], 1));
assertEquals("Passing byte array with 0 elements for blobs is not supported.", assertEquals(CKZGError.C_KZG_BADARGS, exception.getError());
exception.getMessage()); assertEquals(String.format("Invalid blobs size. Expected %d bytes but got 123.",
CKZG4844JNI.getBytesPerBlob()),
exception.getErrorMessage());
exception = assertThrows(RuntimeException.class, exception = assertThrows(CKZGException.class,
() -> CKZG4844JNI.verifyAggregateKzgProof(new byte[0], TestUtils.createRandomCommitment(), () -> CKZG4844JNI.verifyAggregateKzgProof(new byte[42], TestUtils.createRandomCommitment(),
1, TestUtils.createRandomProof(1))); 2, TestUtils.createRandomProof(2)));
assertEquals("Passing byte array with 0 elements for blobs is not supported.", assertEquals(CKZGError.C_KZG_BADARGS, exception.getError());
exception.getMessage()); assertEquals(String.format("Invalid blobs size. Expected %d bytes but got 42.",
CKZG4844JNI.getBytesPerBlob() * 2),
exception.getErrorMessage());
CKZG4844JNI.freeTrustedSetup(); CKZG4844JNI.freeTrustedSetup();
} }