From 9517f53712eb125cead4139a69e897c612649388 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sat, 15 Feb 2025 14:26:45 -0500 Subject: [PATCH 1/2] chore: Update lpac dependency --- libs/lpac-jni/src/main/jni/lpac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/lpac-jni/src/main/jni/lpac b/libs/lpac-jni/src/main/jni/lpac index a5a0516..90f7104 160000 --- a/libs/lpac-jni/src/main/jni/lpac +++ b/libs/lpac-jni/src/main/jni/lpac @@ -1 +1 @@ -Subproject commit a5a0516f084936e7e87cf7420fb99283fa3052ef +Subproject commit 90f7104847d4bb392b275746da20a55177a67573 From 03bfdf373c59e973d78f7549646ba2f0c91fd937 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Mon, 17 Feb 2025 17:07:11 -0500 Subject: [PATCH 2/2] lpac-jni: Expose customizable ISDR AIDs from lpac ...so that we could expose an option to the user going forward. --- .../im/angry/openeuicc/core/EuiccChannelImpl.kt | 11 ++++++++++- .../src/main/java/net/typeblog/lpac_jni/LpacJni.kt | 6 +++++- .../lpac_jni/impl/LocalProfileAssistantImpl.kt | 3 ++- libs/lpac-jni/src/main/jni/lpac-jni/lpac-jni.c | 14 ++++++++++++++ 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/core/EuiccChannelImpl.kt b/app-common/src/main/java/im/angry/openeuicc/core/EuiccChannelImpl.kt index a82cb97..3da829a 100644 --- a/app-common/src/main/java/im/angry/openeuicc/core/EuiccChannelImpl.kt +++ b/app-common/src/main/java/im/angry/openeuicc/core/EuiccChannelImpl.kt @@ -15,12 +15,21 @@ class EuiccChannelImpl( verboseLoggingFlow: Flow, ignoreTLSCertificateFlow: Flow ) : EuiccChannel { + companion object { + // TODO: This needs to go somewhere else. + val ISDR_AID = "A0000005591010FFFFFFFF8900000100".decodeHex() + } + override val slotId = port.card.physicalSlotIndex override val logicalSlotId = port.logicalSlotIndex override val portId = port.portIndex override val lpa: LocalProfileAssistant = - LocalProfileAssistantImpl(apduInterface, HttpInterfaceImpl(verboseLoggingFlow, ignoreTLSCertificateFlow)) + LocalProfileAssistantImpl( + ISDR_AID, + apduInterface, + HttpInterfaceImpl(verboseLoggingFlow, ignoreTLSCertificateFlow) + ) override val atr: ByteArray? get() = (apduInterface as? ApduInterfaceAtrProvider)?.atr diff --git a/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/LpacJni.kt b/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/LpacJni.kt index 370fcab..fa9474f 100644 --- a/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/LpacJni.kt +++ b/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/LpacJni.kt @@ -5,7 +5,11 @@ internal object LpacJni { System.loadLibrary("lpac-jni") } - external fun createContext(apduInterface: ApduInterface, httpInterface: HttpInterface): Long + external fun createContext( + isdrAid: ByteArray, + apduInterface: ApduInterface, + httpInterface: HttpInterface + ): Long external fun destroyContext(handle: Long) external fun euiccInit(handle: Long): Int diff --git a/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/LocalProfileAssistantImpl.kt b/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/LocalProfileAssistantImpl.kt index 7310acd..8aafe94 100644 --- a/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/LocalProfileAssistantImpl.kt +++ b/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/LocalProfileAssistantImpl.kt @@ -12,6 +12,7 @@ import net.typeblog.lpac_jni.LocalProfileNotification import net.typeblog.lpac_jni.ProfileDownloadCallback class LocalProfileAssistantImpl( + isdrAid: ByteArray, rawApduInterface: ApduInterface, rawHttpInterface: HttpInterface ): LocalProfileAssistant { @@ -76,7 +77,7 @@ class LocalProfileAssistantImpl( private val httpInterface = HttpInterfaceWrapper(rawHttpInterface) private var finalized = false - private var contextHandle: Long = LpacJni.createContext(apduInterface, httpInterface) + private var contextHandle: Long = LpacJni.createContext(isdrAid, apduInterface, httpInterface) init { if (LpacJni.euiccInit(contextHandle) < 0) { diff --git a/libs/lpac-jni/src/main/jni/lpac-jni/lpac-jni.c b/libs/lpac-jni/src/main/jni/lpac-jni/lpac-jni.c index 38d4f3a..6ea9d3e 100644 --- a/libs/lpac-jni/src/main/jni/lpac-jni/lpac-jni.c +++ b/libs/lpac-jni/src/main/jni/lpac-jni/lpac-jni.c @@ -37,17 +37,30 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved) { JNIEXPORT jlong JNICALL Java_net_typeblog_lpac_1jni_LpacJni_createContext(JNIEnv *env, jobject thiz, + jbyteArray isdr_aid, jobject apdu_interface, jobject http_interface) { struct lpac_jni_ctx *jni_ctx = NULL; struct euicc_ctx *ctx = NULL; + jbyte *isdr_java = NULL; + uint32_t isdr_len = 0; + uint8_t *isdr_c = NULL; ctx = calloc(1, sizeof(struct euicc_ctx)); jni_ctx = calloc(1, sizeof(struct lpac_jni_ctx)); + + isdr_java = (*env)->GetByteArrayElements(env, isdr_aid, JNI_FALSE); + isdr_len = (*env)->GetArrayLength(env, isdr_aid); + isdr_c = calloc(isdr_len, sizeof(uint8_t)); + memcpy(isdr_c, isdr_java, isdr_len); + (*env)->ReleaseByteArrayElements(env, isdr_aid, isdr_java, JNI_ABORT); + ctx->apdu.interface = &lpac_jni_apdu_interface; ctx->http.interface = &lpac_jni_http_interface; jni_ctx->apdu_interface = (*env)->NewGlobalRef(env, apdu_interface); jni_ctx->http_interface = (*env)->NewGlobalRef(env, http_interface); + ctx->aid = (const uint8_t *) isdr_c; + ctx->aid_len = isdr_len; ctx->userdata = (void *) jni_ctx; return (jlong) ctx; } @@ -60,6 +73,7 @@ Java_net_typeblog_lpac_1jni_LpacJni_destroyContext(JNIEnv *env, jobject thiz, jl (*env)->DeleteGlobalRef(env, jni_ctx->apdu_interface); (*env)->DeleteGlobalRef(env, jni_ctx->http_interface); free(jni_ctx); + free((void *) ctx->aid); free(ctx); }