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