From 4fa8642264b699acdcd3c3585343b201d4a0dc73 Mon Sep 17 00:00:00 2001 From: Chris Conlon Date: Thu, 8 May 2025 14:32:35 -0600 Subject: [PATCH] JNI: get ASN algo enum values dynamically in static class block, more flexible if native enum values change --- jni/include/com_wolfssl_wolfcrypt_Asn.h | 50 +++++++++++++++---- jni/jni_asn.c | 30 +++++++++++ .../wolfssl/provider/jce/WolfSSLKeyStore.java | 18 +++---- src/main/java/com/wolfssl/wolfcrypt/Asn.java | 34 ++++++++++--- 4 files changed, 105 insertions(+), 27 deletions(-) diff --git a/jni/include/com_wolfssl_wolfcrypt_Asn.h b/jni/include/com_wolfssl_wolfcrypt_Asn.h index 17060cd..4867328 100644 --- a/jni/include/com_wolfssl_wolfcrypt_Asn.h +++ b/jni/include/com_wolfssl_wolfcrypt_Asn.h @@ -9,16 +9,46 @@ extern "C" { #endif #undef com_wolfssl_wolfcrypt_Asn_MAX_ENCODED_SIG_SIZE #define com_wolfssl_wolfcrypt_Asn_MAX_ENCODED_SIG_SIZE 512L -#undef com_wolfssl_wolfcrypt_Asn_DSAk -#define com_wolfssl_wolfcrypt_Asn_DSAk 515L -#undef com_wolfssl_wolfcrypt_Asn_RSAk -#define com_wolfssl_wolfcrypt_Asn_RSAk 645L -#undef com_wolfssl_wolfcrypt_Asn_RSAPSSk -#define com_wolfssl_wolfcrypt_Asn_RSAPSSk 654L -#undef com_wolfssl_wolfcrypt_Asn_RSAESOAEPk -#define com_wolfssl_wolfcrypt_Asn_RSAESOAEPk 651L -#undef com_wolfssl_wolfcrypt_Asn_ECDSAk -#define com_wolfssl_wolfcrypt_Asn_ECDSAk 518L +/* + * Class: com_wolfssl_wolfcrypt_Asn + * Method: getDSAk + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Asn_getDSAk + (JNIEnv *, jclass); + +/* + * Class: com_wolfssl_wolfcrypt_Asn + * Method: getRSAk + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Asn_getRSAk + (JNIEnv *, jclass); + +/* + * Class: com_wolfssl_wolfcrypt_Asn + * Method: getRSAPSSk + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Asn_getRSAPSSk + (JNIEnv *, jclass); + +/* + * Class: com_wolfssl_wolfcrypt_Asn + * Method: getRSAESOAEPk + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Asn_getRSAESOAEPk + (JNIEnv *, jclass); + +/* + * Class: com_wolfssl_wolfcrypt_Asn + * Method: getECDSAk + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Asn_getECDSAk + (JNIEnv *, jclass); + /* * Class: com_wolfssl_wolfcrypt_Asn * Method: encodeSignature diff --git a/jni/jni_asn.c b/jni/jni_asn.c index 1cf7511..c532760 100644 --- a/jni/jni_asn.c +++ b/jni/jni_asn.c @@ -35,6 +35,36 @@ /* #define WOLFCRYPT_JNI_DEBUG_ON */ #include +JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Asn_getDSAk + (JNIEnv* env, jclass class) +{ + return DSAk; +} + +JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Asn_getRSAk + (JNIEnv* env, jclass class) +{ + return RSAk; +} + +JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Asn_getRSAPSSk + (JNIEnv* env, jclass class) +{ + return RSAPSSk; +} + +JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Asn_getRSAESOAEPk + (JNIEnv* env, jclass class) +{ + return RSAESOAEPk; +} + +JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_Asn_getECDSAk + (JNIEnv* env, jclass class) +{ + return ECDSAk; +} + JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_Asn_encodeSignature__Ljava_nio_ByteBuffer_2Ljava_nio_ByteBuffer_2JI( JNIEnv* env, jclass class, jobject encoded_object, jobject hash_object, jlong hashSize, jint hashOID) diff --git a/src/main/java/com/wolfssl/provider/jce/WolfSSLKeyStore.java b/src/main/java/com/wolfssl/provider/jce/WolfSSLKeyStore.java index e3d0d8e..b317833 100644 --- a/src/main/java/com/wolfssl/provider/jce/WolfSSLKeyStore.java +++ b/src/main/java/com/wolfssl/provider/jce/WolfSSLKeyStore.java @@ -661,16 +661,14 @@ public class WolfSSLKeyStore extends KeyStoreSpi { "unprotected key"); } - switch (algoId) { - case Asn.RSAk: - keyFact = KeyFactory.getInstance("RSA"); - break; - case Asn.ECDSAk: - keyFact = KeyFactory.getInstance("EC"); - break; - default: - throw new NoSuchAlgorithmException( - "Only RSA and EC private key encoding supported"); + if (algoId == Asn.RSAk) { + keyFact = KeyFactory.getInstance("RSA"); + } else if (algoId == Asn.ECDSAk) { + keyFact = KeyFactory.getInstance("EC"); + } else { + throw new NoSuchAlgorithmException( + "Only RSA and EC private key encoding " + + "supported: " + algoId); } try { diff --git a/src/main/java/com/wolfssl/wolfcrypt/Asn.java b/src/main/java/com/wolfssl/wolfcrypt/Asn.java index 2ae20fb..c2a5b04 100644 --- a/src/main/java/com/wolfssl/wolfcrypt/Asn.java +++ b/src/main/java/com/wolfssl/wolfcrypt/Asn.java @@ -36,18 +36,38 @@ public class Asn extends WolfObject { /* Key Sum values, from asn.h Key_Sum enum */ /** DSA key value, from asn.h Key_Sum enum */ - public static final int DSAk = 515; + public static final int DSAk; /** RSA key value, from asn.h Key_Sum enum */ - public static final int RSAk = 645; + public static final int RSAk; /** RSA-PSS key value, from asn.h Key_Sum enum */ - public static final int RSAPSSk = 654; + public static final int RSAPSSk; /** RSA-OAEP key value, from asn.h Key_Sum enum */ - public static final int RSAESOAEPk = 651; + public static final int RSAESOAEPk; /** ECDSA key value, from asn.h Key_Sum enum */ - public static final int ECDSAk = 518; + public static final int ECDSAk; - /** Default Asn constructor */ - public Asn() { } + static { + DSAk = getDSAk(); + RSAk = getRSAk(); + RSAPSSk = getRSAPSSk(); + RSAESOAEPk = getRSAESOAEPk(); + ECDSAk = getECDSAk(); + } + + /** Return value of native DSAk enum */ + private static native int getDSAk(); + + /** Return value of native RSAk enum */ + private static native int getRSAk(); + + /** Return value of native RSAPSSk enum */ + private static native int getRSAPSSk(); + + /** Return value of native RSAESOAEPk enum */ + private static native int getRSAESOAEPk(); + + /** Return value of native ECDSAk enum */ + private static native int getECDSAk(); /** ASN.1 encode message digest, before it is signed *