6 #include "Curve25519Donna.h"
10 extern void curve25519_donna(unsigned char *output, const unsigned char *a,
11 const unsigned char *b);
14 as_unsigned_char_array(JNIEnv* env, jbyteArray array, int* len);
16 jbyteArray as_byte_array(JNIEnv* env, unsigned char* buf, int len);
19 jbyteArray as_byte_array(JNIEnv* env, unsigned char* buf, int len) {
20 jbyteArray array = (*env)->NewByteArray(env, len);
21 (*env)->SetByteArrayRegion(env, array, 0, len, (jbyte*)buf);
24 //for (i = 0;i < len;++i) printf("%02x",(unsigned int) buf[i]); printf(" ");
31 as_unsigned_char_array(JNIEnv* env, jbyteArray array, int* len) {
33 *len = (*env)->GetArrayLength(env, array);
34 unsigned char* buf = (unsigned char*)calloc(*len+1, sizeof(char));
35 (*env)->GetByteArrayRegion (env, array, 0, *len, (jbyte*)buf);
40 JNIEXPORT jbyteArray JNICALL Java_Curve25519Donna_curve25519Donna
41 (JNIEnv *env, jobject obj, jbyteArray a, jbyteArray b) {
43 unsigned char o[32] = {0};
45 unsigned char* a1 = as_unsigned_char_array(env, a, &l1);
46 unsigned char* b1 = as_unsigned_char_array(env, b, &l2);
48 if ( !(l1 == 32 && l2 == 32) ) {
49 fprintf(stderr, "Error, must be length 32");
54 curve25519_donna(o, (const unsigned char*)a1, (const unsigned char*)b1);
59 return as_byte_array(env, (unsigned char*)o, 32);
62 JNIEXPORT jbyteArray JNICALL Java_Curve25519Donna_makePrivate
63 (JNIEnv *env, jobject obj, jbyteArray secret) {
66 unsigned char* k = as_unsigned_char_array(env, secret, &len);
69 fprintf(stderr, "Error, must be length 32");
76 return as_byte_array(env, k, 32);
79 JNIEXPORT jbyteArray JNICALL Java_Curve25519Donna_getPublic
80 (JNIEnv *env, jobject obj, jbyteArray privkey) {
83 unsigned char* private = as_unsigned_char_array(env, privkey, &len);
86 fprintf(stderr, "Error, must be length 32");
90 unsigned char pubkey[32];
91 unsigned char basepoint[32] = {9};
93 curve25519_donna(pubkey, private, basepoint);
94 return as_byte_array(env, (unsigned char*)pubkey, 32);
97 JNIEXPORT jbyteArray JNICALL Java_Curve25519Donna_makeSharedSecret
98 (JNIEnv *env, jobject obj, jbyteArray privkey, jbyteArray their_pubkey) {
100 unsigned char shared_secret[32];
103 unsigned char* private = as_unsigned_char_array(env, privkey, &l1);
104 unsigned char* pubkey = as_unsigned_char_array(env, their_pubkey, &l2);
106 if ( !(l1 == 32 && l2 == 32) ) {
107 fprintf(stderr, "Error, must be length 32");
111 curve25519_donna(shared_secret, private, pubkey);
112 return as_byte_array(env, (unsigned char*)shared_secret, 32);
115 JNIEXPORT void JNICALL Java_Curve25519Donna_helowrld
116 (JNIEnv *env, jobject obj) {
117 printf("helowrld\n");