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.
This commit is contained in:
Peter Cai 2022-05-19 22:38:57 -04:00
parent cbe3fd1458
commit 936444f162
2 changed files with 17 additions and 28 deletions

View File

@ -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) // Last 2 bytes are the status code (should be 0x9000)
// TODO: Do this properly // TODO: Do this properly
return apduResponse.substring(0, apduResponse.length - 4) 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) // Last 2 bytes are the status code (should be 0x9000)
// TODO: Do this properly // TODO: Do this properly
return apduResponse.substring(0, apduResponse.length - 4) return apduResponse.substring(0, apduResponse.length - 4)

View File

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