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:
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)
|
// 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)
|
||||||
|
|
|
@ -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");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue