Handle APDU responses with stripped status code better

This is still pretty hacky. Ideally we should return structured data (at
least separate the status code from the payload, or better, just do
everything in binary) from ApduTransmitter / ApduChannel.
master
Peter Cai 1 year ago
parent cbe3fd1458
commit 936444f162

@ -39,6 +39,10 @@ class ApduTransmitter(private val apduChannel: ApduChannel) {
)
}
if (apduResponse.length < 4) {
throw RuntimeException("APDU response should at least contain a status code")
}
// Last 2 bytes are the status code (should be 0x9000)
// TODO: Do this properly
return apduResponse.substring(0, apduResponse.length - 4)
@ -57,6 +61,10 @@ class ApduTransmitter(private val apduChannel: ApduChannel) {
)
}
if (apduResponse.length < 4) {
throw RuntimeException("APDU response should at least contain a status code")
}
// Last 2 bytes are the status code (should be 0x9000)
// TODO: Do this properly
return apduResponse.substring(0, apduResponse.length - 4)

@ -98,10 +98,8 @@ public class InstallationPhaseWorker {
String profileInstallationResult = apduTransmitter.transmitApdus(sbpp);
if (StringUtils.isNotBlank(profileInstallationResult) && profileInstallationResult.length() > 4) {
if (StringUtils.isNotBlank(profileInstallationResult)) {
checkProfileInstallationResult(profileInstallationResult);
} else {
throw new RuntimeException("Unexpected response on loadBoundProfilePackage");
}
}
@ -112,12 +110,8 @@ public class InstallationPhaseWorker {
String profileInstallationResult = apduTransmitter.transmitApdus(sbpp);
if (profileInstallationResult.compareTo("9000") != 0) {
if (StringUtils.isNotBlank(profileInstallationResult) && profileInstallationResult.length() > 4) {
checkProfileInstallationResult(profileInstallationResult);
} else {
throw new RuntimeException("Unexpected response on loadStoreMetadata");
}
if (StringUtils.isNotBlank(profileInstallationResult)) {
checkProfileInstallationResult(profileInstallationResult);
}
}
@ -128,12 +122,8 @@ public class InstallationPhaseWorker {
String profileInstallationResult = apduTransmitter.transmitApdus(sbpp);
if (profileInstallationResult.compareTo("9000") != 0) {
if (StringUtils.isNotBlank(profileInstallationResult) && profileInstallationResult.length() > 4) {
checkProfileInstallationResult(profileInstallationResult);
} else {
throw new RuntimeException("Unexpected response on loadConfigureIsdpa");
}
if (StringUtils.isNotBlank(profileInstallationResult)) {
checkProfileInstallationResult(profileInstallationResult);
}
}
@ -144,12 +134,8 @@ public class InstallationPhaseWorker {
String profileInstallationResult = apduTransmitter.transmitApdus(sbpp);
if (profileInstallationResult.compareTo("9000") != 0) {
if (StringUtils.isNotBlank(profileInstallationResult) && profileInstallationResult.length() > 4) {
checkProfileInstallationResult(profileInstallationResult);
} else {
throw new RuntimeException("Unexpected response on loadInitialiseSecureChannel");
}
if (StringUtils.isNotBlank(profileInstallationResult)) {
checkProfileInstallationResult(profileInstallationResult);
}
}
@ -237,13 +223,8 @@ public class InstallationPhaseWorker {
"loadReplaceSessionsKeys...");
String profileInstallationResult = apduTransmitter.transmitApdus(sbpp);
if (profileInstallationResult.compareTo("9000") != 0) {
if (StringUtils.isNotBlank(profileInstallationResult) && profileInstallationResult.length() > 4) {
checkProfileInstallationResult(profileInstallationResult);
} else {
throw new RuntimeException("Unexpected response on loadReplaceSessionsKeys");
}
if (StringUtils.isNotBlank(profileInstallationResult)) {
checkProfileInstallationResult(profileInstallationResult);
}
}
}

Loading…
Cancel
Save