Skip to content

Commit 46ff5a4

Browse files
authored
Merge pull request #205 from cconlon/fenrir
First pass Fenrir fixes
2 parents b664fef + 280995a commit 46ff5a4

18 files changed

Lines changed: 1143 additions & 74 deletions

jni/include/com_wolfssl_wolfcrypt_Curve25519.h

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jni/include/com_wolfssl_wolfcrypt_Ed25519.h

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jni/jni_chacha.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ Java_com_wolfssl_wolfcrypt_Chacha_wc_1Chacha_1process(
162162
if (ret == 0) {
163163
output = (byte*)XMALLOC(inputSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
164164
if (output == NULL) {
165+
releaseByteArray(env, input_obj, input, JNI_ABORT);
165166
throwOutOfMemoryException(env, "Failed to allocate key buffer");
166167
return result;
167168
}
@@ -188,6 +189,7 @@ Java_com_wolfssl_wolfcrypt_Chacha_wc_1Chacha_1process(
188189
}
189190

190191
LogStr("wc_Chacha_Process(): output = %p, ret = %d\n", output, ret);
192+
releaseByteArray(env, input_obj, input, JNI_ABORT);
191193
XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER);
192194
#else
193195
throwNotCompiledInException(env);

jni/jni_curve25519.c

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,11 @@ Java_com_wolfssl_wolfcrypt_Curve25519_wc_1curve25519_1export_1private(
278278
return NULL;
279279
}
280280

281+
if (curve25519 == NULL) {
282+
throwWolfCryptExceptionFromError(env, BAD_FUNC_ARG);
283+
return NULL;
284+
}
285+
281286
outputSz = wc_curve25519_size(curve25519);
282287

283288
output = XMALLOC(outputSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
@@ -287,9 +292,7 @@ Java_com_wolfssl_wolfcrypt_Curve25519_wc_1curve25519_1export_1private(
287292
}
288293
XMEMSET(output, 0, outputSz);
289294

290-
ret = (!curve25519)
291-
? BAD_FUNC_ARG
292-
: wc_curve25519_export_private_raw(curve25519, output, &outputSz);
295+
ret = wc_curve25519_export_private_raw(curve25519, output, &outputSz);
293296

294297
if (ret == 0) {
295298
result = (*env)->NewByteArray(env, outputSz);
@@ -334,6 +337,11 @@ Java_com_wolfssl_wolfcrypt_Curve25519_wc_1curve25519_1export_1public (
334337
return NULL;
335338
}
336339

340+
if (curve25519 == NULL) {
341+
throwWolfCryptExceptionFromError(env, BAD_FUNC_ARG);
342+
return NULL;
343+
}
344+
337345
outputSz = wc_curve25519_size(curve25519);
338346

339347
output = XMALLOC(outputSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
@@ -343,9 +351,7 @@ Java_com_wolfssl_wolfcrypt_Curve25519_wc_1curve25519_1export_1public (
343351
}
344352
XMEMSET(output, 0, outputSz);
345353

346-
ret = (!curve25519)
347-
? BAD_FUNC_ARG
348-
: wc_curve25519_export_public(curve25519, output, &outputSz);
354+
ret = wc_curve25519_export_public(curve25519, output, &outputSz);
349355

350356
if (ret == 0) {
351357
result = (*env)->NewByteArray(env, outputSz);
@@ -397,18 +403,21 @@ Java_com_wolfssl_wolfcrypt_Curve25519_wc_1curve25519_1make_1shared_1secret(
397403
return NULL;
398404
}
399405

406+
if (curve25519 == NULL || pub == NULL) {
407+
throwWolfCryptExceptionFromError(env, BAD_FUNC_ARG);
408+
return NULL;
409+
}
410+
400411
outputSz = wc_curve25519_size(curve25519);
401412
output = XMALLOC(outputSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
402413
if (output == NULL) {
403414
throwOutOfMemoryException(env,
404-
"Failed to allocate shared secret buffer");
415+
"Failed to allocate shared secret buffer");
405416
return result;
406417
}
407418
XMEMSET(output, 0, outputSz);
408419

409-
ret = (!curve25519 || !pub)
410-
? BAD_FUNC_ARG
411-
: wc_curve25519_shared_secret(curve25519, pub, output, &outputSz);
420+
ret = wc_curve25519_shared_secret(curve25519, pub, output, &outputSz);
412421

413422
if (ret == 0) {
414423
result = (*env)->NewByteArray(env, outputSz);

jni/jni_ecc.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,6 +1181,13 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Ecc_wc_1ecc_1get_1curve_1id_1f
11811181
}
11821182

11831183
LogStr("wc_ecc_get_curve_id_from_params() = %d\n", ret);
1184+
1185+
releaseByteArray(env, prime_object, prime, JNI_ABORT);
1186+
releaseByteArray(env, af_object, Af, JNI_ABORT);
1187+
releaseByteArray(env, bf_object, Bf, JNI_ABORT);
1188+
releaseByteArray(env, order_object, order, JNI_ABORT);
1189+
releaseByteArray(env, gx_object, Gx, JNI_ABORT);
1190+
releaseByteArray(env, gy_object, Gy, JNI_ABORT);
11841191
#else
11851192
throwNotCompiledInException(env);
11861193
#endif

jni/jni_ed25519.c

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,11 @@ Java_com_wolfssl_wolfcrypt_Ed25519_wc_1ed25519_1export_1private(
303303
return NULL;
304304
}
305305

306+
if (ed25519 == NULL) {
307+
throwWolfCryptExceptionFromError(env, BAD_FUNC_ARG);
308+
return NULL;
309+
}
310+
306311
outputSz = 2 * wc_ed25519_priv_size(ed25519); /* Export private + public */
307312

308313
output = XMALLOC(outputSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
@@ -312,9 +317,7 @@ Java_com_wolfssl_wolfcrypt_Ed25519_wc_1ed25519_1export_1private(
312317
}
313318
XMEMSET(output, 0, outputSz);
314319

315-
ret = (!ed25519)
316-
? BAD_FUNC_ARG
317-
: wc_ed25519_export_private(ed25519, output, &outputSz);
320+
ret = wc_ed25519_export_private(ed25519, output, &outputSz);
318321

319322
if (ret == 0) {
320323
result = (*env)->NewByteArray(env, outputSz);
@@ -359,6 +362,11 @@ Java_com_wolfssl_wolfcrypt_Ed25519_wc_1ed25519_1export_1private_1only(
359362
return NULL;
360363
}
361364

365+
if (ed25519 == NULL) {
366+
throwWolfCryptExceptionFromError(env, BAD_FUNC_ARG);
367+
return NULL;
368+
}
369+
362370
outputSz = wc_ed25519_size(ed25519);
363371

364372
output = XMALLOC(outputSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
@@ -368,9 +376,7 @@ Java_com_wolfssl_wolfcrypt_Ed25519_wc_1ed25519_1export_1private_1only(
368376
}
369377
XMEMSET(output, 0, outputSz);
370378

371-
ret = (!ed25519)
372-
? BAD_FUNC_ARG
373-
: wc_ed25519_export_private_only(ed25519, output, &outputSz);
379+
ret = wc_ed25519_export_private_only(ed25519, output, &outputSz);
374380

375381
if (ret == 0) {
376382
result = (*env)->NewByteArray(env, outputSz);
@@ -415,6 +421,11 @@ Java_com_wolfssl_wolfcrypt_Ed25519_wc_1ed25519_1export_1public(
415421
return NULL;
416422
}
417423

424+
if (ed25519 == NULL) {
425+
throwWolfCryptExceptionFromError(env, BAD_FUNC_ARG);
426+
return NULL;
427+
}
428+
418429
outputSz = wc_ed25519_size(ed25519);
419430

420431
output = XMALLOC(outputSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
@@ -424,9 +435,7 @@ Java_com_wolfssl_wolfcrypt_Ed25519_wc_1ed25519_1export_1public(
424435
}
425436
XMEMSET(output, 0, outputSz);
426437

427-
ret = (!ed25519)
428-
? BAD_FUNC_ARG
429-
: wc_ed25519_export_public(ed25519, output, &outputSz);
438+
ret = wc_ed25519_export_public(ed25519, output, &outputSz);
430439

431440
if (ret == 0) {
432441
result = (*env)->NewByteArray(env, outputSz);
@@ -504,7 +513,6 @@ JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_wolfcrypt_Ed25519_wc_1ed25519_1sig
504513
}
505514

506515
LogStr("wc_ed25519_sign_msg(ed25519=%p) = %d\n", ed25519, ret);
507-
printf("wc_ed25519_sign_msg(ed25519=%p) = %d\n", ed25519, ret);
508516
XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER);
509517

510518
releaseByteArray(env, msg_in, msg, JNI_ABORT);
@@ -535,7 +543,7 @@ JNIEXPORT jboolean JNICALL Java_com_wolfssl_wolfcrypt_Ed25519_wc_1ed25519_1verif
535543
sig = getByteArray(env, sig_in);
536544
msg = getByteArray(env, msg_in);
537545
msglen = getByteArrayLength(env, msg_in);
538-
siglen = getByteArrayLength(env, msg_in);
546+
siglen = getByteArrayLength(env, sig_in);
539547

540548
if (!ed25519) {
541549
ret = BAD_FUNC_ARG;

jni/jni_fips.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,7 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Fips_wc_1AesGcmSetExtIV_1fips_
588588
iv = getByteArray(env, iv_buffer);
589589

590590
if (aes == NULL || iv == NULL || size < 0) {
591+
releaseByteArray(env, iv_buffer, iv, JNI_ABORT);
591592
return BAD_FUNC_ARG;
592593
}
593594

jni/jni_hmac.c

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -211,18 +211,24 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Hmac_wc_1HmacUpdate___3BII
211211
int ret = 0;
212212
Hmac* hmac = NULL;
213213
byte* data = NULL;
214+
word32 dataSz = 0;
214215

215216
hmac = (Hmac*) getNativeStruct(env, this);
216217
if ((*env)->ExceptionOccurred(env)) {
217218
/* getNativeStruct may throw exception, prevent throwing another */
218219
return;
219220
}
220221

221-
data = getByteArray(env, data_object);
222+
data = getByteArray(env, data_object);
223+
dataSz = getByteArrayLength(env, data_object);
222224

223-
ret = (!hmac || !data)
224-
? BAD_FUNC_ARG
225-
: wc_HmacUpdate(hmac, data + offset, length);
225+
if (!hmac || !data || offset < 0 || length < 0 ||
226+
((word32)offset + (word32)length) > dataSz) {
227+
ret = BAD_FUNC_ARG;
228+
}
229+
else {
230+
ret = wc_HmacUpdate(hmac, data + offset, length);
231+
}
226232

227233
if (ret != 0)
228234
throwWolfCryptExceptionFromError(env, ret);
@@ -244,6 +250,7 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Hmac_wc_1HmacUpdate__Ljava_nio
244250
int ret = 0;
245251
Hmac* hmac = NULL;
246252
byte* data = NULL;
253+
jlong dataSz = 0;
247254

248255
hmac = (Hmac*) getNativeStruct(env, this);
249256
if ((*env)->ExceptionOccurred(env)) {
@@ -252,10 +259,15 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Hmac_wc_1HmacUpdate__Ljava_nio
252259
}
253260

254261
data = getDirectBufferAddress(env, data_object);
262+
dataSz = (*env)->GetDirectBufferCapacity(env, data_object);
255263

256-
ret = (!hmac || !data)
257-
? BAD_FUNC_ARG
258-
: wc_HmacUpdate(hmac, data + offset, length);
264+
if (!hmac || !data || offset < 0 || length < 0 ||
265+
((jlong)offset + (jlong)length) > dataSz) {
266+
ret = BAD_FUNC_ARG;
267+
}
268+
else {
269+
ret = wc_HmacUpdate(hmac, data + offset, length);
270+
}
259271

260272
if (ret != 0)
261273
throwWolfCryptExceptionFromError(env, ret);
@@ -284,17 +296,20 @@ JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_wolfcrypt_Hmac_wc_1HmacFinal
284296
/* getNativeStruct may throw exception, prevent throwing another */
285297
return NULL;
286298
}
299+
300+
if (!hmac) {
301+
throwWolfCryptExceptionFromError(env, BAD_FUNC_ARG);
302+
return result;
303+
}
304+
287305
hmacSz = GetHashSizeByType(hmac->macType);
288306

289307
if (hmacSz < 0) {
290-
throwWolfCryptExceptionFromError(env, ret);
308+
throwWolfCryptExceptionFromError(env, hmacSz);
291309
return result;
292310
}
293311

294-
ret = (!hmac)
295-
? BAD_FUNC_ARG
296-
: wc_HmacFinal(hmac, tmp);
297-
312+
ret = wc_HmacFinal(hmac, tmp);
298313
if (ret == 0) {
299314
result = (*env)->NewByteArray(env, hmacSz);
300315

jni/jni_pwdbased.c

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,12 @@ JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_wolfcrypt_Pwdbased_wc_1PKCS12_1PBK
5959
}
6060
XMEMSET(outKey, 0, kLen);
6161

62-
pass = (byte*)(*env)->GetByteArrayElements(env, passBuf, NULL);
63-
salt = (byte*)(*env)->GetByteArrayElements(env, saltBuf, NULL);
62+
if (passBuf != NULL) {
63+
pass = (byte*)(*env)->GetByteArrayElements(env, passBuf, NULL);
64+
}
65+
if (saltBuf != NULL) {
66+
salt = (byte*)(*env)->GetByteArrayElements(env, saltBuf, NULL);
67+
}
6468

6569
ret = wc_PKCS12_PBKDF(outKey, pass, passBufLen, salt, sBufLen,
6670
iterations, kLen, typeH, id);
@@ -80,8 +84,12 @@ JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_wolfcrypt_Pwdbased_wc_1PKCS12_1PBK
8084
XFREE(outKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
8185
}
8286

83-
(*env)->ReleaseByteArrayElements(env, passBuf, (jbyte*)pass, JNI_ABORT);
84-
(*env)->ReleaseByteArrayElements(env, saltBuf, (jbyte*)salt, JNI_ABORT);
87+
if (pass != NULL) {
88+
(*env)->ReleaseByteArrayElements(env, passBuf, (jbyte*)pass, JNI_ABORT);
89+
}
90+
if (salt != NULL) {
91+
(*env)->ReleaseByteArrayElements(env, saltBuf, (jbyte*)salt, JNI_ABORT);
92+
}
8593

8694
if (ret != 0) {
8795
throwWolfCryptExceptionFromError(env, ret);
@@ -133,7 +141,9 @@ JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_wolfcrypt_Pwdbased_wc_1PBKDF2
133141
pass = (byte*)(*env)->GetByteArrayElements(env, passBuf, NULL);
134142
}
135143

136-
salt = (byte*)(*env)->GetByteArrayElements(env, saltBuf, NULL);
144+
if (saltBuf != NULL) {
145+
salt = (byte*)(*env)->GetByteArrayElements(env, saltBuf, NULL);
146+
}
137147

138148
ret = wc_PBKDF2(outKey, pass, passBufLen, salt, sBufLen,
139149
iterations, kLen, hashType);
@@ -156,8 +166,9 @@ JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_wolfcrypt_Pwdbased_wc_1PBKDF2
156166
if (pass != NULL) {
157167
(*env)->ReleaseByteArrayElements(env, passBuf, (jbyte*)pass, JNI_ABORT);
158168
}
159-
160-
(*env)->ReleaseByteArrayElements(env, saltBuf, (jbyte*)salt, JNI_ABORT);
169+
if (salt != NULL) {
170+
(*env)->ReleaseByteArrayElements(env, saltBuf, (jbyte*)salt, JNI_ABORT);
171+
}
161172

162173
if (ret != 0) {
163174
throwWolfCryptExceptionFromError(env, ret);

0 commit comments

Comments
 (0)