forked from open-quantum-safe/liboqs-java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSignature.c
More file actions
254 lines (213 loc) · 11 KB
/
Signature.c
File metadata and controls
254 lines (213 loc) · 11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
#include <oqs/oqs.h>
#include "Signature.h"
#include "handle.h"
/*
* Class: org_openquantumsafe_Signature
* Method: create_sig_new
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_org_openquantumsafe_Signature_create_1sig_1new
(JNIEnv *env, jobject obj, jstring jstr)
{
// Create get a liboqs::OQS_SIG pointer
const char *str_native = (*env)->GetStringUTFChars(env, jstr, 0);
OQS_SIG *sig = OQS_SIG_new(str_native);
(*env)->ReleaseStringUTFChars(env, jstr, str_native);
// Stow the native OQS_SIG pointer in the Java handle.
setHandle(env, obj, sig, "native_sig_handle_");
}
/*
* Class: org_openquantumsafe_Signature
* Method: free_sig
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_org_openquantumsafe_Signature_free_1sig
(JNIEnv *env, jobject obj)
{
OQS_SIG *sig = (OQS_SIG *) getHandle(env, obj, "native_sig_handle_");
OQS_SIG_free(sig);
}
/*
* Class: org_openquantumsafe_Signature
* Method: get_sig_details
* Signature: ()Lorg/openquantumsafe/Signature/SignatureDetails;
*/
JNIEXPORT jobject JNICALL Java_org_openquantumsafe_Signature_get_1sig_1details
(JNIEnv *env, jobject obj)
{
jclass cls = (*env)->FindClass(env, "org/openquantumsafe/Signature$SignatureDetails");
if (cls == NULL) { fprintf(stderr, "\nCould not find class\n"); return NULL; }
// Get the Method ID of the constructor
jmethodID constructor_meth_id_ = (*env)->GetMethodID(env, cls, "<init>", "(Lorg/openquantumsafe/Signature;)V");
if (NULL == constructor_meth_id_) { fprintf(stderr, "\nCould not initialize class\n"); return NULL; }
// Call back constructor to allocate a new instance, with an int argument
jobject _nativeKED = (*env)->NewObject(env, cls, constructor_meth_id_, obj);
OQS_SIG *sig = (OQS_SIG *) getHandle(env, obj, "native_sig_handle_");
// Copy fields from C struct to Java class
// String method_name;
jfieldID _method_name = (*env)->GetFieldID(env, cls, "method_name", "Ljava/lang/String;");
jstring j_method_name = (*env)->NewStringUTF(env, sig->method_name);
(*env)->SetObjectField(env, _nativeKED, _method_name, j_method_name);
// String alg_version;
jfieldID _alg_version = (*env)->GetFieldID(env, cls, "alg_version", "Ljava/lang/String;");
jstring j_alg_version = (*env)->NewStringUTF(env, sig->alg_version);
(*env)->SetObjectField(env, _nativeKED, _alg_version, j_alg_version);
// byte claimed_nist_level;
jfieldID _claimed_nist_level = (*env)->GetFieldID(env, cls, "claimed_nist_level", "B");
(*env)->SetByteField(env, _nativeKED, _claimed_nist_level, (jbyte) sig->claimed_nist_level);
// boolean is_euf_cma;
jfieldID _is_euf_cma = (*env)->GetFieldID(env, cls, "is_euf_cma", "Z");
(*env)->SetBooleanField(env, _nativeKED, _is_euf_cma, (jboolean) sig->euf_cma);
// long length_public_key;
jfieldID _length_public_key = (*env)->GetFieldID(env, cls, "length_public_key", "J");
(*env)->SetLongField(env, _nativeKED, _length_public_key, (jlong) sig->length_public_key);
// long length_secret_key;
jfieldID _length_secret_key = (*env)->GetFieldID(env, cls, "length_secret_key", "J");
(*env)->SetLongField(env, _nativeKED, _length_secret_key, (jlong) sig->length_secret_key);
// long max_length_signature;
jfieldID _max_length_signature = (*env)->GetFieldID(env, cls, "max_length_signature", "J");
(*env)->SetLongField(env, _nativeKED, _max_length_signature, (jlong) sig->length_signature);
return _nativeKED;
}
/*
* Class: org_openquantumsafe_Signature
* Method: generate_keypair
* Signature: ([B[B)I
*/
JNIEXPORT jint JNICALL Java_org_openquantumsafe_Signature_generate_1keypair
(JNIEnv *env, jobject obj, jbyteArray jpublic_key, jbyteArray jsecret_key)
{
jbyte *public_key_native = (*env)->GetByteArrayElements(env, jpublic_key, 0);
jbyte *secret_key_native = (*env)->GetByteArrayElements(env, jsecret_key, 0);
// Get pointer to sig
OQS_SIG *sig = (OQS_SIG *) getHandle(env, obj, "native_sig_handle_");
// Invoke liboqs sig keypair generation function
OQS_STATUS rv_ = OQS_SIG_keypair(sig, (uint8_t*) public_key_native, (uint8_t*) secret_key_native);
(*env)->ReleaseByteArrayElements(env, jpublic_key, public_key_native, 0);
(*env)->ReleaseByteArrayElements(env, jsecret_key, secret_key_native, 0);
return (rv_ == OQS_SUCCESS) ? 0 : -1;
}
/*
* Class: org_openquantumsafe_Signature
* Method: sign
* Signature: ([BLjava/lang/Long;[BJ[B)I
*/
JNIEXPORT jint JNICALL Java_org_openquantumsafe_Signature_sign
(JNIEnv * env, jobject obj, jbyteArray jsignature, jobject sig_len_obj,
jbyteArray jmessage, jlong message_len, jbyteArray jsecret_key)
{
// Convert to jbyte arrays
jbyte *signature_native = (*env)->GetByteArrayElements(env, jsignature, 0);
jbyte *message_native = (*env)->GetByteArrayElements(env, jmessage, 0);
jbyte *secret_key_native = (*env)->GetByteArrayElements(env, jsecret_key, 0);
OQS_SIG *sig = (OQS_SIG *) getHandle(env, obj, "native_sig_handle_");
size_t len_sig;
OQS_STATUS rv_ = OQS_SIG_sign(sig, (uint8_t*)signature_native, &len_sig,
(uint8_t*)message_native, message_len,
(uint8_t*)secret_key_native);
// fill java signature bytes
(*env)->SetByteArrayRegion(env, jsignature, 0, len_sig, (jbyte*) signature_native);
// fill java object signature length
jfieldID value_fid = (*env)->GetFieldID(env,
(*env)->GetObjectClass(env, sig_len_obj),
"value", "Ljava/lang/Object;");
jclass cls = (*env)->FindClass(env, "java/lang/Long");
jobject jlong_obj = (*env)->NewObject(env, cls,
(*env)->GetMethodID(env, cls, "<init>", "(J)V"),
(jlong) len_sig);
(*env)->SetObjectField(env, sig_len_obj, value_fid, jlong_obj);
// Release C memory
(*env)->ReleaseByteArrayElements(env, jsignature, signature_native, 0);
(*env)->ReleaseByteArrayElements(env, jmessage, message_native, JNI_ABORT);
(*env)->ReleaseByteArrayElements(env, jsecret_key, secret_key_native, JNI_ABORT);
return (rv_ == OQS_SUCCESS) ? 0 : -1;
}
/*
* Class: org_openquantumsafe_Signature
* Method: verify
* Signature: ([BJ[BJ[B)Z
*/
JNIEXPORT jboolean JNICALL Java_org_openquantumsafe_Signature_verify
(JNIEnv *env, jobject obj, jbyteArray jmessage, jlong message_len,
jbyteArray jsignature, jlong signature_len, jbyteArray jpublic_key)
{
// Convert to jbyte arrays
jbyte *message_native = (*env)->GetByteArrayElements(env, jmessage, 0);
jbyte *signature_native = (*env)->GetByteArrayElements(env, jsignature, 0);
jbyte *public_key_native = (*env)->GetByteArrayElements(env, jpublic_key, 0);
OQS_SIG *sig = (OQS_SIG *) getHandle(env, obj, "native_sig_handle_");
OQS_STATUS rv_ = OQS_SIG_verify(sig, (uint8_t*) message_native, message_len,
(uint8_t*) signature_native, signature_len,
(uint8_t*) public_key_native);
// Release C memory
(*env)->ReleaseByteArrayElements(env, jsignature, signature_native, JNI_ABORT);
(*env)->ReleaseByteArrayElements(env, jmessage, message_native, JNI_ABORT);
(*env)->ReleaseByteArrayElements(env, jpublic_key, public_key_native, JNI_ABORT);
return (rv_ == OQS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
}
/*
* Class: org_openquantumsafe_Signature
* Method: sign_with_ctx_str
* Signature: ([BLjava/lang/Long;[BJ[B)I
*/
JNIEXPORT jint JNICALL Java_org_openquantumsafe_Signature_sign_1with_1ctx_1str
(JNIEnv * env, jobject obj, jbyteArray jsignature, jobject sig_len_obj,
jbyteArray jmessage, jlong message_len, jbyteArray jctx, jlong ctx_len,
jbyteArray jsecret_key)
{
// Convert to jbyte arrays
jbyte *signature_native = (*env)->GetByteArrayElements(env, jsignature, 0);
jbyte *message_native = (*env)->GetByteArrayElements(env, jmessage, 0);
jbyte *ctx_native = (*env)->GetByteArrayElements(env, jctx, 0);
jbyte *secret_key_native = (*env)->GetByteArrayElements(env, jsecret_key, 0);
OQS_SIG *sig = (OQS_SIG *) getHandle(env, obj, "native_sig_handle_");
size_t len_sig;
OQS_STATUS rv_ = OQS_SIG_sign_with_ctx_str(sig, (uint8_t*)signature_native, &len_sig,
(uint8_t*)message_native, message_len,
(uint8_t*)ctx_native, ctx_len,
(uint8_t*)secret_key_native);
// fill java signature bytes
(*env)->SetByteArrayRegion(env, jsignature, 0, len_sig, (jbyte*) signature_native);
// fill java object signature length
jfieldID value_fid = (*env)->GetFieldID(env,
(*env)->GetObjectClass(env, sig_len_obj),
"value", "Ljava/lang/Object;");
jclass cls = (*env)->FindClass(env, "java/lang/Long");
jobject jlong_obj = (*env)->NewObject(env, cls,
(*env)->GetMethodID(env, cls, "<init>", "(J)V"),
(jlong) len_sig);
(*env)->SetObjectField(env, sig_len_obj, value_fid, jlong_obj);
// Release C memory
(*env)->ReleaseByteArrayElements(env, jsignature, signature_native, 0);
(*env)->ReleaseByteArrayElements(env, jmessage, message_native, JNI_ABORT);
(*env)->ReleaseByteArrayElements(env, jctx, ctx_native, JNI_ABORT);
(*env)->ReleaseByteArrayElements(env, jsecret_key, secret_key_native, JNI_ABORT);
return (rv_ == OQS_SUCCESS) ? 0 : -1;
}
/*
* Class: org_openquantumsafe_Signature
* Method: verify_with_ctx_str
* Signature: ([BJ[BJ[B)Z
*/
JNIEXPORT jboolean JNICALL Java_org_openquantumsafe_Signature_verify_1with_1ctx_1str
(JNIEnv *env, jobject obj, jbyteArray jmessage, jlong message_len,
jbyteArray jsignature, jlong signature_len, jbyteArray jctx, jlong ctx_len,
jbyteArray jpublic_key)
{
// Convert to jbyte arrays
jbyte *message_native = (*env)->GetByteArrayElements(env, jmessage, 0);
jbyte *signature_native = (*env)->GetByteArrayElements(env, jsignature, 0);
jbyte *ctx_native = (*env)->GetByteArrayElements(env, jctx, 0);
jbyte *public_key_native = (*env)->GetByteArrayElements(env, jpublic_key, 0);
OQS_SIG *sig = (OQS_SIG *) getHandle(env, obj, "native_sig_handle_");
OQS_STATUS rv_ = OQS_SIG_verify_with_ctx_str(sig, (uint8_t*) message_native, message_len,
(uint8_t*) signature_native, signature_len,
(uint8_t*) ctx_native, ctx_len,
(uint8_t*) public_key_native);
// Release C memory
(*env)->ReleaseByteArrayElements(env, jsignature, signature_native, JNI_ABORT);
(*env)->ReleaseByteArrayElements(env, jmessage, message_native, JNI_ABORT);
(*env)->ReleaseByteArrayElements(env, jctx, ctx_native, JNI_ABORT);
(*env)->ReleaseByteArrayElements(env, jpublic_key, public_key_native, JNI_ABORT);
return (rv_ == OQS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
}