1 #if HAVE_CONFIG_H
2 # include "config.h"
3 #endif
4 
5 #include "beecrypt/rsakp.h"
6 
7 #if JAVAGLUE
8 
9 #if HAVE_STDLIB_H
10 # include <stdlib.h>
11 #endif
12 #if HAVE_MALLOC_H
13 # include <malloc.h>
14 #endif
15 
16 #include "beecrypt/java/beecrypt_tools.h"
17 #include "beecrypt/java/beecrypt_provider_RSAKeyPairGenerator.h"
18 
19 /* need an adapter from SecureRandom to randomGenerator */
20 
Java_beecrypt_provider_RSAKeyPairGenerator_generate(JNIEnv * env,jobject obj)21 void JNICALL Java_beecrypt_provider_RSAKeyPairGenerator_generate(JNIEnv* env, jobject obj)
22 {
23 	jclass cls = (*env)->GetObjectClass(env, obj);
24 	jfieldID sid = (*env)->GetFieldID(env, cls, "_size", "I");
25 	jfieldID fid;
26 	if (sid)
27 	{
28 		randomGeneratorContext rngc;
29 		rsakp pair;
30 		jint keybits = (*env)->GetIntField(env, obj, sid);
31 
32 		randomGeneratorContextInit(&rngc, randomGeneratorDefault());
33 
34 		rsakpInit(&pair);
35 
36 		fid = (*env)->GetFieldID(env, cls, "_e", "[B");
37 		if (fid)
38 		{
39 			mpnsetbigint(&pair.e, env, (*env)->GetObjectField(env, obj, fid));
40 		}
41 
42 		rsakpMake(&pair, &rngc, (size_t) keybits);
43 
44 		if ((fid = (*env)->GetFieldID(env, cls, "_n", "[B")))
45 			(*env)->SetObjectField(env, obj, fid, mp_to_bigint(env, pair.n.size, pair.n.modl));
46 
47 		if ((fid = (*env)->GetFieldID(env, cls, "_e", "[B")))
48 			(*env)->SetObjectField(env, obj, fid, mp_to_bigint(env, pair.e.size, pair.e.data));
49 
50 		if ((fid = (*env)->GetFieldID(env, cls, "_d", "[B")))
51 			(*env)->SetObjectField(env, obj, fid, mp_to_bigint(env, pair.d.size, pair.d.data));
52 
53 		if ((fid = (*env)->GetFieldID(env, cls, "_p", "[B")))
54 			(*env)->SetObjectField(env, obj, fid, mp_to_bigint(env, pair.p.size, pair.p.modl));
55 
56 		if ((fid = (*env)->GetFieldID(env, cls, "_q", "[B")))
57 			(*env)->SetObjectField(env, obj, fid, mp_to_bigint(env, pair.q.size, pair.q.modl));
58 
59 		if ((fid = (*env)->GetFieldID(env, cls, "_dp", "[B")))
60 			(*env)->SetObjectField(env, obj, fid, mp_to_bigint(env, pair.dp.size, pair.dp.data));
61 
62 		if ((fid = (*env)->GetFieldID(env, cls, "_dq", "[B")))
63 			(*env)->SetObjectField(env, obj, fid, mp_to_bigint(env, pair.dq.size, pair.dq.data));
64 
65 		if ((fid = (*env)->GetFieldID(env, cls, "_qi", "[B")))
66 			(*env)->SetObjectField(env, obj, fid, mp_to_bigint(env, pair.qi.size, pair.qi.data));
67 
68 		rsakpFree(&pair);
69 		randomGeneratorContextFree(&rngc);
70 	}
71 }
72 
73 #endif
74