in csrc/ec_utils.cpp [54:162]
JNIEXPORT jint JNICALL Java_com_amazon_corretto_crypto_provider_EcUtils_curveNameToInfo(
JNIEnv *pEnv,
jclass,
jstring curveName,
jintArray mArr,
jbyteArray pArr,
jbyteArray aArr,
jbyteArray bArr,
jbyteArray cofactorArr,
jbyteArray gxArr,
jbyteArray gyArr,
jbyteArray orderArr)
{
try {
raii_env env(pEnv);
if (!curveName) {
throw_java_ex(EX_NPE, "Curve name must not be null");
}
jni_string jniCurve(env, curveName);
int nid = OBJ_txt2nid(jniCurve.native_str);
if (nid == NID_undef) {
ERR_clear_error();
return 0;
}
EC_GROUP_auto group(nid);
if (unlikely(!group.group)) {
unsigned long errCode = drainOpensslErrors();
if (errCode == ERR_PACK(ERR_LIB_EC, EC_F_EC_GROUP_NEW_BY_CURVE_NAME, EC_R_UNKNOWN_GROUP)) {
throw_java_ex(EX_ILLEGAL_ARGUMENT, "Unknown curve");
} else {
throw_java_ex(EX_RUNTIME_CRYPTO,
formatOpensslError(errCode, "Unable to create group"));
}
}
BigNumObj pBN;
BigNumObj aBN;
BigNumObj bBN;
BigNumObj cfBN;
BigNumObj gxBN;
BigNumObj gyBN;
BigNumObj orderBN;
const EC_POINT* generator = NULL;
const EC_METHOD * method = NULL;
int fieldNid = 0;
int m = 0;
// Figure out which type of group this is
method = EC_GROUP_method_of(group);
if (!method) {
throw_openssl("Unable to acquire method");
}
fieldNid = EC_METHOD_get_field_type(method);
if (EC_GROUP_get_cofactor(group, cfBN, NULL) != 1) {
throw_openssl("Unable to get cofactor");
}
cfBN.toJavaArray(env, cofactorArr);
generator = EC_GROUP_get0_generator(group);
if (!generator) {
throw_openssl("Unable to get generator");
}
switch (fieldNid) {
case NID_X9_62_prime_field:
if (EC_GROUP_get_curve_GFp(group, pBN, aBN, bBN, NULL) != 1) {
throw_openssl("Unable to get group information");
}
if (EC_POINT_get_affine_coordinates_GFp(group, generator, gxBN, gyBN, NULL) != 1) {
throw_openssl("Unable to get generator coordinates");
}
break;
case NID_X9_62_characteristic_two_field:
if (EC_GROUP_get_curve_GF2m(group, pBN, aBN, bBN, NULL) != 1) {
throw_openssl("Unable to get group information");
}
if (EC_POINT_get_affine_coordinates_GF2m(group, generator, gxBN, gyBN, NULL) != 1) {
throw_openssl("Unable to get generator coordinates");
}
m = EC_GROUP_get_degree(group);
env->SetIntArrayRegion(mArr, 0, 1, &m);
env.rethrow_java_exception();
break;
}
gxBN.toJavaArray(env, gxArr);
gyBN.toJavaArray(env, gyArr);
pBN.toJavaArray(env, pArr);
aBN.toJavaArray(env, aArr);
bBN.toJavaArray(env, bArr);
if (EC_GROUP_get_order(group, orderBN, NULL) != 1) {
throw_openssl("Unable to get group order");
}
orderBN.toJavaArray(env, orderArr);
return nid;
} catch (java_ex &ex) {
ex.throw_to_java(pEnv);
return 0;
}
}