Java 我们能在没有帮助的情况下打开渠道并控制嵌入式SE的力量吗?
我们现在正在安卓N上开发NXP NQ220(嵌入SE,称为eSE)支付卡。平台为MTK。现在,我们可以使用OMA(使用org.simalliance.openmobileapi.jar)与eSE交互。它按预期工作 我想知道是否有任何方法可以在没有帮助的情况下打开会话中的频道?此外,在某些情况下,是否有方法控制eSE的电源(通电和断电)并重置eSE? 我的调查如下:Java 我们能在没有帮助的情况下打开渠道并控制嵌入式SE的力量吗?,java,android,security,nfc,contactless-smartcard,Java,Android,Security,Nfc,Contactless Smartcard,我们现在正在安卓N上开发NXP NQ220(嵌入SE,称为eSE)支付卡。平台为MTK。现在,我们可以使用OMA(使用org.simalliance.openmobileapi.jar)与eSE交互。它按预期工作 我想知道是否有任何方法可以在没有帮助的情况下打开会话中的频道?此外,在某些情况下,是否有方法控制eSE的电源(通电和断电)并重置eSE? 我的调查如下: 关于没有援助的开放渠道,我在第16页找到了以下句子 (h) 方法:通道openLogicalChannel(字节[]辅助,字节P2)
使用SE打开一个逻辑通道,选择由>给定帮助表示的小程序如果AID为null,这意味着在该频道上不选择小程序,则使用默认小程序。由SE选择使用哪个>逻辑通道。 但是,如果我们在openLogicalChannel(字节[]aid)中将aid设置为null,将显示以下异常。怎么了?默认小程序或eSE是否有问题
01-30 01:06:39.941 V/SmartcardService( 2587): OpenLogicalChannel Exception: Access Control Enforcer: no APDU access allowed!
01-30 01:06:39.947 E/SeControlClient( 3239): Error occured:
01-30 01:06:39.947 E/SeControlClient( 3239): java.lang.SecurityException: Access Control Enforcer: no APDU access allowed!
01-30 01:06:39.947 E/SeControlClient( 3239): at org.simalliance.openmobileapi.SEService.checkForException(SEService.java:255)
01-30 01:06:39.947 E/SeControlClient( 3239): at org.simalliance.openmobileapi.Session.openLogicalChannel(Session.java:295)
private INxpNfcAdapterExtras getNxpNfcAdapterExtras() {
if (mNfcAdapter != null) {
try {
INxpNfcAdapter nxpNfcAdapter =
mNfcAdapter.getService().getNxpNfcAdapterInterface();
return nxpNfcAdapter.getNxpNfcAdapterExtrasInterface();
} catch (Exception e) {
Log.e(LOGTAG, "Exception occured:", e);
}
} else {
Log.e(LOGTAG, "Please initialize NfcAdapter first.");
}
return null;
}
public boolean reset(String pkg) throws RemoteException {
NfcService.this.enforceNfceeAdminPerm(pkg);
Bundle result;
boolean stat = false;
try {
stat = _nfcEeReset();
result = writeNoException();
} catch (IOException e) {
result = writeEeException(EE_ERROR_IO, e.getMessage());
}
Log.d(TAG,"reset" + stat);
return stat;
}
检查权限方法:
public void enforceNfceeAdminPerm(String pkg) {
if (pkg == null) {
throw new SecurityException("caller must pass a package name");
}
NfcPermissions.enforceUserPermissions(mContext);
if (!mNfceeAccessControl.check(Binder.getCallingUid(), pkg)) {
throw new SecurityException(NfceeAccessControl.NFCEE_ACCESS_PATH +
" denies NFCEE access to " + pkg);
}
if (UserHandle.getCallingUserId() != UserHandle.USER_OWNER) {
throw new SecurityException("only the owner is allowed to call SE APIs");
}
}
要与设备所有者一起执行应用程序,您可以在此处遵循我的anwser:
public boolean reset(String pkg) throws RemoteException {
NfcService.this.enforceNfceeAdminPerm(pkg);
Bundle result;
boolean stat = false;
try {
stat = _nfcEeReset();
result = writeNoException();
} catch (IOException e) {
result = writeEeException(EE_ERROR_IO, e.getMessage());
}
Log.d(TAG,"reset" + stat);
return stat;
}
检查权限方法:
public void enforceNfceeAdminPerm(String pkg) {
if (pkg == null) {
throw new SecurityException("caller must pass a package name");
}
NfcPermissions.enforceUserPermissions(mContext);
if (!mNfceeAccessControl.check(Binder.getCallingUid(), pkg)) {
throw new SecurityException(NfceeAccessControl.NFCEE_ACCESS_PATH +
" denies NFCEE access to " + pkg);
}
if (UserHandle.getCallingUserId() != UserHandle.USER_OWNER) {
throw new SecurityException("only the owner is allowed to call SE APIs");
}
}
要与设备所有者一起执行应用程序,您可以在此处遵循我的anwser:
我找到了解决这个问题的另一种方法。它使用了NXP自己的类 1.我仍然不知道当我们打开通道使用默认小程序(没有帮助)时为什么会发生异常但是,使用NxPNFCAdapterExtrassService中的方法,我们可以与eSE建立连接。 2.关于第二个问题代码是正确的,但如何使用INxpNfcAdapterExtras.reset()的方法是错误的。只有在使用eSE执行某些操作时,此方法才会返回true。如发送和执行APDU命令。因此,当您要断开与eSE的连接时,可以使用此方法
3.关于第三个问题,我不知道openUicc()/closeUicc()方法是否可以控制eSE电源。但是,这两种方法的效果似乎与预期的一样。我找到了另一种方法来解决这个问题。它使用了NXP自己的类 1.我仍然不知道当我们打开通道使用默认小程序(没有帮助)时为什么会发生异常但是,使用NxPNFCAdapterExtrassService中的方法,我们可以与eSE建立连接。 2.关于第二个问题代码是正确的,但如何使用INxpNfcAdapterExtras.reset()的方法是错误的。只有在使用eSE执行某些操作时,此方法才会返回true。如发送和执行APDU命令。因此,当您要断开与eSE的连接时,可以使用此方法
3.关于第三个问题,我不知道openUicc()/closeUicc()方法是否可以控制eSE电源。但是,这两种方法似乎都能按预期工作。关于第二点,我在代码中添加了一些日志,发现reset()中的以下代码总是返回false。我认为这可能与硬件或NFC驱动程序有关。你知道吗?stat=_nfcEeReset();关于第三点,您的理解是正确的,我们只想启用和禁用eSE。除了启用和禁用NFC之外,还有其他方法可以解决此问题吗。设备所有者应用程序是否仍存在“返回错误”?3.这是我唯一知道的方法。对我愿意。3.我找到了以下文件。在2.3章中,我找到了“上电和断电复位”。但是我找不到如何使用它。也许我需要NXP的帮助@关于第二点,我在代码中添加了一些日志,发现reset()中的以下代码总是返回false。我认为这可能与硬件或NFC驱动程序有关。你知道吗?stat=_nfcEeReset();关于第三点,您的理解是正确的,我们只想启用和禁用eSE。除了启用和禁用NFC之外,还有其他方法可以解决此问题吗。设备所有者应用程序是否仍存在“返回错误”?3.这是我唯一知道的方法。对我愿意。3.我找到了以下文件。在2.3章中,我找到了“上电和断电复位”。但是我找不到如何使用它。也许我需要NXP的帮助@Sojoy它有用吗?对我没用。