]> gitweb.ps.run Git - matrix_esp_thesis/blob - ext/olm/lib/curve25519-donna/contrib/Curve25519Donna.c
add dependencies to repo
[matrix_esp_thesis] / ext / olm / lib / curve25519-donna / contrib / Curve25519Donna.c
1 /*
2     James Robson
3     Public domain.
4 */
5
6 #include "Curve25519Donna.h"
7 #include <stdio.h>
8 #include <stdlib.h>
9
10 extern void curve25519_donna(unsigned char *output, const unsigned char *a,
11                              const unsigned char *b);
12
13 unsigned char*
14 as_unsigned_char_array(JNIEnv* env, jbyteArray array, int* len);
15
16 jbyteArray as_byte_array(JNIEnv* env, unsigned char* buf, int len);
17
18
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);
22
23     //int i;
24     //for (i = 0;i < len;++i) printf("%02x",(unsigned int) buf[i]); printf(" ");
25     //printf("\n");
26
27     return array;
28 }
29
30 unsigned char*
31 as_unsigned_char_array(JNIEnv* env, jbyteArray array, int* len) {
32
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);
36     return buf;
37
38 }
39
40 JNIEXPORT jbyteArray JNICALL Java_Curve25519Donna_curve25519Donna
41   (JNIEnv *env, jobject obj, jbyteArray a, jbyteArray b) {
42
43     unsigned char o[32] = {0};
44     int l1, l2;
45     unsigned char* a1 = as_unsigned_char_array(env, a, &l1);
46     unsigned char* b1 = as_unsigned_char_array(env, b, &l2);
47
48     if ( !(l1 == 32 && l2 == 32) ) {
49         fprintf(stderr, "Error, must be length 32");
50         return NULL;
51     }
52
53
54     curve25519_donna(o, (const unsigned char*)a1, (const unsigned char*)b1);
55
56     free(a1);
57     free(b1);
58
59     return as_byte_array(env, (unsigned char*)o, 32);
60 }
61
62 JNIEXPORT jbyteArray JNICALL Java_Curve25519Donna_makePrivate
63   (JNIEnv *env, jobject obj, jbyteArray secret) {
64
65     int len;
66     unsigned char* k = as_unsigned_char_array(env, secret, &len);
67
68     if (len != 32) {
69         fprintf(stderr, "Error, must be length 32");        
70         return NULL;
71     }
72
73     k[0] &= 248;
74     k[31] &= 127;
75     k[31] |= 64;
76     return as_byte_array(env, k, 32);
77 }
78
79 JNIEXPORT jbyteArray JNICALL Java_Curve25519Donna_getPublic
80   (JNIEnv *env, jobject obj, jbyteArray privkey) {
81
82     int len;
83     unsigned char* private = as_unsigned_char_array(env, privkey, &len);
84
85     if (len != 32) {
86         fprintf(stderr, "Error, must be length 32");        
87         return NULL;
88     }
89
90     unsigned char pubkey[32];
91     unsigned char basepoint[32] = {9};
92
93     curve25519_donna(pubkey, private, basepoint);
94     return as_byte_array(env, (unsigned char*)pubkey, 32);
95 }
96
97 JNIEXPORT jbyteArray JNICALL Java_Curve25519Donna_makeSharedSecret
98   (JNIEnv *env, jobject obj, jbyteArray privkey, jbyteArray their_pubkey) {
99
100     unsigned char shared_secret[32];
101
102     int l1, l2;
103     unsigned char* private = as_unsigned_char_array(env, privkey, &l1);
104     unsigned char* pubkey = as_unsigned_char_array(env, their_pubkey, &l2);
105
106     if ( !(l1 == 32 && l2 == 32) ) {
107         fprintf(stderr, "Error, must be length 32");
108         return NULL;
109     }
110
111     curve25519_donna(shared_secret, private, pubkey);
112     return as_byte_array(env, (unsigned char*)shared_secret, 32);
113 }
114
115 JNIEXPORT void JNICALL Java_Curve25519Donna_helowrld
116   (JNIEnv *env, jobject obj) {
117     printf("helowrld\n");
118 }