Skip to content

Commit 4affcac

Browse files
committed
JNI: fix potential JNI level ECC issues
1 parent d027842 commit 4affcac

File tree

1 file changed

+18
-11
lines changed

1 file changed

+18
-11
lines changed

jni/jni_ecc.c

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -157,31 +157,33 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Ecc_wc_1ecc_1make_1key_1ex
157157
int ret = 0;
158158
ecc_key* ecc = NULL;
159159
RNG* rng = NULL;
160-
const char* name = (*env)->GetStringUTFChars(env, curveName, 0);
160+
const char* name;
161161

162162
ecc = (ecc_key*) getNativeStruct(env, this);
163163
if ((*env)->ExceptionOccurred(env)) {
164164
/* getNativeStruct may throw exception, prevent throwing another */
165-
(*env)->ReleaseStringUTFChars(env, curveName, name);
166165
return;
167166
}
168167

169168
rng = (RNG*) getNativeStruct(env, rng_object);
170169
if ((*env)->ExceptionOccurred(env)) {
171170
/* getNativeStruct may throw exception, prevent throwing another */
172-
(*env)->ReleaseStringUTFChars(env, curveName, name);
173171
return;
174172
}
175173

176-
if (ecc == NULL || rng == NULL || curveName == NULL || name == NULL) {
174+
if (ecc == NULL || rng == NULL || curveName == NULL) {
177175
ret = BAD_FUNC_ARG;
178176
}
179177

180178
if (ret == 0) {
181-
ret = wc_ecc_get_curve_id_from_name(name);
179+
name = (*env)->GetStringUTFChars(env, curveName, 0);
180+
if (name == NULL) {
181+
ret = BAD_FUNC_ARG;
182+
}
182183
}
183184

184-
if (name != NULL) {
185+
if (ret == 0) {
186+
ret = wc_ecc_get_curve_id_from_name(name);
185187
(*env)->ReleaseStringUTFChars(env, curveName, name);
186188
}
187189

@@ -264,10 +266,17 @@ JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Ecc_wc_1ecc_1import_1private
264266

265267
if (ret == 0) {
266268
/* detect, and later skip, leading zero byte */
267-
if (priv[0] == 0) {
269+
if ((privSz > 0) && (priv[0] == 0)) {
268270
idx = 1;
269271
}
270272

273+
/* sanity check privSz is big enough to read to idx */
274+
if (privSz <= idx) {
275+
ret = BAD_FUNC_ARG;
276+
}
277+
}
278+
279+
if (ret == 0) {
271280
if (curveName != NULL) {
272281
name = (*env)->GetStringUTFChars(env, curveName, 0);
273282
ret = wc_ecc_get_curve_id_from_name(name);
@@ -333,7 +342,7 @@ Java_com_wolfssl_wolfcrypt_Ecc_wc_1ecc_1export_1private(
333342
ret = MEMORY_E;
334343
}
335344
else {
336-
XMEMSET(output, 0, sizeof(outputSz));
345+
XMEMSET(output, 0, outputSz);
337346
}
338347
}
339348

@@ -1017,9 +1026,7 @@ JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_wolfcrypt_Ecc_wc_1ecc_1private_1ke
10171026
byte* pkcs8 = NULL;
10181027
word32 derKeySz = MAX_ECC_PRIVATE_DER_SZ;
10191028
word32 pkcs8Sz = 0;
1020-
10211029
word32 derKeyBufSz = 0;
1022-
word32 pkcs8BufSz = 0;
10231030

10241031
int algoID = ECDSAk;
10251032
word32 oidSz = 0;
@@ -1113,7 +1120,7 @@ JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_wolfcrypt_Ecc_wc_1ecc_1private_1ke
11131120
XFREE(derKey, NULL, DYNAMIC_TYPE_TMP_BUFFER);
11141121
}
11151122
if (pkcs8 != NULL) {
1116-
XMEMSET(pkcs8, 0, pkcs8BufSz);
1123+
XMEMSET(pkcs8, 0, pkcs8Sz);
11171124
XFREE(pkcs8, NULL, DYNAMIC_TYPE_TMP_BUFFER);
11181125
}
11191126

0 commit comments

Comments
 (0)