Skip to content
This repository was archived by the owner on Jan 31, 2025. It is now read-only.

Commit a51922a

Browse files
authored
Merge pull request #13 from dnet/jni-aead
replaced secretbox with AEAD in JNI binding
2 parents f4e96c4 + 7eae1c4 commit a51922a

File tree

1 file changed

+20
-9
lines changed

1 file changed

+20
-9
lines changed

src/jni.c

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -133,35 +133,46 @@ JNIEXPORT jbyteArray JNICALL Java_org_hsbp_androsphinx_Sodium_cryptoSignDetached
133133
return result;
134134
}
135135

136-
JNIEXPORT jbyteArray JNICALL Java_org_hsbp_androsphinx_Sodium_cryptoSecretboxEasy(JNIEnv *env, jobject ignore, jbyteArray key, jbyteArray msg) {
136+
JNIEXPORT jbyteArray JNICALL Java_org_hsbp_androsphinx_Sodium_cryptoAeadXchachaPoly1305IetfEasy(JNIEnv *env, jobject ignore, jbyteArray msg, jbyteArray ad, jbyteArray key) {
137137
jbyte* bufferPtrKey = (*env)->GetByteArrayElements(env, key, NULL);
138138
jbyte* bufferPtrMsg = (*env)->GetByteArrayElements(env, msg, NULL);
139+
jbyte* bufferPtrAd = (*env)->GetByteArrayElements(env, ad, NULL);
139140
jsize msgLen = (*env)->GetArrayLength(env, msg);
141+
jsize adLen = (*env)->GetArrayLength(env, ad);
140142

141-
jbyteArray result = (*env)->NewByteArray(env, crypto_secretbox_NONCEBYTES + crypto_secretbox_MACBYTES + msgLen);
143+
jbyteArray result = (*env)->NewByteArray(env, crypto_aead_xchacha20poly1305_ietf_NPUBBYTES + msgLen + crypto_aead_xchacha20poly1305_ietf_ABYTES);
142144
jbyte* bufferPtrResult = (*env)->GetByteArrayElements(env, result, NULL);
143145

144-
randombytes_buf(bufferPtrResult, crypto_secretbox_NONCEBYTES);
145-
crypto_secretbox_easy(bufferPtrResult + crypto_secretbox_NONCEBYTES, bufferPtrMsg, msgLen, bufferPtrResult, bufferPtrKey);
146+
randombytes_buf(bufferPtrResult, crypto_aead_xchacha20poly1305_ietf_NPUBBYTES);
146147

147-
(*env)->ReleaseByteArrayElements(env, result, bufferPtrResult, 0);
148+
int sodium_result = crypto_aead_xchacha20poly1305_ietf_encrypt(bufferPtrResult + crypto_aead_xchacha20poly1305_ietf_NPUBBYTES,
149+
NULL, bufferPtrMsg, msgLen, bufferPtrAd, adLen, NULL, bufferPtrResult, bufferPtrKey);
150+
151+
(*env)->ReleaseByteArrayElements(env, result, bufferPtrResult, sodium_result ? JNI_ABORT : 0);
152+
(*env)->ReleaseByteArrayElements(env, ad, bufferPtrAd , JNI_ABORT);
148153
(*env)->ReleaseByteArrayElements(env, msg, bufferPtrMsg, JNI_ABORT);
149154
(*env)->ReleaseByteArrayElements(env, key, bufferPtrKey, JNI_ABORT);
150155

151-
return result;
156+
return sodium_result ? NULL : result;
152157
}
153158

154-
JNIEXPORT jbyteArray JNICALL Java_org_hsbp_androsphinx_Sodium_cryptoSecretboxOpenEasy(JNIEnv *env, jobject ignore, jbyteArray key, jbyteArray msg) {
159+
JNIEXPORT jbyteArray JNICALL Java_org_hsbp_androsphinx_Sodium_cryptoAeadXchachaPoly1305IetfOpenEasy(JNIEnv *env, jobject ignore, jbyteArray msg, jbyteArray ad, jbyteArray key) {
155160
jbyte* bufferPtrKey = (*env)->GetByteArrayElements(env, key, NULL);
156161
jbyte* bufferPtrMsg = (*env)->GetByteArrayElements(env, msg, NULL);
162+
jbyte* bufferPtrAd = (*env)->GetByteArrayElements(env, ad, NULL);
157163
jsize msgLen = (*env)->GetArrayLength(env, msg);
164+
jsize adLen = (*env)->GetArrayLength(env, ad);
158165

159-
jbyteArray result = (*env)->NewByteArray(env, msgLen - (crypto_secretbox_NONCEBYTES + crypto_secretbox_MACBYTES));
166+
jbyteArray result = (*env)->NewByteArray(env, msgLen - (crypto_aead_xchacha20poly1305_ietf_NPUBBYTES + crypto_aead_xchacha20poly1305_ietf_ABYTES));
160167
jbyte* bufferPtrResult = (*env)->GetByteArrayElements(env, result, NULL);
161168

162-
int sodium_result = crypto_secretbox_open_easy(bufferPtrResult, bufferPtrMsg + crypto_secretbox_NONCEBYTES, msgLen - crypto_secretbox_NONCEBYTES, bufferPtrMsg, bufferPtrKey);
169+
int sodium_result = crypto_aead_xchacha20poly1305_ietf_decrypt(bufferPtrResult,
170+
NULL, NULL, bufferPtrMsg + crypto_aead_xchacha20poly1305_ietf_NPUBBYTES,
171+
msgLen - crypto_aead_xchacha20poly1305_ietf_NPUBBYTES,
172+
bufferPtrAd, adLen, bufferPtrMsg, bufferPtrKey);
163173

164174
(*env)->ReleaseByteArrayElements(env, result, bufferPtrResult, sodium_result ? JNI_ABORT : 0);
175+
(*env)->ReleaseByteArrayElements(env, ad, bufferPtrAd , JNI_ABORT);
165176
(*env)->ReleaseByteArrayElements(env, msg, bufferPtrMsg, JNI_ABORT);
166177
(*env)->ReleaseByteArrayElements(env, key, bufferPtrKey, JNI_ABORT);
167178

0 commit comments

Comments
 (0)