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

Commit 51b0c18

Browse files
authored
Merge pull request #11 from dnet/master
replaced SodiumJNI with artisan bindings
2 parents cc7923b + 6d65f6a commit 51b0c18

File tree

2 files changed

+113
-1
lines changed

2 files changed

+113
-1
lines changed

src/jni.c

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include <jni.h>
22
#include "sphinx.h"
3+
#include <sodium.h>
34

45
JNIEXPORT void JNICALL Java_org_hsbp_androsphinx_Sphinx_challenge(JNIEnv *env, jobject ignore, jbyteArray pwd, jbyteArray salt, jbyteArray bfac, jbyteArray chal) {
56
jbyte* bufferPtrPwd = (*env)->GetByteArrayElements(env, pwd, NULL);
@@ -53,3 +54,114 @@ JNIEXPORT jbyteArray JNICALL Java_org_hsbp_androsphinx_Sphinx_finish(JNIEnv *env
5354

5455
return result ? NULL : rwd;
5556
}
57+
58+
JNIEXPORT jbyteArray JNICALL Java_org_hsbp_androsphinx_Sodium_genericHash(JNIEnv *env, jobject ignore, jbyteArray msg, jbyteArray salt) {
59+
jbyte* bufferPtrMsg = (*env)->GetByteArrayElements(env, msg, NULL);
60+
jbyte* bufferPtrSalt = (*env)->GetByteArrayElements(env, salt, NULL);
61+
jsize msgLen = (*env)->GetArrayLength(env, msg);
62+
jsize saltLen = (*env)->GetArrayLength(env, salt);
63+
64+
jbyteArray hash = (*env)->NewByteArray(env, crypto_generichash_BYTES);
65+
jbyte* bufferPtrHash = (*env)->GetByteArrayElements(env, hash, NULL);
66+
67+
crypto_generichash(bufferPtrHash, crypto_generichash_BYTES,
68+
bufferPtrMsg, msgLen, bufferPtrSalt, saltLen);
69+
70+
(*env)->ReleaseByteArrayElements(env, msg, bufferPtrMsg, JNI_ABORT);
71+
(*env)->ReleaseByteArrayElements(env, salt, bufferPtrSalt, JNI_ABORT);
72+
(*env)->ReleaseByteArrayElements(env, hash, bufferPtrHash, 0);
73+
74+
return hash;
75+
}
76+
77+
JNIEXPORT jbyteArray JNICALL Java_org_hsbp_androsphinx_Sodium_randomBytes(JNIEnv *env, jobject ignore, jint length) {
78+
jbyteArray result = (*env)->NewByteArray(env, length);
79+
jbyte* bufferPtrResult = (*env)->GetByteArrayElements(env, result, NULL);
80+
81+
randombytes_buf(bufferPtrResult, length);
82+
83+
(*env)->ReleaseByteArrayElements(env, result, bufferPtrResult, 0);
84+
85+
return result;
86+
}
87+
88+
JNIEXPORT jbyteArray JNICALL Java_org_hsbp_androsphinx_Sodium_cryptoSignSeedKeypair(JNIEnv *env, jobject ignore, jbyteArray seed) {
89+
unsigned char ignored_pk[crypto_sign_PUBLICKEYBYTES];
90+
91+
jbyteArray result = (*env)->NewByteArray(env, crypto_sign_SECRETKEYBYTES);
92+
jbyte* bufferPtrResult = (*env)->GetByteArrayElements(env, result, NULL);
93+
jbyte* bufferPtrSeed = (*env)->GetByteArrayElements(env, seed, NULL);
94+
95+
crypto_sign_seed_keypair(ignored_pk, bufferPtrResult, bufferPtrSeed);
96+
97+
(*env)->ReleaseByteArrayElements(env, result, bufferPtrResult, 0);
98+
(*env)->ReleaseByteArrayElements(env, seed, bufferPtrSeed, JNI_ABORT);
99+
100+
return result;
101+
}
102+
103+
JNIEXPORT jbyteArray JNICALL Java_org_hsbp_androsphinx_Sodium_cryptoSignEd25519SkToPk(JNIEnv *env, jobject ignore, jbyteArray sk) {
104+
jbyteArray result = (*env)->NewByteArray(env, crypto_sign_PUBLICKEYBYTES);
105+
jbyte* bufferPtrResult = (*env)->GetByteArrayElements(env, result, NULL);
106+
jbyte* bufferPtrSk = (*env)->GetByteArrayElements(env, sk, NULL);
107+
108+
crypto_sign_ed25519_sk_to_pk(bufferPtrResult, bufferPtrSk);
109+
110+
(*env)->ReleaseByteArrayElements(env, result, bufferPtrResult, 0);
111+
(*env)->ReleaseByteArrayElements(env, sk, bufferPtrSk, JNI_ABORT);
112+
113+
return result;
114+
}
115+
116+
JNIEXPORT jbyteArray JNICALL Java_org_hsbp_androsphinx_Sodium_cryptoSignDetached(JNIEnv *env, jobject ignore, jbyteArray sk, jbyteArray msg) {
117+
jbyteArray result = (*env)->NewByteArray(env, crypto_sign_BYTES);
118+
jbyte* bufferPtrResult = (*env)->GetByteArrayElements(env, result, NULL);
119+
jbyte* bufferPtrSk = (*env)->GetByteArrayElements(env, sk, NULL);
120+
jbyte* bufferPtrMsg = (*env)->GetByteArrayElements(env, msg, NULL);
121+
jsize msgLen = (*env)->GetArrayLength(env, msg);
122+
123+
unsigned long long ignored_siglen = crypto_sign_BYTES;
124+
125+
crypto_sign_detached(bufferPtrResult, &ignored_siglen, bufferPtrMsg, msgLen, bufferPtrSk);
126+
127+
(*env)->ReleaseByteArrayElements(env, result, bufferPtrResult, 0);
128+
(*env)->ReleaseByteArrayElements(env, sk, bufferPtrSk, JNI_ABORT);
129+
(*env)->ReleaseByteArrayElements(env, msg, bufferPtrMsg, JNI_ABORT);
130+
131+
return result;
132+
}
133+
134+
JNIEXPORT jbyteArray JNICALL Java_org_hsbp_androsphinx_Sodium_cryptoSecretboxEasy(JNIEnv *env, jobject ignore, jbyteArray key, jbyteArray msg) {
135+
jbyte* bufferPtrKey = (*env)->GetByteArrayElements(env, key, NULL);
136+
jbyte* bufferPtrMsg = (*env)->GetByteArrayElements(env, msg, NULL);
137+
jsize msgLen = (*env)->GetArrayLength(env, msg);
138+
139+
jbyteArray result = (*env)->NewByteArray(env, crypto_secretbox_NONCEBYTES + crypto_secretbox_MACBYTES + msgLen);
140+
jbyte* bufferPtrResult = (*env)->GetByteArrayElements(env, result, NULL);
141+
142+
randombytes_buf(bufferPtrResult, crypto_secretbox_NONCEBYTES);
143+
crypto_secretbox_easy(bufferPtrResult + crypto_secretbox_NONCEBYTES, bufferPtrMsg, msgLen, bufferPtrResult, bufferPtrKey);
144+
145+
(*env)->ReleaseByteArrayElements(env, result, bufferPtrResult, 0);
146+
(*env)->ReleaseByteArrayElements(env, msg, bufferPtrMsg, JNI_ABORT);
147+
(*env)->ReleaseByteArrayElements(env, key, bufferPtrKey, JNI_ABORT);
148+
149+
return result;
150+
}
151+
152+
JNIEXPORT jbyteArray JNICALL Java_org_hsbp_androsphinx_Sodium_cryptoSecretboxOpenEasy(JNIEnv *env, jobject ignore, jbyteArray key, jbyteArray msg) {
153+
jbyte* bufferPtrKey = (*env)->GetByteArrayElements(env, key, NULL);
154+
jbyte* bufferPtrMsg = (*env)->GetByteArrayElements(env, msg, NULL);
155+
jsize msgLen = (*env)->GetArrayLength(env, msg);
156+
157+
jbyteArray result = (*env)->NewByteArray(env, msgLen - (crypto_secretbox_NONCEBYTES + crypto_secretbox_MACBYTES));
158+
jbyte* bufferPtrResult = (*env)->GetByteArrayElements(env, result, NULL);
159+
160+
int sodium_result = crypto_secretbox_open_easy(bufferPtrResult, bufferPtrMsg + crypto_secretbox_NONCEBYTES, msgLen - crypto_secretbox_NONCEBYTES, bufferPtrMsg, bufferPtrKey);
161+
162+
(*env)->ReleaseByteArrayElements(env, result, bufferPtrResult, sodium_result ? JNI_ABORT : 0);
163+
(*env)->ReleaseByteArrayElements(env, msg, bufferPtrMsg, JNI_ABORT);
164+
(*env)->ReleaseByteArrayElements(env, key, bufferPtrKey, JNI_ABORT);
165+
166+
return sodium_result ? NULL : result;
167+
}

src/makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ win: win/libsodium-win64 exe libsphinx.$(SOEXT) tests$(EXT)
2020
exe: bin/challenge$(EXT) bin/respond$(EXT) bin/derive$(EXT)
2121

2222
android: INC=-I$(SODIUM) -I$(SODIUM)/sodium
23-
android: LIBS=-Wl,-Bstatic -Wl,-Bdynamic -lsodiumjni -L.
23+
android: LIBS=-Wl,-Bstatic -Wl,-Bdynamic -lsodium -L.
2424
android: EXTRA_OBJECTS=jni.o
2525
android: jni.o libsphinx.so
2626

0 commit comments

Comments
 (0)