JNIEXPORT void JNICALL Java_com_amazon_corretto_crypto_provider_RsaGen_generate()

in csrc/rsa_gen.cpp [15:67]


JNIEXPORT void JNICALL Java_com_amazon_corretto_crypto_provider_RsaGen_generate(
        JNIEnv *pEnv,
        jclass,
        jint bits,
        jboolean checkConsistency,
        jbyteArray pubExp,
        jbyteArray modulusOut,
        jbyteArray privExpOut,
        jbyteArray primePOut,
        jbyteArray primeQOut,
        jbyteArray dmPOut,
        jbyteArray dmQOut,
        jbyteArray coefOut)
{
    RSA_auto r;

    try {
        raii_env env(pEnv);

        BigNumObj bne;
        jarr2bn(env, pubExp, bne);

        if (1 != RSA_generate_key_ex(r, bits, bne, NULL)) {
            throw_openssl("Unable to generate key");
        }
        
        if (checkConsistency && RSA_check_key(r) != 1) {
            throw_openssl("Key failed consistency check");
        }

        const BIGNUM *n;
        const BIGNUM *e;
        const BIGNUM *d;
        const BIGNUM *p;
        const BIGNUM *q;
        const BIGNUM *dmp1;
        const BIGNUM *dmq1;
        const BIGNUM *iqmp;
        RSA_get0_key(r, &n, &e, &d);
        RSA_get0_factors(r, &p, &q);
        RSA_get0_crt_params(r, &dmp1, &dmq1, &iqmp);

        bn2jarr(env, modulusOut, n);
        bn2jarr(env, privExpOut, d);
        bn2jarr(env, primePOut, p);
        bn2jarr(env, primeQOut, q);
        bn2jarr(env, dmPOut, dmp1);
        bn2jarr(env, dmQOut, dmq1);
        bn2jarr(env, coefOut, iqmp);
    } catch (java_ex &ex) {
        ex.throw_to_java(pEnv);
    }
}